diff --git a/gpmp2/geometry/DynamicLieTraits.h b/gpmp2/geometry/DynamicLieTraits.h index eaa1eb0..11366c1 100644 --- a/gpmp2/geometry/DynamicLieTraits.h +++ b/gpmp2/geometry/DynamicLieTraits.h @@ -74,6 +74,11 @@ struct DynamicLieGroupTraits { ChartJacobian H = {}) { return m.inverse(H); } + + static Eigen::MatrixXd AdjointMap(const Class& m) { + return Class::AdjointMap(m); + } + /// @} }; diff --git a/gpmp2/geometry/DynamicVector.h b/gpmp2/geometry/DynamicVector.h index 39c46e0..6714f28 100644 --- a/gpmp2/geometry/DynamicVector.h +++ b/gpmp2/geometry/DynamicVector.h @@ -24,14 +24,14 @@ namespace gpmp2 { */ class GPMP2_EXPORT DynamicVector { private: - size_t dim_; - Eigen::VectorXd vector_; + size_t dim_{0}; + Eigen::VectorXd vector_{}; public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW /// Default constructor - DynamicVector() {} + DynamicVector() : dim_(0), vector_() {} // eigen constructor // non-explicit conversion enabled @@ -89,6 +89,7 @@ class GPMP2_EXPORT DynamicVector { // equals bool equals(const DynamicVector& m2, double tol) const { + if(dim_ != m2.dim_) return false; return gtsam::equal_with_abs_tol(this->vector_, m2.vector_, tol); } diff --git a/gpmp2/geometry/ProductDynamicLieGroup.h b/gpmp2/geometry/ProductDynamicLieGroup.h index 42a320f..ce07dc9 100644 --- a/gpmp2/geometry/ProductDynamicLieGroup.h +++ b/gpmp2/geometry/ProductDynamicLieGroup.h @@ -20,8 +20,8 @@ namespace gpmp2 { template class ProductDynamicLieGroup : public std::pair { private: - GTSAM_CONCEPT_ASSERT((gtsam::IsLieGroup)); - GTSAM_CONCEPT_ASSERT((gtsam::IsLieGroup)); + static_assert(gtsam::IsLieGroup::value, "G must satisfy the LieGroup concept"); + static_assert(gtsam::IsLieGroup::value, "H must satisfy the LieGroup concept"); typedef std::pair Base; protected: @@ -241,6 +241,19 @@ class ProductDynamicLieGroup : public std::pair { } } + static Eigen::MatrixXd AdjointMap(const ProductDynamicLieGroup& m) { + const size_t d1 = m.dim1(); + const size_t d2 = m.dim2(); + const size_t d = d1 + d2; + + Eigen::MatrixXd Adj = Eigen::MatrixXd::Zero(d, d); + + Adj.topLeftCorner(d1, d1) = gtsam::traits::AdjointMap(m.first); + Adj.bottomRightCorner(d2, d2) = gtsam::traits::AdjointMap(m.second); + + return Adj; + } + ProductDynamicLieGroup expmap(const TangentVector& v) const { return compose(ProductDynamicLieGroup::Expmap(v)); } diff --git a/gpmp2/geometry/tests/testDynamicVector.cpp b/gpmp2/geometry/tests/testDynamicVector.cpp index 037bb8b..4b8213e 100644 --- a/gpmp2/geometry/tests/testDynamicVector.cpp +++ b/gpmp2/geometry/tests/testDynamicVector.cpp @@ -25,10 +25,11 @@ GTSAM_CONCEPT_LIE_INST(DynamicVector) /* ************************************************************************** */ TEST(DynamicVector, Concept) { - GTSAM_CONCEPT_ASSERT((IsGroup)); - GTSAM_CONCEPT_ASSERT((IsManifold)); - GTSAM_CONCEPT_ASSERT((IsLieGroup)); - GTSAM_CONCEPT_ASSERT((IsVectorSpace)); + static_assert(IsManifold::value, "DynamicVector must satisfy the Manifold concept"); + static_assert(IsVectorSpace::value, "DynamicVector must satisfy the VectorSpace concept"); + static_assert(IsLieGroup::value, "DynamicVector must satisfy the LieGroup concept"); + // TODO : IsGroup::value does not exist in GTSAM + // static_assert(IsGroup::value, "DynamicVector must satisfy the Group concept"); } /* ************************************************************************** */ diff --git a/gpmp2/geometry/tests/testPose2Vector.cpp b/gpmp2/geometry/tests/testPose2Vector.cpp index f3ecb02..5eff9a2 100644 --- a/gpmp2/geometry/tests/testPose2Vector.cpp +++ b/gpmp2/geometry/tests/testPose2Vector.cpp @@ -22,9 +22,10 @@ using namespace gpmp2; /* ************************************************************************** */ TEST(Pose2Vector, Lie) { - GTSAM_CONCEPT_ASSERT((IsGroup)); - GTSAM_CONCEPT_ASSERT((IsManifold)); - GTSAM_CONCEPT_ASSERT((IsLieGroup)); + // TODO : IsGroup::value does not exist in GTSAM + // static_assert(IsGroup::value, "DynamicVector must satisfy the Group concept"); + static_assert(IsManifold::value, "Pose2Vector must satisfy the Manifold concept"); + static_assert(IsLieGroup::value, "DynamicVector must satisfy the LieGroup concept"); } /* ************************************************************************** */ diff --git a/gpmp2/geometry/tests/testProductDynamicLieGroup.cpp b/gpmp2/geometry/tests/testProductDynamicLieGroup.cpp index 447837e..2935707 100644 --- a/gpmp2/geometry/tests/testProductDynamicLieGroup.cpp +++ b/gpmp2/geometry/tests/testProductDynamicLieGroup.cpp @@ -47,9 +47,10 @@ struct traits : internal::DynamicLieGroupTraits { //****************************************************************************** TEST(ProductDynamicLieGroup, ProductLieGroup) { - GTSAM_CONCEPT_ASSERT((IsGroup)); - GTSAM_CONCEPT_ASSERT((IsManifold)); - GTSAM_CONCEPT_ASSERT((IsLieGroup)); + // TODO : IsGroup::value does not exist in GTSAM + // static_assert(IsGroup::value, "DynamicVector must satisfy the Group concept"); + static_assert(IsManifold::value, "Product must satisfy the Manifold concept"); + static_assert(IsLieGroup::value, "Product must satisfy the IsLieGroup concept"); Product pair1(Point2(0, 0), Pose2()); Vector5 d; d << 1, 2, 0.1, 0.2, 0.3; diff --git a/gpmp2/gp/GaussianProcessInterpolatorLie.h b/gpmp2/gp/GaussianProcessInterpolatorLie.h index d23e249..b4b75dd 100644 --- a/gpmp2/gp/GaussianProcessInterpolatorLie.h +++ b/gpmp2/gp/GaussianProcessInterpolatorLie.h @@ -26,7 +26,7 @@ namespace gpmp2 { template class GaussianProcessInterpolatorLie { private: - GTSAM_CONCEPT_ASSERT((gtsam::IsLieGroup)); + static_assert(gtsam::IsLieGroup::value, "T must satisfy the LieGroup concept"); typedef GaussianProcessInterpolatorLie This; size_t dof_; diff --git a/gpmp2/gp/GaussianProcessPriorLie.h b/gpmp2/gp/GaussianProcessPriorLie.h index 4697ea2..a70505e 100644 --- a/gpmp2/gp/GaussianProcessPriorLie.h +++ b/gpmp2/gp/GaussianProcessPriorLie.h @@ -24,7 +24,7 @@ template class GaussianProcessPriorLie : public gtsam::NoiseModelFactorN { private: - GTSAM_CONCEPT_ASSERT((gtsam::IsLieGroup)); + static_assert(gtsam::IsLieGroup::value, "T must satisfy the LieGroup concept"); typedef GaussianProcessPriorLie This; typedef gtsam::NoiseModelFactorN Base;