pinocchio  3.3.1
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
force-ref.hpp
1 //
2 // Copyright (c) 2017-2019 CNRS INRIA
3 //
4 
5 #ifndef __pinocchio_spatial_force_ref_hpp__
6 #define __pinocchio_spatial_force_ref_hpp__
7 
8 namespace pinocchio
9 {
10 
11  template<typename Vector6ArgType>
12  struct traits<ForceRef<Vector6ArgType>>
13  {
14  typedef typename Vector6ArgType::Scalar Scalar;
15  typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6ArgType) Vector6;
16  enum
17  {
18  LINEAR = 0,
19  ANGULAR = 3,
20  Options = Vector6::Options
21  };
22  typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
23  typedef Eigen::Matrix<Scalar, 4, 4, Options> Matrix4;
24  typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
25  typedef Matrix6 ActionMatrixType;
26  typedef Matrix4 HomogeneousMatrixType;
27  typedef typename Vector6ArgType::template FixedSegmentReturnType<3>::Type LinearType;
28  typedef typename Vector6ArgType::template FixedSegmentReturnType<3>::Type AngularType;
29  typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstLinearType;
30  typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstAngularType;
32  typedef typename PINOCCHIO_EIGEN_REF_TYPE(Vector6ArgType) DataRefType;
33  typedef DataRefType ToVectorReturnType;
34  typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) ConstDataRefType;
35  typedef ConstDataRefType ToVectorConstReturnType;
37 
38  }; // traits ForceRef
39 
40  template<typename Vector6ArgType>
41  struct SE3GroupAction<ForceRef<Vector6ArgType>>
42  {
43  typedef typename traits<ForceRef<Vector6ArgType>>::ForcePlain ReturnType;
44  };
45 
46  template<typename Vector6ArgType, typename MotionDerived>
47  struct MotionAlgebraAction<ForceRef<Vector6ArgType>, MotionDerived>
48  {
49  typedef typename traits<ForceRef<Vector6ArgType>>::ForcePlain ReturnType;
50  };
51 
52  template<typename Vector6ArgType>
53  class ForceRef : public ForceDense<ForceRef<Vector6ArgType>>
54  {
55  public:
56  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
57  typedef ForceDense<ForceRef> Base;
58  typedef typename traits<ForceRef>::DataRefType DataRefType;
59  FORCE_TYPEDEF_TPL(ForceRef);
60 
61  using Base::operator=;
62  using Base::operator==;
63  using Base::operator!=;
64 
66  ForceRef(typename PINOCCHIO_EIGEN_REF_TYPE(Vector6ArgType) f_like)
67  : m_ref(f_like)
68  {
69  EIGEN_STATIC_ASSERT(
70  Vector6ArgType::ColsAtCompileTime == 1, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX);
71  assert(f_like.size() == 6);
72  }
73 
75  ForceRef(const ForceRef & other)
76  : m_ref(other.m_ref)
77  {
78  }
79 
80  ToVectorConstReturnType toVector_impl() const
81  {
82  return m_ref;
83  }
84  ToVectorReturnType toVector_impl()
85  {
86  return m_ref;
87  }
88 
89  // Getters
90  ConstAngularType angular_impl() const
91  {
92  return ConstAngularType(m_ref.derived(), ANGULAR);
93  }
94  ConstLinearType linear_impl() const
95  {
96  return ConstLinearType(m_ref.derived(), LINEAR);
97  }
98  AngularType angular_impl()
99  {
100  return m_ref.template segment<3>(ANGULAR);
101  }
102  LinearType linear_impl()
103  {
104  return m_ref.template segment<3>(LINEAR);
105  }
106 
107  template<typename V3>
108  void angular_impl(const Eigen::MatrixBase<V3> & w)
109  {
110  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(V3, 3);
111  angular_impl() = w;
112  }
113 
114  template<typename V3>
115  void linear_impl(const Eigen::MatrixBase<V3> & v)
116  {
117  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(V3, 3);
118  linear_impl() = v;
119  }
120 
121  ForceRef & ref()
122  {
123  return *this;
124  }
125 
126  protected:
127  DataRefType m_ref;
128 
129  }; // class ForceRef<Vector6Like>
130 
131  template<typename Vector6ArgType>
132  struct traits<ForceRef<const Vector6ArgType>>
133  {
134  typedef typename Vector6ArgType::Scalar Scalar;
135  typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6ArgType) Vector6;
136  enum
137  {
138  LINEAR = 0,
139  ANGULAR = 3,
140  Options = Vector6::Options
141  };
142  typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
143  typedef Eigen::Matrix<Scalar, 6, 6, Options> Matrix6;
144  typedef Matrix6 ActionMatrixType;
145  typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstLinearType;
146  typedef typename Vector6ArgType::template ConstFixedSegmentReturnType<3>::Type ConstAngularType;
147  typedef ConstLinearType LinearType;
148  typedef ConstAngularType AngularType;
150  typedef ForcePlain PlainReturnType;
151  typedef typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) ConstDataRefType;
152  typedef ConstDataRefType ToVectorConstReturnType;
153  typedef ConstDataRefType DataRefType;
154  typedef DataRefType ToVectorReturnType;
156 
157  }; // traits ForceRef<const Vector6ArgType>
158 
159  template<typename Vector6ArgType>
160  class ForceRef<const Vector6ArgType> : public ForceDense<ForceRef<const Vector6ArgType>>
161  {
162  public:
163  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
164  typedef ForceDense<ForceRef> Base;
165  typedef typename traits<ForceRef>::DataRefType DataRefType;
166  FORCE_TYPEDEF_TPL(ForceRef);
167 
168  ForceRef(typename PINOCCHIO_EIGEN_REF_CONST_TYPE(Vector6ArgType) f_like)
169  : m_ref(f_like)
170  {
171  EIGEN_STATIC_ASSERT(
172  Vector6ArgType::ColsAtCompileTime == 1, YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIX);
173  assert(f_like.size() == 6);
174  }
175 
176  ToVectorConstReturnType toVector_impl() const
177  {
178  return m_ref;
179  }
180 
181  // Getters
182  ConstAngularType angular_impl() const
183  {
184  return ConstAngularType(m_ref.derived(), ANGULAR);
185  }
186  ConstLinearType linear_impl() const
187  {
188  return ConstLinearType(m_ref.derived(), LINEAR);
189  }
190 
191  const ForceRef & ref() const
192  {
193  return *this;
194  }
195 
196  protected:
197  DataRefType m_ref;
198 
199  }; // class ForceRef<Vector6Like>
200 
201 } // namespace pinocchio
202 
203 #endif // ifndef __pinocchio_spatial_force_ref_hpp__
ForceRef(const ForceRef &other)
Copy constructor from another ForceRef.
Definition: force-ref.hpp:75
ForceRef(typename PINOCCHIO_EIGEN_REF_TYPE(Vector6ArgType) f_like)
Default constructor from a 6 dimensional vector.
Definition: force-ref.hpp:66
Main pinocchio namespace.
Definition: treeview.dox:11
Return type of the ation of a Motion onto an object of type D.
Definition: motion.hpp:46
Common traits structure to fully define base classes for CRTP.
Definition: fwd.hpp:72