18 #ifndef __se3_lie_group_variant_visitor_hxx__ 19 #define __se3_lie_group_variant_visitor_hxx__ 21 #include "pinocchio/multibody/liegroup/operation-base.hpp" 22 #include "pinocchio/multibody/visitor.hpp" 26 #define LIE_GROUP_VISITOR(VISITOR) \ 27 VISITOR(ArgsType & args) : args(args) {} \ 37 template<
typename Visitor>
43 bf::invoke(&Visitor::template algo<D>,
44 bf::append(boost::ref(lg),
45 static_cast<const Visitor*>(
this)->args));
48 template<
typename ArgsTmp>
49 static void run(
const LieGroupVariant & lg,
52 return boost::apply_visitor(Visitor(args),lg);
65 static int run(
const LieGroupVariant & lg)
68 inline int nq(
const LieGroupVariant & lg) {
return LieGroupNqVisitor::run(lg); }
79 static int run(
const LieGroupVariant & lg)
82 inline int nv(
const LieGroupVariant & lg) {
return LieGroupNvVisitor::run(lg); }
93 static std::string run(
const LieGroupVariant & lg)
96 inline std::string
name(
const LieGroupVariant & lg) {
return LieGroupNameVisitor::run(lg); }
101 template<
typename Vector>
108 static Vector run(
const LieGroupVariant & lg)
112 inline Eigen::VectorXd
neutral(
const LieGroupVariant & lg)
118 template <
class ConfigIn_t,
class Tangent_t,
class ConfigOut_t>
121 typedef boost::fusion::vector<
const ConfigIn_t &,
123 ConfigOut_t &> ArgsType;
127 template<
typename LieGroupDerived>
129 const Eigen::MatrixBase<ConfigIn_t> & q,
130 const Eigen::MatrixBase<Tangent_t> & v,
131 const Eigen::MatrixBase<ConfigOut_t>& qout)
133 ConfigOut_t & qout_ =
const_cast< ConfigOut_t&
>(qout.derived());
134 lg.
integrate(Eigen::Ref<const typename LieGroupDerived::ConfigVector_t>(q),
135 Eigen::Ref<const typename LieGroupDerived::TangentVector_t>(v),
136 Eigen::Ref<typename LieGroupDerived::ConfigVector_t>(qout_));
140 template <
class ConfigIn_t,
class Tangent_t,
class ConfigOut_t>
142 const Eigen::MatrixBase<ConfigIn_t> & q,
143 const Eigen::MatrixBase<Tangent_t> & v,
144 const Eigen::MatrixBase<ConfigOut_t>& qout)
146 EIGEN_STATIC_ASSERT_VECTOR_ONLY(ConfigIn_t)
147 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Tangent_t)
148 EIGEN_STATIC_ASSERT_VECTOR_ONLY(ConfigOut_t)
151 assert(q.size() ==
nq(lg));
152 assert(v.size() ==
nv(lg));
153 assert(qout.size() ==
nq(lg));
155 ConfigOut_t & qout_ =
const_cast< ConfigOut_t&
>(qout.derived());
156 Operation::run(lg,
typename Operation::ArgsType(q.derived(),v.derived(),qout_.derived()));
160 #endif // ifndef __se3_lie_group_variant_visitor_hxx__
std::string name(const LieGroupVariant &lg)
Visit a LieGroupVariant to get the name of it.
void integrate(const Eigen::MatrixBase< ConfigIn_t > &q, const Eigen::MatrixBase< Tangent_t > &v, const Eigen::MatrixBase< ConfigOut_t > &qout) const
Integrate a joint's configuration with a tangent vector during one unit time duration.
std::string name() const
Get name of instance.
Visitor of the Lie Group neutral element.
Eigen::VectorXd neutral(const Model &model)
Return the neutral configuration element related to the model configuration space.
Lie Group visitor of the dimension of the configuration space nq.
Lie Group visitor of the dimension of the tangent space nv.
int nq(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNqVisitor to get the dimension of the joint configuration spac...
Eigen::VectorXd integrate(const Model &model, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Integrate a configuration for the specified model for a tangent vector during one unit time...
int nv(const JointModelVariant &jmodel)
Visit a JointModelVariant through JointNvVisitor to get the dimension of the joint tangent space...
Index nv() const
Get dimension of Lie Group tangent space.
ConfigVector_t neutral() const
Get neutral element as a vector.
Visitor of the Lie Group name.
Visitor of the Lie Group integrate method.