Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ for common QoS profile definitions, and
```C++
#include <vortex/utils/types.hpp>
```
for common structs like 6DOF `Eta` and `Nu`.
for common structs like 6DOF `PoseEuler`, `Pose` and `Twist`.
1 change: 1 addition & 0 deletions cpp_test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ add_executable(
${TEST_BINARY_NAME}
test_math.cpp
test_types.cpp
test_concepts.cpp
test_ros_conversions.cpp
)

Expand Down
107 changes: 107 additions & 0 deletions cpp_test/test_concepts.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
#include <string>
#include <type_traits>

#include <eigen3/Eigen/Core>

#include "vortex/utils/concepts.hpp"

struct HasPositionAndEuler {
double x, y, z;
double roll, pitch, yaw;
};

struct HasPositionAndEulerExtra {
double x, y, z;
double roll, pitch, yaw;
int extra;
};

struct HasPositionAndQuaternion {
double x, y, z;
double qw, qx, qy, qz;
};

struct PositionOnly {
double x, y, z;
};

struct EulerOnly {
double roll, pitch, yaw;
};

struct IncompleteEulerMembers {
double x, y, z;
double roll, pitch; // missing yaw
};

struct IncompleteQuaternionMembers {
double x, y, z;
double qx, qy, qz; // missing qw
};

struct WrongEulerMemberType {
double x, y, z;
std::string roll; // wrong type
double pitch, yaw;
};

struct HasEulerAndQuaternionMembers {
double x, y, z;
double roll, pitch, yaw;
double qw, qx, qy, qz;
};

// ---------- PositionLike ----------

static_assert(vortex::utils::concepts::PositionLike<HasPositionAndEuler>);
static_assert(vortex::utils::concepts::PositionLike<HasPositionAndQuaternion>);
static_assert(vortex::utils::concepts::PositionLike<PositionOnly>);
static_assert(!vortex::utils::concepts::PositionLike<EulerOnly>);

// ---------- EulerLike ----------

static_assert(vortex::utils::concepts::EulerLike<HasPositionAndEuler>);
static_assert(vortex::utils::concepts::EulerLike<HasPositionAndEulerExtra>);
static_assert(!vortex::utils::concepts::EulerLike<HasPositionAndQuaternion>);
static_assert(!vortex::utils::concepts::EulerLike<IncompleteEulerMembers>);
static_assert(!vortex::utils::concepts::EulerLike<WrongEulerMemberType>);

// ---------- QuaternionLike ----------

static_assert(
vortex::utils::concepts::QuaternionLike<HasPositionAndQuaternion>);
static_assert(!vortex::utils::concepts::QuaternionLike<HasPositionAndEuler>);
static_assert(
!vortex::utils::concepts::QuaternionLike<IncompleteQuaternionMembers>);

// ---------- Pose Concepts ----------

static_assert(vortex::utils::concepts::EulerPoseLike<HasPositionAndEuler>);
static_assert(vortex::utils::concepts::EulerPoseLike<HasPositionAndEulerExtra>);
static_assert(
!vortex::utils::concepts::EulerPoseLike<HasPositionAndQuaternion>);

static_assert(vortex::utils::concepts::QuatPoseLike<HasPositionAndQuaternion>);
static_assert(!vortex::utils::concepts::QuatPoseLike<HasPositionAndEuler>);

static_assert(!vortex::utils::concepts::PoseLike<HasEulerAndQuaternionMembers>,
"Types exposing both Euler and Quaternion representations must "
"be rejected");

static_assert(vortex::utils::concepts::PoseLike<HasPositionAndEuler>);
static_assert(vortex::utils::concepts::PoseLike<HasPositionAndQuaternion>);
static_assert(!vortex::utils::concepts::PoseLike<IncompleteEulerMembers>);
static_assert(!vortex::utils::concepts::PoseLike<WrongEulerMemberType>);

// ---------- Eigen Tests ----------

static_assert(
!vortex::utils::concepts::EulerPoseLike<Eigen::Matrix<double, 6, 1>>,
"Eigen::Vector6d should NOT satisfy EulerPoseLike without adapters");

static_assert(
!vortex::utils::concepts::QuatPoseLike<Eigen::Matrix<double, 7, 1>>,
"Eigen::Vector7d should NOT satisfy QuatPoseLike");

static_assert(!vortex::utils::concepts::PositionLike<Eigen::Vector3d>,
"Eigen::Vector3d must NOT satisfy PositionLike");
Loading