Created GTSAM_GROUP_IDENTITY as it handles templates differently

release/4.3a0
dellaert 2014-12-08 23:57:26 +01:00
parent 473bc1b703
commit 118d561e96
3 changed files with 16 additions and 6 deletions

View File

@ -157,14 +157,24 @@ check_invariants(const T& a, const T& b, double tol = 1e-9) {
}
} // \ namespace group
#define GTSAM_GROUP_IDENTITY0(GROUP) \
namespace group { namespace traits { \
template<> struct identity<GROUP > { static const GROUP value; typedef GROUP value_type;};\
const GROUP identity<GROUP >::value = GROUP::Identity();\
}}
#define GTSAM_GROUP_IDENTITY(TEMPLATE,GROUP) \
namespace group { namespace traits { \
template<TEMPLATE> struct identity<GROUP > { static const GROUP value; typedef GROUP value_type;};\
template<TEMPLATE> const GROUP identity<GROUP >::value = GROUP::Identity();\
}}
#define GTSAM_ADDITIVE_GROUP(TEMPLATE,GROUP) \
namespace group { \
template<TEMPLATE> GROUP compose(const GROUP &g, const GROUP & h) { return g + h;} \
template<TEMPLATE> GROUP between(const GROUP &g, const GROUP & h) { return h - g;} \
template<TEMPLATE> GROUP inverse(const GROUP &g) { return -g;} \
namespace traits { \
template<TEMPLATE> struct identity<GROUP > { static const GROUP value; typedef GROUP value_type;};\
template<TEMPLATE> const GROUP identity<GROUP >::value = GROUP::Identity();\
template<TEMPLATE> struct flavor<GROUP > { typedef additive_tag type;};\
}}
@ -174,8 +184,6 @@ template<TEMPLATE> GROUP compose(const GROUP &g, const GROUP & h) { return g * h
template<TEMPLATE> GROUP between(const GROUP &g, const GROUP & h) { return g.inverse() * h;} \
template<TEMPLATE> GROUP inverse(const GROUP &g) { return g.inverse();} \
namespace traits { \
template<TEMPLATE> struct identity<GROUP > { static const GROUP value; typedef GROUP value_type;};\
template<TEMPLATE> const GROUP identity<GROUP >::value = GROUP::Identity();\
template<TEMPLATE> struct flavor<GROUP > { typedef multiplicative_tag type;};\
}}

View File

@ -64,6 +64,7 @@ public:
#define CYCLIC_TEMPLATE size_t N
#define CYCLIC_TYPE Cyclic<N>
GTSAM_GROUP_IDENTITY(CYCLIC_TEMPLATE, CYCLIC_TYPE)
GTSAM_ADDITIVE_GROUP(CYCLIC_TEMPLATE, CYCLIC_TYPE)
/// Define cyclic group to be a model of the Group concept

View File

@ -32,7 +32,7 @@ struct MakeQuaternionChart {
/// Exponential map given axis/angle representation of Lie algebra
static Q Expmap(const _Scalar& angle, const Eigen::Ref<const Omega>& axis) {
return Q(Eigen::AngleAxisd(angle, axis));
return Q(Eigen::AngleAxis<_Scalar>(angle, axis));
}
/// Exponential map, simply be converting omega to axis/angle representation
@ -41,7 +41,7 @@ struct MakeQuaternionChart {
return Q::Identity();
else {
_Scalar angle = omega.norm();
return Q(Eigen::AngleAxisd(angle, omega / angle));
return Q(Eigen::AngleAxis<_Scalar>(angle, omega / angle));
}
}
@ -85,6 +85,7 @@ struct MakeQuaternionChart {
#define QUATERNION_TEMPLATE typename _Scalar, int _Options
#define QUATERNION_TYPE Eigen::Quaternion<_Scalar,_Options>
GTSAM_GROUP_IDENTITY(QUATERNION_TEMPLATE, QUATERNION_TYPE)
GTSAM_MULTIPLICATIVE_GROUP(QUATERNION_TEMPLATE, QUATERNION_TYPE)
#define QUATERNION_TANGENT Eigen::Matrix<_Scalar, 3, 1, _Options, 3, 1>