pinocchio  2.4.4
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
casadi.hpp
1 //
2 // Copyright (c) 2019-2020 INRIA, CNRS
3 //
4 
5 #ifndef __pinocchio_autodiff_casadi_hpp__
6 #define __pinocchio_autodiff_casadi_hpp__
7 
8 #include "pinocchio/math/fwd.hpp"
9 
10 #include <casadi/casadi.hpp>
11 #include <Eigen/Core>
12 
13 namespace boost { namespace math { namespace constants { namespace detail {
14  template<>
15  struct constant_pi<::casadi::SX> : constant_pi<double> {};
16 
17  template<typename Scalar>
18  struct constant_pi< ::casadi::Matrix<Scalar> > : constant_pi<Scalar> {};
19 }}}}
20 
21 // This is a workaround to make the code compiling with Eigen.
22 namespace casadi
23 {
24  inline bool operator||(const bool x, const casadi::Matrix<SXElem> & /*y*/)
25  {
26  return x;
27  }
28 }
29 
30 namespace pinocchio
31 {
32  template<typename Scalar>
33  struct TaylorSeriesExpansion< ::casadi::Matrix<Scalar> >
34  : TaylorSeriesExpansion<Scalar>
35  {
37 
38  template<int degree>
39  static ::casadi::Matrix<Scalar> precision()
40  {
41  return ::casadi::Matrix<Scalar>(Base::template precision<degree>());
42  }
43 
44  };
45 }
46 
47 namespace Eigen
48 {
49  namespace internal
50  {
51  // Specialization of Eigen::internal::cast_impl for Casadi input types
52  template<typename Scalar>
53  struct cast_impl<casadi::SX,Scalar>
54  {
55 #if EIGEN_VERSION_AT_LEAST(3,2,90)
56  EIGEN_DEVICE_FUNC
57 #endif
58  static inline Scalar run(const casadi::SX & x)
59  {
60  return static_cast<Scalar>(x);
61  }
62  };
63 
64 #if EIGEN_VERSION_AT_LEAST(3,2,90) && !EIGEN_VERSION_AT_LEAST(3,2,93)
65  template<typename Scalar, bool IsInteger>
66  struct significant_decimals_default_impl< ::casadi::Matrix<Scalar>,IsInteger>
67  {
68  static inline int run()
69  {
70  return std::numeric_limits<Scalar>::digits10;
71  }
72  };
73 #endif
74  }
75 }
76 
77 namespace Eigen
78 {
81  template<typename Scalar>
82  struct NumTraits< casadi::Matrix<Scalar> >
83  {
84  using Real = casadi::Matrix<Scalar>;
85  using NonInteger = casadi::Matrix<Scalar>;
86  using Literal = casadi::Matrix<Scalar>;
87  using Nested = casadi::Matrix<Scalar>;
88 
89  enum {
90  // does not support complex Base types
91  IsComplex = 0 ,
92  // does not support integer Base types
93  IsInteger = 0 ,
94  // only support signed Base types
95  IsSigned = 1 ,
96  // must initialize an AD<Base> object
97  RequireInitialization = 1 ,
98  // computational cost of the corresponding operations
99  ReadCost = 1 ,
100  AddCost = 2 ,
101  MulCost = 2
102  };
103 
104  static casadi::Matrix<Scalar> epsilon()
105  {
106  return casadi::Matrix<Scalar>(std::numeric_limits<double>::epsilon());
107  }
108 
109  static casadi::Matrix<Scalar> dummy_precision()
110  {
111  return casadi::Matrix<Scalar>(NumTraits<double>::dummy_precision());
112  }
113 
114  static casadi::Matrix<Scalar> highest()
115  {
116  return casadi::Matrix<Scalar>(std::numeric_limits<double>::max());
117  }
118 
119  static casadi::Matrix<Scalar> lowest()
120  {
121  return casadi::Matrix<Scalar>(std::numeric_limits<double>::min());
122  }
123 
124  static int digits10()
125  {
126  return std::numeric_limits<double>::digits10;
127  }
128  };
129 } // namespace Eigen
130 
131 namespace pinocchio
132 {
133  namespace casadi
134  {
135  // Copy casadi matrix to Eigen matrix
136  template<typename MT, typename Scalar>
137  inline void copy(::casadi::Matrix<Scalar> const & src,
138  Eigen::MatrixBase<MT> & dst)
139  {
140  Eigen::Index const m = src.size1();
141  Eigen::Index const n = src.size2();
142 
143  dst.resize(m, n);
144 
145  for (Eigen::Index i = 0; i < m; ++i)
146  for (Eigen::Index j = 0; j < n; ++j)
147  dst(i, j) = src(i, j);
148  }
149 
150 
151  // Copy Eigen matrix to casadi matrix
152  template<typename MT, typename Scalar>
153  inline void copy(Eigen::MatrixBase<MT> const & src,
154  ::casadi::Matrix<Scalar> & dst)
155  {
156  Eigen::Index const m = src.rows();
157  Eigen::Index const n = src.cols();
158 
159  dst.resize(m, n);
160 
161  for (Eigen::Index i = 0; i < m; ++i)
162  for (Eigen::Index j = 0; j < n; ++j)
163  dst(i, j) = src(i, j);
164  }
165 
166  // Make an Eigen matrix consisting of pure casadi symbolics
167  template<typename MatrixDerived>
168  inline void sym(const Eigen::MatrixBase<MatrixDerived> & eig_mat,
169  std::string const & name)
170  {
171  typedef typename MatrixDerived::Scalar SX;
172 
173  MatrixDerived & eig_mat_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixDerived,eig_mat);
174  for (Eigen::Index i = 0; i < eig_mat.rows(); ++i)
175  for (Eigen::Index j = 0; j < eig_mat.cols(); ++j)
176  eig_mat_(i, j) = SX::sym(name + "_" + std::to_string(i) + "_" + std::to_string(j));
177  }
178 
179  } // namespace casadi
180 } // namespace pinocchio
181 
182 // Overloading of max operator
183 namespace pinocchio
184 {
185  namespace math
186  {
187  namespace internal
188  {
189  template<typename Scalar>
190  struct return_type_max< ::casadi::Matrix<Scalar>,::casadi::Matrix<Scalar>>
191  {
192  typedef ::casadi::Matrix<Scalar> type;
193  };
194 
195  template<typename Scalar, typename T>
196  struct return_type_max< ::casadi::Matrix<Scalar>,T>
197  {
198  typedef ::casadi::Matrix<Scalar> type;
199  };
200 
201  template<typename Scalar, typename T>
202  struct return_type_max<T,::casadi::Matrix<Scalar> >
203  {
204  typedef ::casadi::Matrix<Scalar> type;
205  };
206 
207  template<typename Scalar>
208  struct call_max< ::casadi::Matrix<Scalar>,::casadi::Matrix<Scalar> >
209  {
210  static inline ::casadi::Matrix<Scalar> run(const ::casadi::Matrix<Scalar> & a,
211  const ::casadi::Matrix<Scalar> & b)
212  { return fmax(a,b); }
213  };
214 
215  template<typename S1, typename S2>
216  struct call_max< ::casadi::Matrix<S1>,S2>
217  {
218  typedef ::casadi::Matrix<S1> CasadiType;
219  static inline ::casadi::Matrix<S1> run(const ::casadi::Matrix<S1> & a,
220  const S2 & b)
221  { return fmax(a,static_cast<CasadiType>(b)); }
222  };
223 
224  template<typename S1, typename S2>
225  struct call_max<S1,::casadi::Matrix<S2>>
226  {
227  typedef ::casadi::Matrix<S2> CasadiType;
228  static inline ::casadi::Matrix<S2> run(const S1 & a,
229  const ::casadi::Matrix<S2> & b)
230  { return fmax(static_cast<CasadiType>(a),b); }
231  };
232  } // namespace internal
233 
234  } // namespace math
235 
236 } // namespace pinocchio
237 
238 #include "pinocchio/autodiff/casadi/spatial/se3-tpl.hpp"
239 #include "pinocchio/autodiff/casadi/utils/static-if.hpp"
240 #include "pinocchio/autodiff/casadi/math/matrix.hpp"
241 #include "pinocchio/autodiff/casadi/math/quaternion.hpp"
242 
243 #endif // #ifndef __pinocchio_autodiff_casadi_hpp__
Definition: casadi.hpp:13
Definition: casadi.hpp:47
Main pinocchio namespace.
Definition: treeview.dox:24