5#ifndef __pinocchio_parsers_graph_graph_visitor_hpp__ 6#define __pinocchio_parsers_graph_graph_visitor_hpp__ 8#include "pinocchio/macros.hpp" 10#include "pinocchio/parsers/graph/fwd.hpp" 12#include "pinocchio/multibody/joint/joint-collection.hpp" 14#include "pinocchio/parsers/graph/model-graph.hpp" 15#include "pinocchio/parsers/graph/joints.hpp" 19#include <boost/graph/depth_first_search.hpp> 21#include <boost/variant/static_visitor.hpp> 22#include <boost/variant/apply_visitor.hpp> 33 template<
typename Derived>
34 struct UpdateJointGraphPoseVisitorBase :
public boost::static_visitor<SE3>
36 typedef Eigen::Ref<const Eigen::VectorXd> QRefType;
40 UpdateJointGraphPoseVisitorBase(
const QRefType & q_ref)
45 template<
typename Jo
intModel>
46 SE3 joint_calc(JointModel jmodel)
const 48 return derived().joint_calc_impl(jmodel);
51 template<
typename Jo
intModel>
52 SE3 joint_calc_default(JointModel jmodel)
const 54 if (JointModel::NQ != q_ref.rows())
56 PINOCCHIO_THROW_PRETTY(
57 std::invalid_argument,
"Graph - q_ref mismatch joint configuration space");
59 jmodel.setIndexes(1, 0, 0);
60 auto jdata = jmodel.createData();
61 jmodel.calc(jdata, q_ref);
66 const Derived & derived()
const 68 return *
static_cast<const Derived *
>(
this);
71 SE3 operator()(
const JointFixed & joint)
const 73 return joint.joint_offset;
76 SE3 operator()(
const JointRevolute & joint)
const 78 return joint_calc(JointModelRevoluteUnaligned(joint.axis));
81 SE3 operator()(
const JointPrismatic & joint)
const 83 return joint_calc(JointModelPrismaticUnaligned(joint.axis));
86 SE3 operator()(
const JointRevoluteUnbounded & joint)
const 88 return joint_calc(JointModelRevoluteUnboundedUnaligned(joint.axis));
91 SE3 operator()(
const JointHelical & joint)
const 93 return joint_calc(JointModelHelicalUnaligned(joint.axis, joint.pitch));
96 SE3 operator()(
const JointUniversal & joint)
const 98 return joint_calc(JointModelUniversal(joint.axis1, joint.axis2));
101 SE3 operator()(
const JointFreeFlyer &)
const 103 return joint_calc(JointModelFreeFlyer());
106 SE3 operator()(
const JointSpherical &)
const 108 return joint_calc(JointModelSpherical());
111 SE3 operator()(
const JointSphericalZYX &)
const 113 return joint_calc(JointModelSphericalZYX());
116 SE3 operator()(
const JointEllipsoid &)
const 118 return joint_calc(JointModelEllipsoid());
121 SE3 operator()(
const JointPlanar &)
const 123 return joint_calc(JointModelPlanar());
126 SE3 operator()(
const JointTranslation &)
const 128 return joint_calc(JointModelTranslation());
131 SE3 operator()(
const JointMimic &)
const 133 PINOCCHIO_THROW_PRETTY(
134 std::invalid_argument,
135 "Graph - Joint Mimic cannot have a q_ref. Please use the joint offset directly.");
141 struct UpdateJointGraphPoseVisitor
142 :
public UpdateJointGraphPoseVisitorBase<UpdateJointGraphPoseVisitor>
144 typedef UpdateJointGraphPoseVisitorBase<UpdateJointGraphPoseVisitor> Base;
148 template<
typename Jo
intModel>
149 SE3 joint_calc_impl(JointModel jmodel)
const 151 return Base::joint_calc_default(jmodel);
154 using Base::operator();
155 SE3 operator()(JointComposite & joint)
const 158 for (
size_t i = 0; i < joint.joints.size(); i++)
161 boost::apply_visitor([](
const auto & j_) {
return j_.nq; }, joint.joints[i]);
162 auto u_temp = UpdateJointGraphPoseVisitor(q_ref.segment(index, nq_curr));
163 SE3 pose_temp = boost::apply_visitor(u_temp, joint.joints[i]);
164 joint.jointsPlacements[i] = joint.jointsPlacements[i] * pose_temp;
167 return SE3::Identity();
173 struct UpdateJointGraphReversePoseVisitor
174 :
public UpdateJointGraphPoseVisitorBase<UpdateJointGraphReversePoseVisitor>
176 typedef UpdateJointGraphPoseVisitorBase<UpdateJointGraphReversePoseVisitor> Base;
180 template<
typename Jo
intModel>
181 SE3 joint_calc_impl(JointModel jmodel)
const 183 return Base::joint_calc_default(jmodel).
inverse();
186 using Base::operator();
187 SE3 operator()(
const JointUniversal & joint)
const 189 return Base::joint_calc_default(JointModelUniversal(-joint.axis2, -joint.axis1))
193 SE3 operator()(JointComposite & joint)
const 206 auto index = q_ref.rows();
207 for (
int i = 0; i < static_cast<int>(joint.joints.size()) - 1; i++)
209 int nq_curr = boost::apply_visitor(
210 [](
const auto & j_) {
return j_.nq; }, joint.joints[
static_cast<size_t>(i)]);
212 auto u_temp = UpdateJointGraphReversePoseVisitor(q_ref.segment(index, nq_curr));
213 SE3 pose_temp = boost::apply_visitor(u_temp, joint.joints[
static_cast<size_t>(i)]);
214 joint.jointsPlacements[
static_cast<size_t>(i + 1)] =
215 pose_temp * joint.jointsPlacements[
static_cast<size_t>(i + 1)];
218 boost::apply_visitor([](
const auto & j_) {
return j_.nq; }, joint.joints.back());
220 auto u_temp = UpdateJointGraphReversePoseVisitor(q_ref.segment(index, nq_curr));
221 SE3 pose_temp = boost::apply_visitor(u_temp, joint.joints.back());
Main pinocchio namespace.
SE3Tpl inverse() const
aXb = bXa.inverse()