pinocchio  2.4.4
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
matrix.hpp
1 //
2 // Copyright (c) 2016-2020 CNRS INRIA
3 //
4 
5 #ifndef __pinocchio_math_matrix_hpp__
6 #define __pinocchio_math_matrix_hpp__
7 
8 #include "pinocchio/macros.hpp"
9 #include "pinocchio/math/fwd.hpp"
10 
11 #include <Eigen/Core>
12 #include <boost/type_traits.hpp>
13 
14 namespace pinocchio
15 {
16 
17  template<typename Derived>
18  inline bool hasNaN(const Eigen::DenseBase<Derived> & m)
19  {
20  return !((m.derived().array()==m.derived().array()).all());
21  }
22 
23  template<typename M1, typename M2>
25  {
26 #if EIGEN_VERSION_AT_LEAST(3,2,90)
27  typedef typename Eigen::Product<M1,M2> type;
28 #else
29  typedef typename Eigen::ProductReturnType<M1,M2>::Type type;
30 #endif
31  };
32 
33  template<typename Scalar, typename Matrix>
35  {
36 #if EIGEN_VERSION_AT_LEAST(3,3,0)
37  typedef Eigen::CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_,product),_op)<Scalar,typename Eigen::internal::traits<Matrix>::Scalar>,
38  const typename Eigen::internal::plain_constant_type<Matrix,Scalar>::type, const Matrix> type;
39 #elif EIGEN_VERSION_AT_LEAST(3,2,90)
40  typedef Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const Matrix> type;
41 #else
42  typedef const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const Matrix> type;
43 #endif
44  };
45 
46  template<typename Matrix, typename Scalar>
48  {
49 #if EIGEN_VERSION_AT_LEAST(3,3,0)
50  typedef Eigen::CwiseBinaryOp<EIGEN_CAT(EIGEN_CAT(Eigen::internal::scalar_,product),_op)<typename Eigen::internal::traits<Matrix>::Scalar,Scalar>,
51  const Matrix, const typename Eigen::internal::plain_constant_type<Matrix,Scalar>::type> type;
52 #elif EIGEN_VERSION_AT_LEAST(3,2,90)
53  typedef Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const Matrix> type;
54 #else
55  typedef const Eigen::CwiseUnaryOp<Eigen::internal::scalar_multiple_op<Scalar>, const Matrix> type;
56 #endif
57  };
58 
59  namespace internal
60  {
61  template<typename MatrixLike, bool value = boost::is_floating_point<typename MatrixLike::Scalar>::value>
62  struct isUnitaryAlgo
63  {
64  typedef typename MatrixLike::Scalar Scalar;
65  typedef typename MatrixLike::RealScalar RealScalar;
66 
67  static bool run(const Eigen::MatrixBase<MatrixLike> & mat,
68  const RealScalar & prec =
69  Eigen::NumTraits< Scalar >::dummy_precision())
70  {
71  return mat.isUnitary(prec);
72  }
73  };
74 
75  template<typename MatrixLike>
76  struct isUnitaryAlgo<MatrixLike,false>
77  {
78  typedef typename MatrixLike::Scalar Scalar;
79  typedef typename MatrixLike::RealScalar RealScalar;
80 
81  static bool run(const Eigen::MatrixBase<MatrixLike> & /*vec*/,
82  const RealScalar & prec =
83  Eigen::NumTraits< Scalar >::dummy_precision())
84  {
85  PINOCCHIO_UNUSED_VARIABLE(prec);
86  return true;
87  }
88  };
89  }
90 
99  template<typename MatrixLike>
100  inline bool isUnitary(const Eigen::MatrixBase<MatrixLike> & mat,
101  const typename MatrixLike::RealScalar & prec =
102  Eigen::NumTraits< typename MatrixLike::Scalar >::dummy_precision())
103  {
104  return internal::isUnitaryAlgo<MatrixLike>::run(mat,prec);
105  }
106 
107  namespace internal
108  {
109  template<typename VectorLike, bool value = boost::is_floating_point<typename VectorLike::Scalar>::value>
110  struct isNormalizedAlgo
111  {
112  typedef typename VectorLike::Scalar Scalar;
113  typedef typename VectorLike::RealScalar RealScalar;
114 
115  static bool run(const Eigen::MatrixBase<VectorLike> & vec,
116  const RealScalar & prec =
117  Eigen::NumTraits<RealScalar>::dummy_precision())
118  {
119  return math::fabs(vec.norm() - RealScalar(1)) <= prec;
120  }
121  };
122 
123  template<typename VectorLike>
124  struct isNormalizedAlgo<VectorLike,false>
125  {
126  typedef typename VectorLike::Scalar Scalar;
127  typedef typename VectorLike::RealScalar RealScalar;
128 
129  static bool run(const Eigen::MatrixBase<VectorLike> & /*vec*/,
130  const RealScalar & prec =
131  Eigen::NumTraits<RealScalar>::dummy_precision())
132  {
133  PINOCCHIO_UNUSED_VARIABLE(prec);
134  return true;
135  }
136  };
137  }
138 
147  template<typename VectorLike>
148  inline bool isNormalized(const Eigen::MatrixBase<VectorLike> & vec,
149  const typename VectorLike::RealScalar & prec =
150  Eigen::NumTraits< typename VectorLike::Scalar >::dummy_precision())
151  {
152  EIGEN_STATIC_ASSERT_VECTOR_ONLY(VectorLike);
153  return internal::isNormalizedAlgo<VectorLike>::run(vec,prec);
154  }
155 
156  namespace internal
157  {
158  template<typename Scalar>
159  struct CallCorrectMatrixInverseAccordingToScalar
160  {
161  template<typename MatrixIn, typename MatrixOut>
162  static void run(const Eigen::MatrixBase<MatrixIn> & m_in,
163  const Eigen::MatrixBase<MatrixOut> & dest)
164  {
165  MatrixOut & dest_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixOut,dest);
166  dest_.noalias() = m_in.inverse();
167  }
168  };
169 
170  }
171 
172  template<typename MatrixIn, typename MatrixOut>
173  inline void inverse(const Eigen::MatrixBase<MatrixIn> & m_in,
174  const Eigen::MatrixBase<MatrixOut> & dest)
175  {
176  MatrixOut & dest_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixOut,dest);
177  internal::CallCorrectMatrixInverseAccordingToScalar<typename MatrixIn::Scalar>::run(m_in,dest_);
178  }
179 
180 }
181 
182 #endif //#ifndef __pinocchio_math_matrix_hpp__
bool isUnitary(const Eigen::MatrixBase< MatrixLike > &mat, const typename MatrixLike::RealScalar &prec=Eigen::NumTraits< typename MatrixLike::Scalar >::dummy_precision())
Check whether the input matrix is Unitary within the given precision.
Definition: matrix.hpp:100
bool isNormalized(const Eigen::MatrixBase< VectorLike > &vec, const typename VectorLike::RealScalar &prec=Eigen::NumTraits< typename VectorLike::Scalar >::dummy_precision())
Check whether the input vector is Normalized within the given precision.
Definition: matrix.hpp:148
Main pinocchio namespace.
Definition: treeview.dox:24