6 #ifndef __pinocchio_joint_prismatic_unaligned_hpp__
7 #define __pinocchio_joint_prismatic_unaligned_hpp__
9 #include "pinocchio/macros.hpp"
10 #include "pinocchio/multibody/joint/joint-base.hpp"
11 #include "pinocchio/multibody/joint/joint-translation.hpp"
12 #include "pinocchio/multibody/constraint.hpp"
13 #include "pinocchio/spatial/inertia.hpp"
14 #include "pinocchio/math/matrix.hpp"
22 template<
typename Scalar,
int Options>
28 template<
typename Scalar,
int Options,
typename MotionDerived>
34 template<
typename _Scalar,
int _Options>
37 typedef _Scalar Scalar;
38 enum { Options = _Options };
39 typedef Eigen::Matrix<Scalar,3,1,Options> Vector3;
40 typedef Eigen::Matrix<Scalar,6,1,Options> Vector6;
41 typedef Eigen::Matrix<Scalar,4,4,Options> Matrix4;
42 typedef Eigen::Matrix<Scalar,6,6,Options> Matrix6;
43 typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6) ToVectorConstReturnType;
44 typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6) ToVectorReturnType;
45 typedef Vector3 AngularType;
46 typedef Vector3 LinearType;
47 typedef const Vector3 ConstAngularType;
48 typedef const Vector3 ConstLinearType;
49 typedef Matrix6 ActionMatrixType;
50 typedef Matrix4 HomogeneousMatrixType;
59 template<
typename _Scalar,
int _Options>
61 :
MotionBase < MotionPrismaticUnalignedTpl<_Scalar,_Options> >
63 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
68 template<
typename Vector3Like,
typename S2>
69 MotionPrismaticUnalignedTpl(
const Eigen::MatrixBase<Vector3Like> & axis,
71 : m_axis(axis), m_v(v)
72 { EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3Like,3); }
74 inline PlainReturnType plain()
const
76 return PlainReturnType(m_axis*m_v,
77 PlainReturnType::Vector3::Zero());
80 template<
typename OtherScalar>
81 MotionPrismaticUnalignedTpl __mult__(
const OtherScalar & alpha)
const
83 return MotionPrismaticUnalignedTpl(m_axis,alpha*m_v);
86 template<
typename Derived>
87 void addTo(MotionDense<Derived> & other)
const
89 other.linear() += m_axis * m_v;
92 template<
typename Derived>
93 void setTo(MotionDense<Derived> & other)
const
95 other.linear().noalias() = m_axis*m_v;
96 other.angular().setZero();
99 template<
typename S2,
int O2,
typename D2>
100 void se3Action_impl(
const SE3Tpl<S2,O2> & m, MotionDense<D2> & v)
const
102 v.linear().noalias() = m_v * (m.rotation() * m_axis);
103 v.angular().setZero();
106 template<
typename S2,
int O2>
107 MotionPlain se3Action_impl(
const SE3Tpl<S2,O2> & m)
const
110 se3Action_impl(m,res);
114 template<
typename S2,
int O2,
typename D2>
115 void se3ActionInverse_impl(
const SE3Tpl<S2,O2> & m, MotionDense<D2> & v)
const
118 v.linear().noalias() = m_v * (m.rotation().transpose() * m_axis);
121 v.angular().setZero();
124 template<
typename S2,
int O2>
125 MotionPlain se3ActionInverse_impl(
const SE3Tpl<S2,O2> & m)
const
128 se3ActionInverse_impl(m,res);
132 template<
typename M1,
typename M2>
133 void motionAction(
const MotionDense<M1> & v, MotionDense<M2> & mout)
const
136 mout.linear().noalias() = v.angular().cross(m_axis);
137 mout.linear() *= m_v;
140 mout.angular().setZero();
143 template<
typename M1>
144 MotionPlain motionAction(
const MotionDense<M1> & v)
const
151 bool isEqual_impl(
const MotionPrismaticUnalignedTpl & other)
const
153 return m_axis == other.m_axis && m_v == other.m_v;
156 const Scalar & linearRate()
const {
return m_v; }
157 Scalar & linearRate() {
return m_v; }
159 const Vector3 & axis()
const {
return m_axis; }
160 Vector3 & axis() {
return m_axis; }
168 template<
typename Scalar,
int Options,
typename MotionDerived>
169 inline typename MotionDerived::MotionPlain
170 operator+(
const MotionPrismaticUnalignedTpl<Scalar,Options> & m1,
const MotionDense<MotionDerived> & m2)
172 typedef typename MotionDerived::MotionPlain ReturnType;
173 return ReturnType(m1.linearRate() * m1.axis() + m2.linear(), m2.angular());
176 template<
typename MotionDerived,
typename S2,
int O2>
177 inline typename MotionDerived::MotionPlain
178 operator^(
const MotionDense<MotionDerived> & m1,
179 const MotionPrismaticUnalignedTpl<S2,O2> & m2)
181 return m2.motionAction(m1);
186 template<
typename _Scalar,
int _Options>
189 typedef _Scalar Scalar;
190 enum { Options = _Options };
196 typedef Eigen::Matrix<Scalar,1,1,Options> JointForce;
197 typedef Eigen::Matrix<Scalar,6,1,Options> DenseBase;
198 typedef DenseBase MatrixReturnType;
199 typedef const DenseBase ConstMatrixReturnType;
201 typedef Eigen::Matrix<Scalar,3,1,Options> Vector3;
204 template<
typename Scalar,
int Options>
206 {
typedef Eigen::Matrix<Scalar,6,1,Options> ReturnType; };
208 template<
typename Scalar,
int Options,
typename MotionDerived>
210 {
typedef Eigen::Matrix<Scalar,6,1,Options> ReturnType; };
212 template<
typename Scalar,
int Options,
typename ForceDerived>
219 template<
typename Scalar,
int Options,
typename ForceSet>
224 typename Eigen::MatrixBase<const ForceSet>::template NRowsBlockXpr<3>::Type
228 template<
typename _Scalar,
int _Options>
230 :
ConstraintBase< ConstraintPrismaticUnalignedTpl<_Scalar,_Options> >
232 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
237 typedef typename traits<ConstraintPrismaticUnalignedTpl>::Vector3 Vector3;
239 ConstraintPrismaticUnalignedTpl() {}
241 template<
typename Vector3Like>
242 ConstraintPrismaticUnalignedTpl(
const Eigen::MatrixBase<Vector3Like> & axis)
244 { EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3Like,3); }
246 template<
typename Vector1Like>
247 JointMotion __mult__(
const Eigen::MatrixBase<Vector1Like> & v)
const
249 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector1Like,1);
250 return JointMotion(m_axis,v[0]);
253 template<
typename S1,
int O1>
254 typename SE3GroupAction<ConstraintPrismaticUnalignedTpl>::ReturnType
255 se3Action(
const SE3Tpl<S1,O1> & m)
const
257 typename SE3GroupAction<ConstraintPrismaticUnalignedTpl>::ReturnType res;
258 MotionRef<DenseBase> v(res);
259 v.linear().noalias() = m.rotation()*m_axis;
260 v.angular().setZero();
264 template<
typename S1,
int O1>
265 typename SE3GroupAction<ConstraintPrismaticUnalignedTpl>::ReturnType
266 se3ActionInverse(
const SE3Tpl<S1,O1> & m)
const
268 typename SE3GroupAction<ConstraintPrismaticUnalignedTpl>::ReturnType res;
269 MotionRef<DenseBase> v(res);
270 v.linear().noalias() = m.rotation().transpose()*m_axis;
271 v.angular().setZero();
275 int nv_impl()
const {
return NV; }
282 template<
typename ForceDerived>
283 typename ConstraintForceOp<ConstraintPrismaticUnalignedTpl,ForceDerived>::ReturnType
286 typedef typename ConstraintForceOp<ConstraintPrismaticUnalignedTpl,ForceDerived>::ReturnType ReturnType;
288 res[0] = ref.axis().dot(f.
linear());
293 template<
typename ForceSet>
294 typename ConstraintForceSetOp<ConstraintPrismaticUnalignedTpl,ForceSet>::ReturnType
295 operator*(
const Eigen::MatrixBase<ForceSet> & F)
297 EIGEN_STATIC_ASSERT(ForceSet::RowsAtCompileTime==6,THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
299 return ref.axis().transpose() * F.template middleRows<3>(LINEAR);
312 DenseBase matrix_impl()
const
315 S.template segment<3>(LINEAR) = m_axis;
316 S.template segment<3>(ANGULAR).setZero();
320 template<
typename MotionDerived>
321 DenseBase motionAction(
const MotionDense<MotionDerived> & v)
const
324 res.template segment<3>(LINEAR).noalias() = v.angular().cross(m_axis);
325 res.template segment<3>(ANGULAR).setZero();
330 const Vector3 & axis()
const {
return m_axis; }
331 Vector3 & axis() {
return m_axis; }
333 bool isEqual(
const ConstraintPrismaticUnalignedTpl & other)
const
335 return m_axis == other.m_axis;
344 template<
typename S1,
int O1,
typename S2,
int O2>
347 typedef Eigen::Matrix<S2,6,1,O2> ReturnType;
353 template<
typename S1,
int O1,
typename S2,
int O2>
360 static inline ReturnType run(
const Inertia & Y,
365 const S1 & m = Y.mass();
366 const typename Inertia::Vector3 & c = Y.lever();
368 res.template segment<3>(Constraint::LINEAR).noalias() = m*cpu.axis();
369 res.template segment<3>(Constraint::ANGULAR).noalias() = c.cross(res.template segment<3>(Constraint::LINEAR));
376 template<
typename M6Like,
typename Scalar,
int Options>
380 typedef typename Eigen::internal::remove_const<M6LikeCols>::type M6LikeColsNonConst;
383 typedef typename Constraint::Vector3 Vector3;
390 template<
typename M6Like,
typename Scalar,
int Options>
395 static inline ReturnType run(
const Eigen::MatrixBase<M6Like> & Y,
398 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(M6Like,6,6);
399 return Y.derived().template middleCols<3>(Constraint::LINEAR) * cru.axis();
406 template<
typename _Scalar,
int _Options>
413 typedef _Scalar Scalar;
414 enum { Options = _Options };
423 typedef Eigen::Matrix<Scalar,6,NV,Options> U_t;
424 typedef Eigen::Matrix<Scalar,NV,NV,Options> D_t;
425 typedef Eigen::Matrix<Scalar,6,NV,Options> UD_t;
427 PINOCCHIO_JOINT_DATA_BASE_ACCESSOR_DEFAULT_RETURN_TYPE
429 typedef Eigen::Matrix<Scalar,NQ,1,Options> ConfigVector_t;
430 typedef Eigen::Matrix<Scalar,NV,1,Options> TangentVector_t;
433 template<
typename Scalar,
int Options>
437 template<
typename _Scalar,
int _Options>
439 :
public JointDataBase< JointDataPrismaticUnalignedTpl<_Scalar,_Options> >
441 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
443 PINOCCHIO_JOINT_DATA_TYPEDEF_TEMPLATE(JointDerived);
444 PINOCCHIO_JOINT_DATA_BASE_DEFAULT_ACCESSOR
457 : M(Transformation_t::Vector3::Zero())
458 , S(Constraint_t::Vector3::Zero())
459 , v(Constraint_t::Vector3::Zero(),(Scalar)0)
462 , UDinv(UD_t::Zero())
465 template<
typename Vector3Like>
466 JointDataPrismaticUnalignedTpl(
const Eigen::MatrixBase<Vector3Like> & axis)
469 , v(axis,(Scalar)NAN)
470 , U(), Dinv(), UDinv()
473 static std::string classname() {
return std::string(
"JointDataPrismaticUnaligned"); }
474 std::string shortname()
const {
return classname(); }
478 template<
typename Scalar,
int Options>
483 template<
typename _Scalar,
int _Options>
485 :
public JointModelBase< JointModelPrismaticUnalignedTpl<_Scalar,_Options> >
487 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
489 PINOCCHIO_JOINT_TYPEDEF_TEMPLATE(JointDerived);
495 using Base::setIndexes;
497 typedef Eigen::Matrix<Scalar,3,1,_Options> Vector3;
500 JointModelPrismaticUnalignedTpl(
const Scalar & x,
506 assert(
isUnitary(
axis) &&
"Translation axis is not unitary");
509 template<
typename Vector3Like>
510 JointModelPrismaticUnalignedTpl(
const Eigen::MatrixBase<Vector3Like> &
axis)
513 EIGEN_STATIC_ASSERT_VECTOR_ONLY(Vector3Like);
514 assert(
isUnitary(
axis) &&
"Translation axis is not unitary");
517 JointDataDerived createData()
const {
return JointDataDerived(
axis); }
519 const std::vector<bool> hasConfigurationLimit()
const
524 const std::vector<bool> hasConfigurationLimitInTangent()
const
530 bool isEqual(
const JointModelPrismaticUnalignedTpl & other)
const
532 return Base::isEqual(other) &&
axis == other.axis;
535 template<
typename ConfigVector>
536 void calc(JointDataDerived & data,
537 const typename Eigen::MatrixBase<ConfigVector> & qs)
const
539 typedef typename ConfigVector::Scalar Scalar;
540 const Scalar & q = qs[
idx_q()];
542 data.M.translation().noalias() =
axis * q;
545 template<
typename ConfigVector,
typename TangentVector>
546 void calc(JointDataDerived & data,
547 const typename Eigen::MatrixBase<ConfigVector> & qs,
548 const typename Eigen::MatrixBase<TangentVector> & vs)
const
550 calc(data,qs.derived());
552 typedef typename TangentVector::Scalar S2;
553 const S2 & v = vs[
idx_v()];
554 data.v.linearRate() = v;
557 template<
typename Matrix6Like>
558 void calc_aba(JointDataDerived & data,
const Eigen::MatrixBase<Matrix6Like> & I,
const bool update_I)
const
560 data.U.noalias() = I.template block<6,3> (0,Inertia::LINEAR) *
axis;
561 data.Dinv[0] = Scalar(1)/
axis.dot(data.U.template segment <3> (Inertia::LINEAR));
562 data.UDinv.noalias() = data.U * data.Dinv;
565 PINOCCHIO_EIGEN_CONST_CAST(Matrix6Like,I) -= data.UDinv * data.U.transpose();
568 static std::string classname() {
return std::string(
"JointModelPrismaticUnaligned"); }
569 std::string shortname()
const {
return classname(); }
572 template<
typename NewScalar>
576 ReturnType res(
axis.template cast<NewScalar>());
591 #include <boost/type_traits.hpp>
595 template<
typename Scalar,
int Options>
597 :
public integral_constant<bool,true> {};
599 template<
typename Scalar,
int Options>
601 :
public integral_constant<bool,true> {};
603 template<
typename Scalar,
int Options>
605 :
public integral_constant<bool,true> {};
607 template<
typename Scalar,
int Options>
609 :
public integral_constant<bool,true> {};
613 #endif // ifndef __pinocchio_joint_prismatic_unaligned_hpp__