Program Listing for File SE2.h¶
↰ Return to documentation for file (manif/impl/se2/SE2.h
)
#ifndef _MANIF_MANIF_SE2_H_
#define _MANIF_MANIF_SE2_H_
#include "manif/impl/se2/SE2_base.h"
namespace manif {
// Forward declare for type traits specialization
template <typename _Scalar> struct SE2;
template <typename _Scalar> struct SE2Tangent;
namespace internal {
template <typename _Scalar>
struct traits<SE2<_Scalar>>
{
using Scalar = _Scalar;
using LieGroup = SE2<_Scalar>;
using Tangent = SE2Tangent<_Scalar>;
using Base = SE2Base<SE2<_Scalar>>;
static constexpr int Dim = LieGroupProperties<Base>::Dim;
static constexpr int DoF = LieGroupProperties<Base>::DoF;
static constexpr int RepSize = 4;
using DataType = Eigen::Matrix<Scalar, RepSize, 1>;
using Jacobian = Eigen::Matrix<Scalar, DoF, DoF>;
using Transformation = Eigen::Matrix<Scalar, 3, 3>;
using Rotation = Eigen::Matrix<Scalar, Dim, Dim>;
using Translation = Eigen::Matrix<Scalar, Dim, 1>;
using Vector = Eigen::Matrix<Scalar, Dim, 1>;
};
} /* namespace internal */
} /* namespace manif */
namespace manif {
//
// LieGroup
//
template <typename _Scalar>
struct SE2 : SE2Base<SE2<_Scalar>>
{
private:
using Base = SE2Base<SE2<_Scalar>>;
using Type = SE2<_Scalar>;
protected:
using Base::derived;
public:
MANIF_MAKE_ALIGNED_OPERATOR_NEW_COND
MANIF_COMPLETE_GROUP_TYPEDEF
using Translation = typename Base::Translation;
MANIF_INHERIT_GROUP_API
using Base::transform;
using Base::rotation;
using Base::normalize;
SE2() = default;
~SE2() = default;
MANIF_COPY_CONSTRUCTOR(SE2)
MANIF_MOVE_CONSTRUCTOR(SE2)
// Copy constructor
template <typename _DerivedOther>
SE2(const LieGroupBase<_DerivedOther>& o);
MANIF_GROUP_ASSIGN_OP(SE2)
SE2(const Translation& t, const std::complex<Scalar>& c);
SE2(const Scalar x, const Scalar y, const Scalar theta);
SE2(const Scalar x, const Scalar y, const Scalar real, const Scalar imag);
SE2(const Scalar x, const Scalar y, const std::complex<Scalar>& c);
SE2(const Eigen::Transform<_Scalar,2,Eigen::Isometry>& h);
// LieGroup common API
DataType& coeffs();
const DataType& coeffs() const;
// SE2 specific API
using Base::angle;
using Base::real;
using Base::imag;
using Base::x;
using Base::y;
protected:
DataType data_;
};
MANIF_EXTRA_GROUP_TYPEDEF(SE2)
template <typename _Scalar>
template <typename _DerivedOther>
SE2<_Scalar>::SE2(const LieGroupBase<_DerivedOther>& o)
: SE2(o.coeffs())
{
//
}
template <typename _Scalar>
SE2<_Scalar>::SE2(const Translation& t,
const std::complex<Scalar>& c)
: SE2((DataType() << t, c.real(), c.imag()).finished())
{
//
}
template <typename _Scalar>
SE2<_Scalar>::SE2(const Scalar x, const Scalar y, const Scalar theta)
: SE2(DataType(x, y, cos(theta), sin(theta)))
{
using std::cos;
using std::sin;
}
template <typename _Scalar>
SE2<_Scalar>::SE2(const Scalar x, const Scalar y,
const Scalar real, const Scalar imag)
: SE2(DataType(x, y, real, imag))
{
//
}
template <typename _Scalar>
SE2<_Scalar>::SE2(const Scalar x, const Scalar y, const std::complex<Scalar>& c)
: SE2(x, y, c.real(), c.imag())
{
//
}
template <typename _Scalar>
SE2<_Scalar>::SE2(const Eigen::Transform<_Scalar, 2, Eigen::Isometry>& h)
: SE2(h.translation().x(), h.translation().y(), Eigen::Rotation2D<Scalar>(h.rotation()).angle())
{
//
}
template <typename _Scalar>
typename SE2<_Scalar>::DataType&
SE2<_Scalar>::coeffs()
{
return data_;
}
template <typename _Scalar>
const typename SE2<_Scalar>::DataType&
SE2<_Scalar>::coeffs() const
{
return data_;
}
} /* namespace manif */
#endif /* _MANIF_MANIF_SE2_H_ */