6 #ifndef __pinocchio_multibody_joint_free_flyer_hpp__
7 #define __pinocchio_multibody_joint_free_flyer_hpp__
9 #include "pinocchio/macros.hpp"
10 #include "pinocchio/spatial/inertia.hpp"
11 #include "pinocchio/spatial/explog.hpp"
12 #include "pinocchio/multibody/joint/joint-base.hpp"
13 #include "pinocchio/multibody/joint-motion-subspace.hpp"
14 #include "pinocchio/math/fwd.hpp"
15 #include "pinocchio/math/quaternion.hpp"
20 template<
typename Scalar,
int Options>
21 struct JointMotionSubspaceIdentityTpl;
23 template<
typename _Scalar,
int _Options>
26 typedef _Scalar Scalar;
31 typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
38 typedef Eigen::Matrix<Scalar, 6, 1, Options> JointForce;
39 typedef Eigen::Matrix<Scalar, 6, 6, Options> DenseBase;
40 typedef Eigen::Matrix<Scalar, 6, 6, Options> ReducedSquaredMatrix;
42 typedef typename Matrix6::IdentityReturnType ConstMatrixReturnType;
43 typedef typename Matrix6::IdentityReturnType MatrixReturnType;
44 typedef typename Matrix6::IdentityReturnType StDiagonalMatrixSOperationReturnType;
47 template<
typename _Scalar,
int _Options>
51 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
59 template<
typename Vector6Like>
60 JointMotion __mult__(
const Eigen::MatrixBase<Vector6Like> & vj)
const
62 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector6Like, 6);
63 return JointMotion(vj);
66 template<
typename S1,
int O1>
72 template<
typename S1,
int O1>
85 template<
typename Derived>
93 template<
typename MatrixDerived>
94 typename PINOCCHIO_EIGEN_REF_CONST_TYPE(MatrixDerived)
95 operator*(
const Eigen::MatrixBase<MatrixDerived> & F)
105 MatrixReturnType matrix_impl()
const
107 return DenseBase::Identity();
110 template<
typename MotionDerived>
111 typename MotionDerived::ActionMatrixType motionAction(
const MotionBase<MotionDerived> & v)
const
113 return v.toActionMatrix();
116 bool isEqual(
const JointMotionSubspaceIdentityTpl &)
const
123 template<
typename Scalar,
int Options,
typename Vector6Like>
124 MotionRef<const Vector6Like> operator*(
125 const JointMotionSubspaceIdentityTpl<Scalar, Options> &,
126 const Eigen::MatrixBase<Vector6Like> & v)
128 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector6Like, 6);
130 typedef MotionRef<const Vector6Like> Motion;
131 return Motion(v.derived());
135 template<
typename S1,
int O1,
typename S2,
int O2>
136 inline typename InertiaTpl<S1, O1>::Matrix6
137 operator*(
const InertiaTpl<S1, O1> & Y,
const JointMotionSubspaceIdentityTpl<S2, O2> &)
143 template<
typename Matrix6Like,
typename S2,
int O2>
144 inline typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Matrix6Like) operator*(
145 const Eigen::MatrixBase<Matrix6Like> & Y,
const JointMotionSubspaceIdentityTpl<S2, O2> &)
150 template<
typename S1,
int O1>
156 template<
typename S1,
int O1,
typename MotionDerived>
162 template<
typename Scalar,
int Options>
165 template<
typename _Scalar,
int _Options>
173 typedef _Scalar Scalar;
186 typedef Eigen::Matrix<Scalar, 6, NV, Options> U_t;
187 typedef Eigen::Matrix<Scalar, NV, NV, Options> D_t;
188 typedef Eigen::Matrix<Scalar, 6, NV, Options> UD_t;
190 typedef Eigen::Matrix<Scalar, NQ, 1, Options> ConfigVector_t;
191 typedef Eigen::Matrix<Scalar, NV, 1, Options> TangentVector_t;
193 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
196 template<
typename _Scalar,
int _Options>
200 typedef _Scalar Scalar;
203 template<
typename _Scalar,
int _Options>
207 typedef _Scalar Scalar;
210 template<
typename _Scalar,
int _Options>
213 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
216 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
218 ConfigVector_t joint_q;
219 TangentVector_t joint_v;
233 :
joint_q(ConfigVector_t::Zero())
234 ,
joint_v(TangentVector_t::Zero())
235 , M(Transformation_t::Identity())
236 , v(Motion_t::Zero())
239 , UDinv(UD_t::Identity())
245 static std::string classname()
247 return std::string(
"JointDataFreeFlyer");
249 std::string shortname()
const
281 template<
typename _Scalar,
int _Options>
284 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
292 using Base::setIndexes;
294 JointDataDerived createData()
const
296 return JointDataDerived();
299 const std::vector<bool> hasConfigurationLimit()
const
301 return {
true,
true,
true,
false,
false,
false,
false};
304 const std::vector<bool> hasConfigurationLimitInTangent()
const
306 return {
true,
true,
true,
false,
false,
false};
309 template<
typename ConfigVectorLike>
310 inline void forwardKinematics(
311 Transformation_t & M,
const Eigen::MatrixBase<ConfigVectorLike> & q_joint)
const
313 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(ConfigVector_t, ConfigVectorLike);
314 typedef typename Eigen::Quaternion<
315 typename ConfigVectorLike::Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(ConfigVectorLike)::Options>
317 typedef Eigen::Map<const Quaternion> ConstQuaternionMap;
319 ConstQuaternionMap quat(q_joint.template tail<4>().data());
322 assert(math::fabs(
static_cast<Scalar
>(quat.coeffs().squaredNorm() - 1)) <= 1e-4);
324 M.rotation(quat.matrix());
325 M.translation(q_joint.template head<3>());
328 template<
typename Vector3Derived,
typename QuaternionDerived>
329 EIGEN_DONT_INLINE
void calc(
330 JointDataDerived & data,
331 const typename Eigen::MatrixBase<Vector3Derived> & trans,
332 const typename Eigen::QuaternionBase<QuaternionDerived> & quat)
const
334 data.M.translation(trans);
335 data.M.rotation(quat.matrix());
338 template<
typename ConfigVector>
339 EIGEN_DONT_INLINE
void
340 calc(JointDataDerived & data,
const typename Eigen::MatrixBase<ConfigVector> & qs)
const
342 typedef typename Eigen::Quaternion<Scalar, Options> Quaternion;
343 typedef Eigen::Map<const Quaternion> ConstQuaternionMap;
345 data.joint_q = qs.template segment<NQ>(idx_q());
346 ConstQuaternionMap quat(data.joint_q.template tail<4>().data());
348 calc(data, data.joint_q.template head<3>(), quat);
351 template<
typename TangentVector>
352 EIGEN_DONT_INLINE
void
353 calc(JointDataDerived & data,
const Blank,
const typename Eigen::MatrixBase<TangentVector> & vs)
356 data.joint_v = vs.template segment<NV>(idx_v());
357 data.v = data.joint_v;
360 template<
typename ConfigVector,
typename TangentVector>
361 EIGEN_DONT_INLINE
void calc(
362 JointDataDerived & data,
363 const typename Eigen::MatrixBase<ConfigVector> & qs,
364 const typename Eigen::MatrixBase<TangentVector> & vs)
const
366 calc(data, qs.derived());
368 data.joint_v = vs.template segment<NV>(idx_v());
369 data.v = data.joint_v;
372 template<
typename VectorLike,
typename Matrix6Like>
374 JointDataDerived & data,
375 const Eigen::MatrixBase<VectorLike> & armature,
376 const Eigen::MatrixBase<Matrix6Like> & I,
377 const bool update_I)
const
381 data.StU.diagonal() += armature;
383 internal::PerformStYSInversion<Scalar>::run(data.StU, data.Dinv);
384 data.UDinv.noalias() = I * data.Dinv;
387 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like, I).noalias() -= data.UDinv * data.U.transpose();
390 static std::string classname()
392 return std::string(
"JointModelFreeFlyer");
394 std::string shortname()
const
400 template<
typename NewScalar>
405 res.setIndexes(
id(), idx_q(), idx_v());
413 #include <boost/type_traits.hpp>
417 template<
typename Scalar,
int Options>
419 :
public integral_constant<bool, true>
423 template<
typename Scalar,
int Options>
425 :
public integral_constant<bool, true>
429 template<
typename Scalar,
int Options>
431 :
public integral_constant<bool, true>
435 template<
typename Scalar,
int Options>
437 :
public integral_constant<bool, true>
ToVectorConstReturnType toVector() const
Return the force as an Eigen vector.
Main pinocchio namespace.
JointDataTpl< Scalar, Options, JointCollectionTpl >::TangentVector_t joint_v(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataVariant through JointConfigVisitor to get the joint velocity vector.
JointDataTpl< Scalar, Options, JointCollectionTpl >::ConfigVector_t joint_q(const JointDataTpl< Scalar, Options, JointCollectionTpl > &jdata)
Visit a JointDataVariant through JointConfigVisitor to get the joint configuration vector.
JointModelFreeFlyerTpl< NewScalar, Options > cast() const
Return type of the ation of a Motion onto an object of type D.
ActionMatrixType toActionMatrixInverse() const
The action matrix of .
ActionMatrixType toActionMatrix() const
The action matrix of .
Common traits structure to fully define base classes for CRTP.