pinocchio  3.7.0
A fast and flexible implementation of Rigid Body Dynamics algorithms and their analytical derivatives
 
Loading...
Searching...
No Matches
cartesian-axis.hpp
1//
2// Copyright (c) 2017-2020 CNRS INRIA
3//
4
5#ifndef __pinocchio_cartesian_axis_hpp__
6#define __pinocchio_cartesian_axis_hpp__
7
8#include "pinocchio/fwd.hpp"
9
10namespace pinocchio
11{
12
13 template<int _axis>
15 {
16 enum
17 {
18 axis = _axis,
19 dim = 3
20 };
21
22 typedef Eigen::Matrix<double, 3, 1> Vector3;
23
24 template<typename V3_in, typename V3_out>
25 inline static void
26 cross(const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout);
27
28 template<typename V3>
29 static typename PINOCCHIO_EIGEN_PLAIN_TYPE(V3) cross(const Eigen::MatrixBase<V3> & vin)
30 {
31 typename PINOCCHIO_EIGEN_PLAIN_TYPE(V3) res;
32 cross(vin, res);
33 return res;
34 }
35
36 template<typename Scalar, typename V3_in, typename V3_out>
37 inline static void alphaCross(
38 const Scalar & s,
39 const Eigen::MatrixBase<V3_in> & vin,
40 const Eigen::MatrixBase<V3_out> & vout);
41
42 template<typename Scalar, typename V3>
43 static typename PINOCCHIO_EIGEN_PLAIN_TYPE(V3)
44 alphaCross(const Scalar & s, const Eigen::MatrixBase<V3> & vin)
45 {
46 typename PINOCCHIO_EIGEN_PLAIN_TYPE(V3) res;
47 alphaCross(s, vin, res);
48 return res;
49 }
50
51 template<typename Scalar>
52 Eigen::Matrix<Scalar, dim, 1> operator*(const Scalar & s) const
53 {
54 typedef Eigen::Matrix<Scalar, dim, 1> ReturnType;
55 ReturnType res;
56 for (Eigen::DenseIndex i = 0; i < dim; ++i)
57 res[i] = i == axis ? s : Scalar(0);
58
59 return res;
60 }
61
62 template<typename Scalar>
63 friend inline Eigen::Matrix<Scalar, dim, 1> operator*(const Scalar & s, const CartesianAxis &)
64 {
65 return CartesianAxis() * s;
66 }
67
68 template<typename Vector3Like>
69 static void setTo(const Eigen::MatrixBase<Vector3Like> v3)
70 {
71 Vector3Like & v3_ = PINOCCHIO_EIGEN_CONST_CAST(Vector3Like, v3);
72 typedef typename Vector3Like::Scalar Scalar;
73
74 for (Eigen::DenseIndex i = 0; i < dim; ++i)
75 v3_[i] = i == axis ? Scalar(1) : Scalar(0);
76 }
77
78 template<typename Scalar>
79 static Eigen::Matrix<Scalar, 3, 1> vector()
80 {
81 typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
82 return Vector3::Unit(axis);
83 }
84
85 static Vector3 vector()
86 {
87 return vector<double>();
88 }
89
90 }; // struct CartesianAxis
91
92 template<>
93 template<typename V3_in, typename V3_out>
94 inline void CartesianAxis<0>::cross(
95 const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
96 {
99 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
100 vout_[0] = 0.;
101 vout_[1] = -vin[2];
102 vout_[2] = vin[1];
103 }
104
105 template<>
107 inline void CartesianAxis<1>::cross(
108 const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
109 {
112 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
113 vout_[0] = vin[2];
114 vout_[1] = 0.;
115 vout_[2] = -vin[0];
116 }
117
118 template<>
120 inline void CartesianAxis<2>::cross(
121 const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
122 {
125 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
126 vout_[0] = -vin[1];
127 vout_[1] = vin[0];
128 vout_[2] = 0.;
129 }
130
131 template<>
133 inline void CartesianAxis<0>::alphaCross(
134 const Scalar & s, const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
135 {
138 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
139 vout_[0] = 0.;
140 vout_[1] = -s * vin[2];
141 vout_[2] = s * vin[1];
142 }
143
144 template<>
146 inline void CartesianAxis<1>::alphaCross(
147 const Scalar & s, const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
148 {
151 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
152 vout_[0] = s * vin[2];
153 vout_[1] = 0.;
154 vout_[2] = -s * vin[0];
155 }
156
157 template<>
159 inline void CartesianAxis<2>::alphaCross(
160 const Scalar & s, const Eigen::MatrixBase<V3_in> & vin, const Eigen::MatrixBase<V3_out> & vout)
161 {
164 V3_out & vout_ = PINOCCHIO_EIGEN_CONST_CAST(V3_out, vout);
165 vout_[0] = -s * vin[1];
166 vout_[1] = s * vin[0];
167 vout_[2] = 0.;
168 }
169
172
175
178
179} // namespace pinocchio
180
181#endif // __pinocchio_cartesian_axis_hpp__
Main pinocchio namespace.
Definition treeview.dox:11
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:228