pinocchio  2.1.3
spatial-axis.hpp
1 //
2 // Copyright (c) 2017-2018 CNRS
3 //
4 
5 #ifndef __pinocchio_spatial_axis_hpp__
6 #define __pinocchio_spatial_axis_hpp__
7 
8 #include "pinocchio/spatial/fwd.hpp"
9 #include "pinocchio/spatial/cartesian-axis.hpp"
10 #include "pinocchio/spatial/motion.hpp"
11 #include "pinocchio/spatial/force.hpp"
12 
13 namespace pinocchio
14 {
15  template<int axis> struct SpatialAxis;
16 
17  namespace internal
18  {
19  template<int axis, typename MotionDerived>
20  struct MotionAlgebraAction<SpatialAxis<axis>, MotionDerived>
21  { typedef typename MotionDerived::MotionPlain ReturnType; };
22  }
23 
24  template<int _axis>
25  struct SpatialAxis //: MotionBase< SpatialAxis<_axis> >
26  {
27  enum { axis = _axis, dim = 6 };
29 
30  enum { LINEAR = 0, ANGULAR = 3 };
31 
32  template<typename Derived1, typename Derived2>
33  inline static void cross(const MotionDense<Derived1> & min,
34  const MotionDense<Derived2> & mout);
35 
36  template<typename Derived>
37  static typename traits<Derived>::MotionPlain cross(const MotionDense<Derived> & min)
38  {
40  cross(min,res);
41  return res;
42  }
43 
44  template<typename Derived1, typename Derived2>
45  inline static void cross(const ForceDense<Derived1> & fin,
46  const ForceDense<Derived2> & fout);
47 
48  template<typename Derived>
49  static typename traits<Derived>::ForcePlain cross(const ForceDense<Derived> & fin)
50  {
51  typename ForceDense<Derived>::ForcePlain fout;
52  cross(fin,fout);
53  return fout;
54  }
55 
56  template<typename Scalar>
57  MotionTpl<Scalar> operator*(const Scalar & s) const
58  {
59  typedef MotionTpl<Scalar> ReturnType;
60  ReturnType res;
61  for(Eigen::DenseIndex i = 0; i < dim; ++i)
62  res.toVector()[i] = i == axis ? s : Scalar(0);
63 
64  return res;
65  }
66 
67  template<typename Scalar>
68  friend inline MotionTpl<Scalar>
69  operator*(const Scalar & s, const SpatialAxis &)
70  {
71  return SpatialAxis() * s;
72  }
73 
74  template<typename Derived>
75  friend Derived & operator<<(MotionDense<Derived> & min,
76  const SpatialAxis &)
77  {
78  typedef typename traits<Derived>::Scalar Scalar;
79  min.setZero();
80  min.toVector()[axis] = Scalar(1);
81  return min.derived();
82  }
83 
84  template<typename MotionDerived>
85  typename MotionDerived::MotionPlain
86  motionAction(const MotionDense<MotionDerived> & m) const
87  {
88  typename MotionDerived::MotionPlain res;
89  if((LINEAR == 0 && axis<3) || (LINEAR == 3 && axis >= 3))
90  {
91  res.angular().setZero();
92  CartesianAxis3::cross(-m.angular(),res.linear());
93  }
94  else
95  {
96  CartesianAxis3::cross(-m.linear(),res.linear());
97  CartesianAxis3::cross(-m.angular(),res.angular());
98  }
99 
100  return res;
101  }
102 
103  }; // struct SpatialAxis
104 
105  template<int axis>
106  template<typename Derived1, typename Derived2>
107  inline void SpatialAxis<axis>::cross(const MotionDense<Derived1> & min,
108  const MotionDense<Derived2> & mout)
109  {
110  Derived2 & mout_ = const_cast<MotionDense<Derived2> &>(mout).derived();
111  if((LINEAR == 0 && axis<3) || (LINEAR == 3 && axis >= 3))
112  {
113  mout_.angular().setZero();
114  CartesianAxis3::cross(min.angular(),mout_.linear());
115  }
116  else
117  {
118  CartesianAxis3::cross(min.linear(),mout_.linear());
119  CartesianAxis3::cross(min.angular(),mout_.angular());
120  }
121  }
122 
123  template<int axis>
124  template<typename Derived1, typename Derived2>
125  inline void SpatialAxis<axis>::cross(const ForceDense<Derived1> & fin,
126  const ForceDense<Derived2> & fout)
127  {
128  Derived2 & fout_ = const_cast<ForceDense<Derived2> &>(fout).derived();
129  if((LINEAR == 0 && axis<3) || (LINEAR == 3 && axis >= 3))
130  {
131  fout_.linear().setZero();
132  CartesianAxis3::cross(fin.linear(),fout_.angular());
133  }
134  else
135  {
136  CartesianAxis3::cross(fin.linear(),fout_.linear());
137  CartesianAxis3::cross(fin.angular(),fout_.angular());
138  }
139  }
140 
141  typedef SpatialAxis<0> AxisVX;
142  typedef SpatialAxis<1> AxisVY;
143  typedef SpatialAxis<2> AxisVZ;
144 
145  typedef SpatialAxis<3> AxisWX;
146  typedef SpatialAxis<4> AxisWY;
147  typedef SpatialAxis<5> AxisWZ;
148 }
149 
150 #endif // __pinocchio_spatial_axis_hpp__
void cross(const Eigen::MatrixBase< Vector3 > &v, const Eigen::MatrixBase< Matrix3xIn > &Min, const Eigen::MatrixBase< Matrix3xOut > &Mout)
Applies the cross product onto the columns of M.
Definition: skew.hpp:211
ConstAngularType angular() const
Return the angular part of the force vector.
Definition: force-base.hpp:40
Main pinocchio namespace.
Definition: treeview.dox:24
Common traits structure to fully define base classes for CRTP.
Definition: spatial/fwd.hpp:29
ConstLinearType linear() const
Return the linear part of the force vector.
Definition: force-base.hpp:47