Program Listing for File Rn_base.h¶
↰ Return to documentation for file (manif/impl/rn/Rn_base.h
)
#ifndef _MANIF_MANIF_RN_BASE_H_
#define _MANIF_MANIF_RN_BASE_H_
#include "manif/impl/rn/Rn_properties.h"
#include "manif/impl/lie_group_base.h"
namespace manif {
//
// LieGroup
//
template <typename _Derived>
struct RnBase : LieGroupBase<_Derived>
{
private:
using Base = LieGroupBase<_Derived>;
using Type = RnBase<_Derived>;
public:
MANIF_GROUP_TYPEDEF
MANIF_INHERIT_GROUP_AUTO_API
MANIF_INHERIT_GROUP_OPERATOR
using Base::coeffs;
using Transformation = typename internal::traits<_Derived>::Transformation;
// LieGroup common API
protected:
using Base::derived;
MANIF_DEFAULT_CONSTRUCTOR(RnBase)
public:
MANIF_GROUP_ML_ASSIGN_OP(RnBase)
LieGroup inverse(OptJacobianRef J_minv_m = {}) const;
Tangent log(OptJacobianRef J_t_m = {}) const;
MANIF_DEPRECATED
Tangent lift(OptJacobianRef J_t_m = {}) const;
template <typename _DerivedOther>
LieGroup compose(const LieGroupBase<_DerivedOther>& m,
OptJacobianRef J_mc_ma = {},
OptJacobianRef J_mc_mb = {}) const;
template <typename _EigenDerived>
auto
act(const Eigen::MatrixBase<_EigenDerived> &v,
tl::optional<Eigen::Ref<Eigen::Matrix<Scalar, Dim, DoF>>> J_vout_m = {},
tl::optional<Eigen::Ref<Eigen::Matrix<Scalar, Dim, Dim>>> J_vout_v = {}) const
-> Eigen::Matrix<Scalar, Dim, 1>;
Jacobian adj() const;
// Rn specific functions
Transformation transform() const;
};
template <typename _Derived>
typename RnBase<_Derived>::Transformation
RnBase<_Derived>::transform() const
{
Transformation T(Transformation::Identity());
T.template topRightCorner<Dim,1>() = coeffs();
return T;
}
template <typename _Derived>
typename RnBase<_Derived>::LieGroup
RnBase<_Derived>::inverse(OptJacobianRef J_minv_m) const
{
if (J_minv_m)
J_minv_m->setIdentity() *= Scalar(-1);
return LieGroup(-coeffs());
}
template <typename _Derived>
typename RnBase<_Derived>::Tangent
RnBase<_Derived>::log(OptJacobianRef J_t_m) const
{
if (J_t_m)
J_t_m->setIdentity();
return Tangent(coeffs());
}
template <typename _Derived>
typename RnBase<_Derived>::Tangent
RnBase<_Derived>::lift(OptJacobianRef J_t_m) const
{
return log(J_t_m);
}
template <typename _Derived>
template <typename _DerivedOther>
typename RnBase<_Derived>::LieGroup
RnBase<_Derived>::compose(
const LieGroupBase<_DerivedOther>& m,
OptJacobianRef J_mc_ma,
OptJacobianRef J_mc_mb) const
{
static_assert(
std::is_base_of<RnBase<_DerivedOther>, _DerivedOther>::value,
"Argument does not inherit from RnBase !");
static_assert(
RnBase<_DerivedOther>::Dim==_DerivedOther::Dim, "Dimension mismatch !");
if (J_mc_ma)
J_mc_ma->setIdentity();
if (J_mc_mb)
J_mc_mb->setIdentity();
return LieGroup(coeffs() + m.coeffs());
}
template <typename _Derived>
template <typename _EigenDerived>
// Eigen::Matrix<typename RnBase<_Derived>::Scalar, RnBase<_Derived>::Dim, 1>
auto
RnBase<_Derived>::act(const Eigen::MatrixBase<_EigenDerived> &v,
tl::optional<Eigen::Ref<Eigen::Matrix<Scalar, Dim, DoF>>> J_vout_m,
tl::optional<Eigen::Ref<Eigen::Matrix<Scalar, Dim, Dim>>> J_vout_v) const
-> Eigen::Matrix<Scalar, Dim, 1>
{
assert_vector_dim(v, Dim);
if (J_vout_m)
{
J_vout_m->setIdentity();
}
if (J_vout_v)
{
J_vout_v->setIdentity();
}
return coeffs() + v;
}
template <typename _Derived>
typename RnBase<_Derived>::Jacobian
RnBase<_Derived>::adj() const
{
static const Jacobian adj = Jacobian::Identity();
return adj;
}
namespace internal {
template <typename Derived>
struct RandomEvaluatorImpl<RnBase<Derived>>
{
template <typename T>
static void run(T& m)
{
using Tangent = typename Derived::Tangent;
m = Tangent::Random().exp();
}
};
} // namespace internal
} // namespace manif
#endif // _MANIF_MANIF_RN_BASE_H_