pinocchio  3.6.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
explog.hpp
1 //
2 // Copyright (c) 2015-2021 CNRS INRIA
3 // Copyright (c) 2015 Wandercraft, 86 rue de Paris 91400 Orsay, France.
4 //
5 
6 #ifndef __pinocchio_python_explog_hpp__
7 #define __pinocchio_python_explog_hpp__
8 
9 #include "pinocchio/spatial/explog.hpp"
10 
11 namespace pinocchio
12 {
13  namespace python
14  {
15 
16  template<typename Vector3Like>
17  Eigen::
18  Matrix<typename Vector3Like::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
19  exp3_proxy(const Vector3Like & v)
20  {
21  return exp3(v);
22  }
23 
24  template<typename Vector3Like>
25  Eigen::
26  Matrix<typename Vector3Like::Scalar, 4, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
27  exp3_proxy_quat(const Vector3Like & v)
28  {
29  typedef typename Vector3Like::Scalar Scalar;
30  typedef Eigen::Quaternion<Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
31  Quaternion_t;
32  typedef Eigen::Map<Quaternion_t> QuaternionMap_t;
33  typedef Eigen::Matrix<Scalar, 4, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
34  ReturnType;
35  ReturnType res;
36  QuaternionMap_t quat_out(res.derived().data());
37  quaternion::exp3(v, quat_out);
38  return res;
39  }
40 
41  template<typename Vector3Like>
42  Eigen::
43  Matrix<typename Vector3Like::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
44  Jexp3_proxy(const Vector3Like & v)
45  {
46  typedef Eigen::Matrix<
47  typename Vector3Like::Scalar, 3, 3, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector3Like)::Options>
48  ReturnType;
49  ReturnType res;
50  Jexp3(v, res);
51  return res;
52  }
53 
54  template<typename Matrix3Like>
55  typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like) Jlog3_proxy(const Matrix3Like & M)
56  {
57  typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like) ReturnType;
58  ReturnType res;
59  Jlog3(M, res);
60  return res;
61  }
62 
63  template<typename Matrix3Like, typename Vector3Like>
64  typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like)
65  Hlog3_proxy(const Matrix3Like & M, const Vector3Like & v)
66  {
67  typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like) ReturnType;
68  ReturnType res;
69  Hlog3(M, v, res);
70  return res;
71  }
72 
73  template<typename Scalar, int Options>
74  SE3Tpl<Scalar, Options> exp6_proxy(const MotionTpl<Scalar, Options> & v)
75  {
76  return exp6(v);
77  }
78 
79  template<typename Vector6Like>
80  SE3Tpl<typename Vector6Like::Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6Like)::Options>
81  exp6_proxy(const Vector6Like & vec6)
82  {
83  return exp6(vec6);
84  }
85 
86  template<typename Vector6Like>
87  Eigen::
88  Matrix<typename Vector6Like::Scalar, 7, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6Like)::Options>
89  exp6_proxy_quatvec(const Vector6Like & vec6)
90  {
91  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector6Like, 6);
92  return quaternion::exp6(vec6); // use quaternion-exp6 overload
93  }
94 
95  template<typename Scalar, int Options>
96  typename SE3Tpl<Scalar, Options>::Matrix6 Jlog6_proxy(const SE3Tpl<Scalar, Options> & M)
97  {
98  typedef typename SE3Tpl<Scalar, Options>::Matrix6 ReturnType;
99  ReturnType res;
100  Jlog6(M, res);
101  return res;
102  }
103 
104  template<typename Scalar, int Options>
105  typename MotionTpl<Scalar, Options>::Matrix6 Jexp6_proxy(const MotionTpl<Scalar, Options> & v)
106  {
107  typedef typename MotionTpl<Scalar, Options>::Matrix6 ReturnType;
108  ReturnType res;
109  Jexp6(v, res);
110  return res;
111  }
112 
113  template<typename Vector6Like>
114  Eigen::
115  Matrix<typename Vector6Like::Scalar, 6, 6, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector6Like)::Options>
116  Jexp6_proxy(const Vector6Like & vec6)
117  {
118  typedef MotionRef<const Vector6Like> Motion;
119  Motion v(vec6);
120  typedef typename Motion::Matrix6 ReturnType;
121  ReturnType res;
122  Jexp6(v, res);
123  return res;
124  }
125 
126  template<typename Matrix3Like>
127  Eigen::
128  Matrix<typename Matrix3Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like)::Options>
129  log3_proxy(const Matrix3Like & R)
130  {
131  return log3(R);
132  }
133 
134  template<typename Matrix3Like, typename Matrix1Like>
135  Eigen::
136  Matrix<typename Matrix3Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like)::Options>
137  log3_proxy(const Matrix3Like & R, Eigen::Ref<Matrix1Like> theta)
138  {
139  return log3(R, theta.coeffRef(0, 0));
140  }
141 
142  template<typename Matrix3Like, typename Scalar>
143  Eigen::
144  Matrix<typename Matrix3Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix3Like)::Options>
145  log3_proxy_fix(const Matrix3Like & R, Scalar & theta)
146  {
147  return log3(R, theta);
148  }
149 
150  template<typename QuaternionLike>
151  Eigen::Matrix<
152  typename QuaternionLike::Scalar,
153  3,
154  1,
155  PINOCCHIO_EIGEN_PLAIN_TYPE(typename QuaternionLike::Vector3)::Options>
156  log3_proxy(const QuaternionLike & quat)
157  {
158  return quaternion::log3(quat);
159  }
160 
161  template<typename Vector4Like>
162  Eigen::
163  Matrix<typename Vector4Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
164  log3_proxy_quatvec(const Vector4Like & v)
165  {
166  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector4Like, 4);
167  typedef typename Vector4Like::Scalar Scalar;
168  typedef Eigen::Quaternion<Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
169  Quaternion_t;
170  typedef Eigen::Map<const Quaternion_t> ConstQuaternionMap_t;
171 
172  ConstQuaternionMap_t q(v.derived().data());
173  assert(quaternion::isNormalized(q));
174  return quaternion::log3(q);
175  }
176 
177  template<typename Vector4Like, typename Matrix1Like>
178  Eigen::
179  Matrix<typename Vector4Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
180  log3_proxy_quatvec(const Vector4Like & v, Eigen::Ref<Matrix1Like> theta)
181  {
182  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector4Like, 4);
183  typedef typename Vector4Like::Scalar Scalar;
184  typedef Eigen::Quaternion<Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
185  Quaternion_t;
186  typedef Eigen::Map<const Quaternion_t> ConstQuaternionMap_t;
187 
188  ConstQuaternionMap_t q(v.derived().data());
189  assert(quaternion::isNormalized(q));
190 
191  return quaternion::log3(q, theta.coeffRef(0, 0));
192  }
193 
194  template<typename Vector4Like, typename _Scalar>
195  Eigen::
196  Matrix<typename Vector4Like::Scalar, 3, 1, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
197  log3_proxy_quatvec_fix(const Vector4Like & v, _Scalar & theta)
198  {
199  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector4Like, 4);
200  typedef typename Vector4Like::Scalar Scalar;
201  typedef Eigen::Quaternion<Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector4Like)::Options>
202  Quaternion_t;
203  typedef Eigen::Map<const Quaternion_t> ConstQuaternionMap_t;
204 
205  ConstQuaternionMap_t q(v.derived().data());
206  assert(quaternion::isNormalized(q));
207 
208  return quaternion::log3(q, theta);
209  }
210 
211  template<typename Matrix4Like>
212  MotionTpl<typename Matrix4Like::Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix4Like)::Options>
213  log6_proxy(const Matrix4Like & homegenous_matrix)
214  {
215  return log6(homegenous_matrix);
216  }
217 
218  template<typename Vector7Like>
219  MotionTpl<typename Vector7Like::Scalar, PINOCCHIO_EIGEN_PLAIN_TYPE(Vector7Like)::Options>
220  log6_proxy_quatvec(const Vector7Like & q)
221  {
222  EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector7Like, 7);
223  typedef typename Vector7Like::Scalar Scalar;
224  enum
225  {
226  Options = PINOCCHIO_EIGEN_PLAIN_TYPE(Vector7Like)::Options
227  };
228  typedef Eigen::Quaternion<Scalar, Options> Quaternion;
229  typedef Eigen::Map<const Quaternion, Options> ConstQuaternionMap;
230  typedef Eigen::Matrix<Scalar, 3, 1, Options> Vector3;
231 
232  const Vector3 v(q.derived().template head<3>());
233  ConstQuaternionMap quat(q.derived().template tail<4>().data());
234 
235  return log6(quat, v);
236  }
237  } // namespace python
238 } // namespace pinocchio
239 
240 #endif // ifndef __pinocchio_python_explog_hpp__
void exp3(const Eigen::MatrixBase< Vector3Like > &v, Eigen::QuaternionBase< QuaternionLike > &quat_out)
Exp: so3 -> SO3 (quaternion)
void exp6(const MotionDense< MotionDerived > &motion, Eigen::MatrixBase< Config_t > &qout)
The se3 -> SE3 exponential map, using quaternions to represent the output rotation.
bool isNormalized(const Eigen::QuaternionBase< Quaternion > &quat, const typename Quaternion::Coefficients::RealScalar &prec)
Check whether the input quaternion is Normalized within the given precision.
Definition: quaternion.hpp:230
Eigen::Matrix< typename QuaternionLike::Scalar, 3, 1, typename QuaternionLike::Vector3 ::Options > log3(const Eigen::QuaternionBase< QuaternionLike > &quat, typename QuaternionLike::Scalar &theta)
Same as log3 but with a unit quaternion as input.
Main pinocchio namespace.
Definition: treeview.dox:11
void Jexp3(const Eigen::MatrixBase< Vector3Like > &r, const Eigen::MatrixBase< Matrix3Like > &Jexp)
Derivative of .
Definition: explog.hpp:118
Eigen::Matrix< typename Vector3Like::Scalar, 3, 3, Vector3Like ::Options > exp3(const Eigen::MatrixBase< Vector3Like > &v)
Exp: so3 -> SO3.
Definition: explog.hpp:36
void Jexp6(const MotionDense< MotionDerived > &nu, const Eigen::MatrixBase< Matrix6Like > &Jexp)
Derivative of exp6 Computed as the inverse of Jlog6.
Definition: explog.hpp:496
MotionTpl< Scalar, Options > log6(const SE3Tpl< Scalar, Options > &M)
Log: SE3 -> se3.
Definition: explog.hpp:435
SE3Tpl< typename MotionDerived::Scalar, typename MotionDerived::Vector3 ::Options > exp6(const MotionDense< MotionDerived > &nu)
Exp: se3 -> SE3.
Definition: explog.hpp:347
void Jlog3(const Scalar &theta, const Eigen::MatrixBase< Vector3Like > &log, const Eigen::MatrixBase< Matrix3Like > &Jlog)
Derivative of log3.
Definition: explog.hpp:240
Eigen::Matrix< typename Matrix3Like::Scalar, 3, 1, Matrix3Like ::Options > log3(const Eigen::MatrixBase< Matrix3Like > &R, typename Matrix3Like::Scalar &theta)
Same as log3.
Definition: explog.hpp:83
void Jlog6(const SE3Tpl< Scalar, Options > &M, const Eigen::MatrixBase< Matrix6Like > &Jlog)
Derivative of log6.
Definition: explog.hpp:668