19 #ifndef __se3_motion_hpp__ 20 #define __se3_motion_hpp__ 23 #include "pinocchio/spatial/fwd.hpp" 24 #include "pinocchio/macros.hpp" 25 #include "pinocchio/spatial/se3.hpp" 26 #include "pinocchio/spatial/force.hpp" 32 template<
class Derived>
36 typedef Derived Derived_t;
37 SPATIAL_TYPEDEF_TEMPLATE(Derived_t);
40 Derived_t & derived() {
return *
static_cast<Derived_t*
>(
this); }
41 const Derived_t& derived()
const {
return *
static_cast<const Derived_t*
>(
this); }
43 ConstAngular_t angular()
const {
return static_cast<const Derived_t*
>(
this)->angular_impl(); }
44 ConstLinear_t linear()
const {
return static_cast<const Derived_t*
>(
this)->linear_impl(); }
45 Angular_t angular() {
return static_cast<Derived_t*
>(
this)->angular_impl(); }
46 Linear_t linear() {
return static_cast<Derived_t*
>(
this)->linear_impl(); }
49 void angular(
const Eigen::MatrixBase<D> & w) {
static_cast< Derived_t*
>(
this)->angular_impl(w); }
51 void linear(
const Eigen::MatrixBase<D> & v) {
static_cast< Derived_t*
>(
this)->linear_impl(v); }
53 const Vector6 & toVector()
const {
return derived().toVector_impl(); }
54 Vector6 & toVector() {
return derived().toVector_impl(); }
55 operator Vector6 ()
const {
return toVector(); }
57 ActionMatrix_t toActionMatrix()
const {
return derived().toActionMatrix_impl(); }
58 ActionMatrix_t toDualActionMatrix()
const {
return derived().toDualActionMatrix_impl(); }
59 operator Matrix6 ()
const {
return toActionMatrix(); }
61 bool operator==(
const Derived_t & other)
const {
return derived().isEqual(other);}
62 bool operator!=(
const Derived_t & other)
const {
return !(*
this == other); }
63 Derived_t operator-()
const {
return derived().__minus__(); }
64 Derived_t operator+(
const Derived_t & v2)
const {
return derived().__plus__(v2); }
65 Derived_t operator-(
const Derived_t & v2)
const {
return derived().__minus__(v2); }
66 Derived_t & operator+=(
const Derived_t & v2) {
return derived().__pequ__(v2); }
67 Derived_t & operator-=(
const Derived_t & v2) {
return derived().__mequ__(v2); }
68 Derived_t operator*(
const Scalar alpha)
const {
return derived().__mult__(alpha); }
70 bool isApprox (
const Derived_t & other,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 71 {
return derived().isApprox_impl(other, prec);}
73 Derived_t se3Action(
const SE3 & m)
const {
return derived().se3Action_impl(m); }
74 Derived_t se3ActionInverse(
const SE3 & m)
const {
return derived().se3ActionInverse_impl(m); }
76 Scalar dot(
const Force & f)
const {
return static_cast<Derived_t*
>(
this)->dot(f); }
78 void disp(std::ostream & os)
const { derived().disp_impl(os); }
79 friend std::ostream & operator << (std::ostream & os, const MotionBase<Derived_t> & mv)
88 template<
typename T,
int U>
92 typedef Eigen::Matrix<T,3,1,U> Vector3;
93 typedef Eigen::Matrix<T,4,1,U> Vector4;
94 typedef Eigen::Matrix<T,6,1,U> Vector6;
95 typedef Eigen::Matrix<T,3,3,U> Matrix3;
96 typedef Eigen::Matrix<T,4,4,U> Matrix4;
97 typedef Eigen::Matrix<T,6,6,U> Matrix6;
98 typedef Matrix6 ActionMatrix_t;
99 typedef typename Vector6::template FixedSegmentReturnType<3>::Type Linear_t;
100 typedef typename Vector6::template FixedSegmentReturnType<3>::Type Angular_t;
101 typedef typename Vector6::template ConstFixedSegmentReturnType<3>::Type ConstLinear_t;
102 typedef typename Vector6::template ConstFixedSegmentReturnType<3>::Type ConstAngular_t;
103 typedef Eigen::Quaternion<T,U> Quaternion_t;
115 template<
typename _Scalar,
int _Options>
120 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
126 template<
typename v1,
typename v2>
127 MotionTpl(
const Eigen::MatrixBase<v1> & v,
const Eigen::MatrixBase<v2> & w)
132 template<
typename v6>
133 explicit MotionTpl(
const Eigen::MatrixBase<v6> & v)
136 EIGEN_STATIC_ASSERT_VECTOR_ONLY(v6);
137 assert( v.size() == 6 );
141 template<
typename S2,
int O2>
143 : data(clone.toVector())
147 static MotionTpl Zero() {
return MotionTpl(Vector6::Zero()); }
148 static MotionTpl Random() {
return MotionTpl(Vector6::Random()); }
150 MotionTpl & setZero () { data.setZero ();
return *
this; }
151 MotionTpl & setRandom () { data.setRandom ();
return *
this; }
153 const Vector6 & toVector_impl()
const {
return data; }
154 Vector6 & toVector_impl() {
return data; }
156 ActionMatrix_t toActionMatrix_impl ()
const 159 X.template block <3,3> (ANGULAR, ANGULAR) = X.template block <3,3> (LINEAR, LINEAR) = skew (angular_impl());
160 X.template block <3,3> (LINEAR, ANGULAR) = skew (linear_impl());
161 X.template block <3,3> (ANGULAR, LINEAR).setZero ();
166 ActionMatrix_t toDualActionMatrix_impl ()
const 169 X.template block <3,3> (ANGULAR, ANGULAR) = X.template block <3,3> (LINEAR, LINEAR) = skew (angular_impl());
170 X.template block <3,3> (ANGULAR, LINEAR) = skew (linear_impl());
171 X.template block <3,3> (LINEAR, ANGULAR).setZero ();
177 ConstAngular_t angular_impl()
const {
return data.template segment<3> (ANGULAR); }
178 ConstLinear_t linear_impl()
const {
return data.template segment<3> (LINEAR); }
179 Angular_t angular_impl() {
return data.template segment<3> (ANGULAR); }
180 Linear_t linear_impl() {
return data.template segment<3> (LINEAR); }
183 void angular_impl(
const Eigen::MatrixBase<D> & w) { data.template segment<3> (ANGULAR)=w; }
185 void linear_impl(
const Eigen::MatrixBase<D> & v) { data.template segment<3> (LINEAR)=v; }
187 bool isEqual (
const MotionTpl & other)
const {
return data == other.
data; }
190 template<
typename S2,
int O2>
193 data = other.toVector();
197 template<
typename V6>
198 MotionTpl & operator=(
const Eigen::MatrixBase<V6> & v)
200 EIGEN_STATIC_ASSERT_VECTOR_ONLY(V6); assert(v.size() == 6);
205 MotionTpl __minus__()
const {
return MotionTpl(-data); }
206 MotionTpl __plus__(
const MotionTpl & v2)
const {
return MotionTpl(data + v2.
data); }
207 MotionTpl __minus__(
const MotionTpl & v2)
const {
return MotionTpl(data - v2.
data); }
208 MotionTpl& __pequ__(
const MotionTpl & v2) { data += v2.
data;
return *
this; }
209 MotionTpl& __mequ__(
const MotionTpl & v2) { data -= v2.
data;
return *
this; }
210 MotionTpl __mult__(
const Scalar alpha)
const {
return MotionTpl(alpha*data); }
212 Scalar dot(
const Force & f)
const {
return data.dot(f.
toVector()); }
214 MotionTpl cross(
const MotionTpl& v2)
const 216 return MotionTpl( linear_impl().cross(v2.angular_impl())+angular_impl().cross(v2.linear_impl()),
217 angular_impl().cross(v2.angular_impl()) );
226 bool isApprox_impl (
const MotionTpl & m2,
const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 228 return data.isApprox(m2.
data, prec);
231 MotionTpl se3Action_impl(
const SE3 & m)
const 233 Vector3 Rw (m.rotation()*angular_impl());
234 return MotionTpl( m.rotation()*linear_impl() + m.translation().cross(Rw),
240 return MotionTpl( m.rotation().transpose()*(linear_impl()-m.translation().cross(angular_impl())),
241 m.rotation().transpose()*angular_impl());
244 void disp_impl(std::ostream & os)
const 246 os <<
" v = " << linear_impl().transpose () << std::endl
247 <<
" w = " << angular_impl().transpose () << std::endl;
270 template<
typename S,
int O>
272 template<
typename S,
int O>
275 template<
typename S,
int O>
286 typedef double Scalar;
287 typedef Eigen::Matrix<double,3,1,0> Vector3;
288 typedef Eigen::Matrix<double,4,1,0> Vector4;
289 typedef Eigen::Matrix<double,6,1,0> Vector6;
290 typedef Eigen::Matrix<double,3,3,0> Matrix3;
291 typedef Eigen::Matrix<double,4,4,0> Matrix4;
292 typedef Eigen::Matrix<double,6,6,0> Matrix6;
293 typedef Matrix6 ActionMatrix_t;
294 typedef Vector3 Angular_t;
295 typedef const Vector3 ConstAngular_t;
296 typedef Vector3 Linear_t;
297 typedef const Vector3 ConstLinear_t;
298 typedef Eigen::Quaternion<double,0> Quaternion_t;
311 SPATIAL_TYPEDEF_NO_TEMPLATE(
BiasZero);
312 operator Motion ()
const {
return Motion::Zero(); }
320 #endif // ifndef __se3_motion_hpp__
Concreate Class representing a force.
ConstLinear_t linear_impl() const
Return the linear part of the force vector.
const Vector6 & toVector() const
Return the force.
MotionTpl se3ActionInverse_impl(const SE3 &m) const
bv = aXb.actInv(av)
Vector6 data
Compute the classical acceleration of point according to the spatial velocity and spatial acceleratio...
ConstAngular_t angular_impl() const
Return the angular part of the force vector.