Point2 example and MACRO proposal
parent
80faf61627
commit
93593f1990
|
@ -160,8 +160,8 @@ The group composition operation can be of two flavors:
|
|||
|
||||
which should be queryable by `gtsam::traits::group_flavor<T>`
|
||||
|
||||
Examples
|
||||
--------
|
||||
Manifold Example
|
||||
----------------
|
||||
|
||||
An example of implementing a Manifold type is here:
|
||||
|
||||
|
@ -198,11 +198,6 @@ An example of implementing a Manifold type is here:
|
|||
typedef Rot2 type;
|
||||
}
|
||||
|
||||
template<>
|
||||
struct Vector<Rot2::Chart> {
|
||||
typedef Vector2 type;
|
||||
}
|
||||
|
||||
}}
|
||||
|
||||
But Rot2 is in fact also a Lie Group, after we define
|
||||
|
@ -210,7 +205,7 @@ But Rot2 is in fact also a Lie Group, after we define
|
|||
Rot2 inverse(const Rot2& p) { return p.transpose();}
|
||||
Rot2 operator*(const Rot2& p, const Rot2& q) { return p*q;}
|
||||
Rot2 compose(const Rot2& p, const Rot2& q) { return p*q;}
|
||||
Rot2 between(const Rot2& p, const Rot2& q) { return p*q;}
|
||||
Rot2 between(const Rot2& p, const Rot2& q) { return inverse(p)*q;}
|
||||
|
||||
The only traits that needs to be implemented are the tags:
|
||||
|
||||
|
@ -224,4 +219,63 @@ The only traits that needs to be implemented are the tags:
|
|||
|
||||
}}
|
||||
|
||||
Vector Space Example
|
||||
--------------------
|
||||
|
||||
Providing the Vector space concept is easier:
|
||||
|
||||
// GTSAM type
|
||||
class Point2 {
|
||||
static const int dimension = 2;
|
||||
Point2 operator+(const Point2&) const;
|
||||
Point2 operator-(const Point2&) const;
|
||||
Point2 operator-() const;
|
||||
// Still needs to be defined, unless Point2 *is* Vector2
|
||||
class Chart {
|
||||
Chart(const Rot2& R);
|
||||
Vector2 local(const Rot2& R) const;
|
||||
Rot2 retract(const Vector2& v) const;
|
||||
}
|
||||
}
|
||||
|
||||
The following macro, called inside the gtsam namespace,
|
||||
|
||||
DEFINE_VECTOR_SPACE_TRAITS(Point2)
|
||||
|
||||
should automatically define
|
||||
|
||||
namespace traits {
|
||||
|
||||
template<>
|
||||
struct dimension<Point2> {
|
||||
static const int value = Point2::dimension;
|
||||
typedef int value_type;
|
||||
}
|
||||
|
||||
template<>
|
||||
struct TangentVector<Point2> {
|
||||
typedef Matrix::Eigen<double,Point2::dimension,1> type;
|
||||
}
|
||||
|
||||
template<>
|
||||
struct defaultChart<Point2> : Point2::Chart {}
|
||||
|
||||
template<>
|
||||
struct Manifold<Point2::Chart> {
|
||||
typedef Point2 type;
|
||||
}
|
||||
|
||||
template<>
|
||||
struct structure<Point2> : vector_space_tag {}
|
||||
|
||||
template<>
|
||||
struct group_flavor<Point2> : additive_group_tag {}
|
||||
}
|
||||
|
||||
and
|
||||
|
||||
Point2 inverse(const Point2& p) { return p.transpose();}
|
||||
Point2 operator+(const Point2& p, const Point2& q) { return p+q;}
|
||||
Point2 compose(const Point2& p, const Point2& q) { return p+q;}
|
||||
Point2 between(const Point2& p, const Point2& q) { return q-p;}
|
||||
|
||||
|
|
Loading…
Reference in New Issue