19 #ifndef __se3_constraint_hpp__ 20 #define __se3_constraint_hpp__ 23 #include "pinocchio/macros.hpp" 24 #include "pinocchio/spatial/fwd.hpp" 25 #include "pinocchio/spatial/motion.hpp" 34 template<
int _Dim,
typename _Scalar,
int _Options=0>
class ConstraintTpl;
36 template<
class Derived>
46 Derived & derived() {
return *
static_cast<Derived*
>(
this); }
47 const Derived& derived()
const {
return *
static_cast<const Derived*
>(
this); }
49 Motion operator* (
const JointMotion& vj)
const {
return derived().__mult__(vj); }
51 DenseBase & matrix() {
return derived().matrix_impl(); }
52 const DenseBase & matrix()
const {
return derived().matrix_impl(); }
53 int nv()
const {
return derived().nv_impl(); }
55 template<
class OtherDerived>
57 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 58 {
return matrix().isApprox(other.matrix(),prec); }
60 void disp(std::ostream & os)
const {
static_cast<const Derived*
>(
this)->disp_impl(os); }
61 friend std::ostream & operator << (std::ostream & os,const ConstraintBase<Derived> & X)
69 template<
int D,
typename T,
int U>
73 typedef Eigen::Matrix<T,3,1,U> Vector3;
74 typedef Eigen::Matrix<T,4,1,U> Vector4;
75 typedef Eigen::Matrix<T,6,1,U> Vector6;
76 typedef Eigen::Matrix<T,3,3,U> Matrix3;
77 typedef Eigen::Matrix<T,4,4,U> Matrix4;
78 typedef Eigen::Matrix<T,6,6,U> Matrix6;
79 typedef Matrix3 Angular_t;
80 typedef Vector3 Linear_t;
81 typedef const Matrix3 ConstAngular_t;
82 typedef const Vector3 ConstLinear_t;
83 typedef Matrix6 ActionMatrix_t;
84 typedef Eigen::Quaternion<T,U> Quaternion_t;
93 typedef Eigen::Matrix<Scalar,D,1,U> JointMotion;
94 typedef Eigen::Matrix<Scalar,D,1,U> JointForce;
95 typedef Eigen::Matrix<Scalar,6,D> DenseBase;
101 template<
int Dim,
typename Scalar,
int Options>
102 struct ActionReturn<ConstraintTpl<Dim,Scalar,Options> >
103 {
typedef Eigen::Matrix<Scalar,6,Dim> Type; };
106 template<
int _Dim,
typename _Scalar,
int _Options>
110 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
114 friend class ConstraintBase< ConstraintTpl< _Dim, _Scalar, _Options > >;
115 SPATIAL_TYPEDEF_TEMPLATE(ConstraintTpl);
117 typedef typename Base::JointMotion JointMotion;
118 typedef typename Base::JointForce JointForce;
119 typedef typename Base::DenseBase DenseBase;
121 enum { NV = _Dim, Options = _Options };
125 ConstraintTpl(
const Eigen::MatrixBase<D> & _S) : S(_S)
129 EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(DenseBase, D);
132 ConstraintTpl() : S()
140 ConstraintTpl(
const int dim) : S(6,dim)
142 EIGEN_STATIC_ASSERT(_Dim==Eigen::Dynamic,YOU_CALLED_A_FIXED_SIZE_METHOD_ON_A_DYNAMIC_SIZE_MATRIX_OR_VECTOR)
148 Motion __mult__(
const JointMotion& vj)
const 156 const ConstraintTpl & ref;
157 Transpose(
const ConstraintTpl & ref ) : ref(ref) {}
159 JointForce operator* (
const Force& f)
const 160 {
return (ref.S.transpose()*f.
toVector()).eval(); }
163 typename Eigen::Matrix<_Scalar,NV,Eigen::Dynamic>
164 operator*(
const Eigen::MatrixBase<D> & F )
166 return (ref.S.transpose()*F).eval();
172 DenseBase & matrix_impl() {
return S; }
173 const DenseBase & matrix_impl()
const {
return S; }
175 int nv_impl()
const {
return NV; }
178 friend Eigen::Matrix<_Scalar,6,_Dim>
180 {
return (Y.matrix()*S.S).eval(); }
183 DenseBase se3Action(
const SE3 & m)
const 185 return (m.toActionMatrix()*S).eval();
188 DenseBase se3ActionInverse(
const SE3 & m)
const 190 return (m.
inverse().toActionMatrix()*S).eval();
193 DenseBase variation(
const Motion & v)
const 195 DenseBase res(v.toActionMatrix() * S);
200 void disp_impl(std::ostream & os)
const { os <<
"S =\n" << S << std::endl;}
213 #endif // ifndef __se3_constraint_hpp__
Concreate Class representing a force.
SE3Tpl inverse() const
aXb = bXa.inverse()
const Vector6 & toVector() const
Return the force.