26 #include <boost/concept_check.hpp> 27 #include <boost/concept/requires.hpp> 28 #include <boost/type_traits/is_base_of.hpp> 53 template <
typename T>
struct traits;
61 enum { dim = Class::dimension };
64 Eigen::Matrix<double, dim, 1> v;
68 v = p.localCoordinates(q);
74 template<
class Class,
int N>
77 static int GetDimension(
const Class&) {
86 static int GetDimension(
const Class& m) {
101 enum { dimension = Class::dimension };
104 typedef Class ManifoldType;
106 typedef Eigen::Matrix<double, dimension, 1> TangentVector;
109 static TangentVector Local(
const Class& origin,
const Class& other) {
110 return origin.localCoordinates(other);
114 static Class Retract(
const Class& origin,
const TangentVector& v) {
115 return origin.retract(v);
127 check_manifold_invariants(
const T& a,
const T& b,
double tol=1e-9) {
140 typedef typename traits<T>::structure_category structure_category_tag;
141 static const int dim = traits<T>::dimension;
142 typedef typename traits<T>::ManifoldType ManifoldType;
143 typedef typename traits<T>::TangentVector TangentVector;
145 BOOST_CONCEPT_USAGE(IsManifold) {
146 BOOST_STATIC_ASSERT_MSG(
147 (boost::is_base_of<manifold_tag, structure_category_tag>::value),
148 "This type's structure_category trait does not assert it as a manifold (or derived)");
149 BOOST_STATIC_ASSERT(TangentVector::SizeAtCompileTime == dim);
152 v = traits<T>::Local(p, q);
153 q = traits<T>::Retract(p, v);
165 typedef const int value_type;
167 BOOST_STATIC_ASSERT_MSG(value != Eigen::Dynamic,
168 "FixedDimension instantiated for dymanically-sized type.");
171 #ifdef GTSAM_ALLOW_DEPRECATED_SINCE_V4 172 template<
typename M1,
typename M2>
175 class ProductManifold:
public std::pair<M1, M2> {
176 BOOST_CONCEPT_ASSERT((IsManifold<M1>));
177 BOOST_CONCEPT_ASSERT((IsManifold<M2>));
181 enum { dimension2 = traits<M2>::dimension };
184 enum { dimension = dimension1 + dimension2 };
185 inline static size_t Dim() {
return dimension;}
186 inline size_t dim()
const {
return dimension;}
188 typedef Eigen::Matrix<double, dimension, 1> TangentVector;
189 typedef OptionalJacobian<dimension, dimension> ChartJacobian;
192 ProductManifold():std::pair<M1,M2>(M1(),M2()) {}
195 ProductManifold(
const M1& m1,
const M2& m2):std::pair<M1,M2>(m1,m2) {}
198 ProductManifold retract(
const TangentVector& xi)
const {
199 M1 m1 = traits<M1>::Retract(this->first, xi.template head<dimension1>());
200 M2 m2 = traits<M2>::Retract(this->second, xi.template tail<dimension2>());
201 return ProductManifold(m1,m2);
205 TangentVector localCoordinates(
const ProductManifold& other)
const {
206 typename traits<M1>::TangentVector v1 = traits<M1>::Local(this->first, other.first);
207 typename traits<M2>::TangentVector v2 = traits<M2>::Local(this->second, other.second);
214 enum { NeedsToAlign = (
sizeof(M1) % 16) == 0 || (
sizeof(M2) % 16) == 0
217 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
221 template<
typename M1,
typename M2>
222 struct traits<ProductManifold<M1, M2> > : internal::Manifold<ProductManifold<M1, M2> > {
236 #define GTSAM_CONCEPT_MANIFOLD_INST(T) template class gtsam::IsManifold<T>; 237 #define GTSAM_CONCEPT_MANIFOLD_TYPE(T) typedef gtsam::IsManifold<T> _gtsam_IsManifold_##T; Both ManifoldTraits and Testable.
Definition: Manifold.h:120
Extra manifold traits for fixed-dimension types.
Definition: Manifold.h:75
A helper that implements the traits interface for GTSAM manifolds.
Definition: Manifold.h:95
A helper that implements the traits interface for GTSAM types.
Definition: Testable.h:150
Requirements on type to pass it to Manifold template below.
Definition: Manifold.h:59
Give fixed size dimension of a type, fails at compile time if dynamic.
Definition: Manifold.h:164
tag to assert a type is a manifold
Definition: Manifold.h:33
A manifold defines a space in which there is a notion of a linear tangent space that can be centered ...
Definition: concepts.h:30
Definition: Testable.h:57
BOOST_CONCEPT_REQUIRES(((IsGroup< G >)),(bool)) check_group_invariants(const G &a
Check invariants.
Global functions in a separate testing namespace.
Definition: chartTesting.h:28
Concept check for values that can be used in unit tests.
typedef and functions to augment Eigen's MatrixXd
Special class for optional Jacobian arguments.