GCC Code Coverage Report


Directory: ./
File: include/pinocchio/algorithm/centroidal-derivatives.hxx
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 198 198 100.0%
Branches: 249 901 27.6%

Line Branch Exec Source
1 //
2 // Copyright (c) 2018-2021 INRIA
3 //
4
5 #ifndef __pinocchio_algorithm_centroidal_derivatives_hxx__
6 #define __pinocchio_algorithm_centroidal_derivatives_hxx__
7
8 #include "pinocchio/multibody/visitor.hpp"
9 #include "pinocchio/spatial/act-on-set.hpp"
10 #include "pinocchio/algorithm/kinematics.hpp"
11 #include "pinocchio/algorithm/check.hpp"
12
13 /// @cond DEV
14
15 namespace pinocchio
16 {
17 namespace impl
18 {
19 template<
20 typename Scalar,
21 int Options,
22 template<typename, int> class JointCollectionTpl,
23 typename ConfigVectorType,
24 typename TangentVectorType1,
25 typename TangentVectorType2>
26 struct CentroidalDynDerivativesForwardStep
27 : public fusion::JointUnaryVisitorBase<CentroidalDynDerivativesForwardStep<
28 Scalar,
29 Options,
30 JointCollectionTpl,
31 ConfigVectorType,
32 TangentVectorType1,
33 TangentVectorType2>>
34 {
35 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
36 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
37
38 typedef typename Model::JointIndex JointIndex;
39
40 typedef boost::fusion::vector<
41 const Model &,
42 Data &,
43 const ConfigVectorType &,
44 const TangentVectorType1 &,
45 const TangentVectorType2 &>
46 ArgsType;
47
48 template<typename JointModel>
49 218 static void algo(
50 const JointModelBase<JointModel> & jmodel,
51 JointDataBase<typename JointModel::JointDataDerived> & jdata,
52 const Model & model,
53 Data & data,
54 const Eigen::MatrixBase<ConfigVectorType> & q,
55 const Eigen::MatrixBase<TangentVectorType1> & v,
56 const Eigen::MatrixBase<TangentVectorType2> & a)
57 {
58 typedef typename Model::JointIndex JointIndex;
59 typedef typename Data::Motion Motion;
60
61
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 const JointIndex & i = jmodel.id();
62 218 const JointIndex & parent = model.parents[i];
63 218 Motion & ov = data.ov[i];
64 218 Motion & oa = data.oa[i];
65
66
1/2
✓ Branch 4 taken 109 times.
✗ Branch 5 not taken.
218 jmodel.calc(jdata.derived(), q.derived(), v.derived());
67
68
6/10
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 104 times.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 104 times.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 104 times.
✗ Branch 13 not taken.
218 data.liMi[i] = model.jointPlacements[i] * jdata.M();
69
70
2/4
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
218 data.v[i] = jdata.v();
71
72
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 4 times.
218 if (parent > 0)
73 {
74
2/4
✓ Branch 3 taken 105 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 105 times.
✗ Branch 8 not taken.
210 data.oMi[i] = data.oMi[parent] * data.liMi[i];
75
2/4
✓ Branch 3 taken 105 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 105 times.
✗ Branch 8 not taken.
210 data.v[i] += data.liMi[i].actInv(data.v[parent]);
76 }
77 else
78
1/2
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
8 data.oMi[i] = data.liMi[i];
79
80
5/9
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 105 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 105 times.
✗ Branch 12 not taken.
436 data.a[i] =
81
7/14
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 109 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 109 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 109 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
436 jdata.S() * jmodel.jointVelocitySelector(a) + jdata.c() + (data.v[i] ^ jdata.v());
82
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 4 times.
218 if (parent > 0)
83 {
84
2/4
✓ Branch 3 taken 105 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 105 times.
✗ Branch 8 not taken.
210 data.a[i] += data.liMi[i].actInv(data.a[parent]);
85 }
86
87
2/4
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 109 times.
✗ Branch 8 not taken.
218 data.oYcrb[i] = data.oMi[i].act(model.inertias[i]);
88
2/4
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 109 times.
✗ Branch 7 not taken.
218 ov = data.oMi[i].act(data.v[i]);
89
2/4
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 109 times.
✗ Branch 7 not taken.
218 oa = data.oMi[i].act(data.a[i]);
90
91
2/4
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 109 times.
✗ Branch 7 not taken.
218 data.oh[i] = data.oYcrb[i] * ov;
92
4/8
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 109 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 109 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 109 times.
✗ Branch 14 not taken.
218 data.of[i] = data.oYcrb[i] * oa + ov.cross(data.oh[i]);
93
94 typedef
95 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
96 ColsBlock;
97
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock J_cols = jmodel.jointCols(data.J);
98
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dJ_cols = jmodel.jointCols(data.dJ);
99
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dVdq_cols = jmodel.jointCols(data.dVdq);
100
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
101
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dAdv_cols = jmodel.jointCols(data.dAdv);
102
103
3/6
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 109 times.
✗ Branch 9 not taken.
218 J_cols = data.oMi[i].act(jdata.S());
104
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 motionSet::motionAction(ov, J_cols, dJ_cols);
105
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::motionAction(data.oa[parent], J_cols, dAdq_cols);
106
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 dAdv_cols = dJ_cols;
107
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 4 times.
218 if (parent > 0)
108 {
109
1/2
✓ Branch 2 taken 105 times.
✗ Branch 3 not taken.
210 motionSet::motionAction(data.ov[parent], J_cols, dVdq_cols);
110
1/2
✓ Branch 2 taken 105 times.
✗ Branch 3 not taken.
210 motionSet::motionAction<ADDTO>(data.ov[parent], dVdq_cols, dAdq_cols);
111
2/4
✓ Branch 1 taken 105 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 105 times.
✗ Branch 5 not taken.
210 dAdv_cols.noalias() += dVdq_cols;
112 }
113 else
114 {
115
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 dVdq_cols.setZero();
116 }
117
118 // computes variation of inertias
119
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 data.doYcrb[i] = data.oYcrb[i].variation(ov);
120
121
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
218 addForceCrossMatrix(data.oh[i], data.doYcrb[i]);
122 }
123
124 template<typename ForceDerived, typename M6>
125 static void
126 109 addForceCrossMatrix(const ForceDense<ForceDerived> & f, const Eigen::MatrixBase<M6> & mout)
127 {
128 109 M6 & mout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, mout);
129
2/4
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 109 times.
✗ Branch 5 not taken.
109 addSkew(
130
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
109 -f.linear(), mout_.template block<3, 3>(ForceDerived::LINEAR, ForceDerived::ANGULAR));
131
2/4
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 109 times.
✗ Branch 5 not taken.
109 addSkew(
132
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
109 -f.linear(), mout_.template block<3, 3>(ForceDerived::ANGULAR, ForceDerived::LINEAR));
133
2/4
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 109 times.
✗ Branch 5 not taken.
109 addSkew(
134
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
109 -f.angular(), mout_.template block<3, 3>(ForceDerived::ANGULAR, ForceDerived::ANGULAR));
135 109 }
136
137 }; // struct CentroidalDynDerivativesForwardStep
138
139 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
140 struct CentroidalDynDerivativesBackwardStep
141 : public fusion::JointUnaryVisitorBase<
142 CentroidalDynDerivativesBackwardStep<Scalar, Options, JointCollectionTpl>>
143 {
144 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
145 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
146
147 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
148
149 template<typename JointModel>
150 218 static void algo(const JointModelBase<JointModel> & jmodel, const Model & model, Data & data)
151 {
152 typedef typename Model::JointIndex JointIndex;
153
154
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 const JointIndex & i = jmodel.id();
155 218 const JointIndex & parent = model.parents[i];
156
157 typedef
158 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
159 ColsBlock;
160
161
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock J_cols = jmodel.jointCols(data.J);
162
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dVdq_cols = jmodel.jointCols(data.dVdq);
163
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
164
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dAdv_cols = jmodel.jointCols(data.dAdv);
165
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dHdq_cols = jmodel.jointCols(data.dHdq);
166
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dFdq_cols = jmodel.jointCols(data.dFdq);
167
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dFdv_cols = jmodel.jointCols(data.dFdv);
168
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
218 ColsBlock dFda_cols = jmodel.jointCols(data.dFda);
169
170 // tau
171
3/6
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 109 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 109 times.
✗ Branch 8 not taken.
218 jmodel.jointVelocitySelector(data.tau).noalias() =
172
3/6
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 109 times.
✗ Branch 9 not taken.
218 J_cols.transpose() * data.of[i].toVector();
173
174 // dtau/da similar to data.M
175
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::inertiaAction(data.oYcrb[i], J_cols, dFda_cols);
176
177 // dtau/dv
178
3/6
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 109 times.
✗ Branch 9 not taken.
218 dFdv_cols.noalias() = data.doYcrb[i] * J_cols;
179
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dAdv_cols, dFdv_cols);
180
181 // dtau/dq
182
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 4 times.
218 if (parent > 0)
183 {
184
3/6
✓ Branch 2 taken 105 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 105 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 105 times.
✗ Branch 9 not taken.
210 dFdq_cols.noalias() = data.doYcrb[i] * dVdq_cols;
185
1/2
✓ Branch 2 taken 105 times.
✗ Branch 3 not taken.
210 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dAdq_cols, dFdq_cols);
186 }
187 else
188
1/2
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
8 motionSet::inertiaAction(data.oYcrb[i], dAdq_cols, dFdq_cols);
189
190
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::act<ADDTO>(J_cols, data.of[i], dFdq_cols);
191
192
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
218 data.oYcrb[parent] += data.oYcrb[i];
193
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
218 data.doYcrb[parent] += data.doYcrb[i];
194
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
218 data.oh[parent] += data.oh[i];
195
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
218 data.of[parent] += data.of[i];
196
197
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::act(J_cols, data.oh[i], dHdq_cols);
198
1/2
✓ Branch 2 taken 109 times.
✗ Branch 3 not taken.
218 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dVdq_cols, dHdq_cols);
199 }
200 }; // struct CentroidalDynDerivativesBackwardStep
201 } // namespace impl
202 namespace
203 {
204 // TODO: should be moved to ForceSet
205 template<typename Matrix6xLikeIn, typename Vector3Like, typename Matrix6xLikeOut>
206 52 void translateForceSet(
207 const Eigen::MatrixBase<Matrix6xLikeIn> & Fin,
208 const Eigen::MatrixBase<Vector3Like> & v3,
209 const Eigen::MatrixBase<Matrix6xLikeOut> & Fout)
210 {
211 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix6xLikeIn, 6, Eigen::Dynamic)
212 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3Like, 3)
213 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix6xLikeOut, 6, Eigen::Dynamic)
214
215
1/24
✗ Branch 2 not taken.
✓ Branch 3 taken 28 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
52 PINOCCHIO_CHECK_ARGUMENT_SIZE(
216 Fin.cols(), Fout.cols(), "Fin and Fout do not have the same number of columns");
217
218
2/2
✓ Branch 1 taken 908 times.
✓ Branch 2 taken 28 times.
1740 for (Eigen::DenseIndex k = 0; k < Fin.cols(); ++k)
219 {
220 typedef ForceRef<typename Matrix6xLikeIn::ColXpr> ForceTypeIn;
221 typedef ForceRef<typename Matrix6xLikeOut::ColXpr> ForceTypeOut;
222
2/4
✓ Branch 2 taken 908 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 908 times.
✗ Branch 6 not taken.
1688 ForceTypeOut fout(PINOCCHIO_EIGEN_CONST_CAST(Matrix6xLikeOut, Fout).col(k));
223
2/4
✓ Branch 2 taken 908 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 908 times.
✗ Branch 6 not taken.
1688 const ForceTypeIn fin(PINOCCHIO_EIGEN_CONST_CAST(Matrix6xLikeIn, Fin).col(k));
224
3/6
✓ Branch 1 taken 908 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 908 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 908 times.
✗ Branch 8 not taken.
1688 fout.linear() = fin.linear();
225
7/14
✓ Branch 1 taken 908 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 908 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 908 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 908 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 908 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 908 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 908 times.
✗ Branch 20 not taken.
1688 fout.angular().noalias() = fin.angular() - v3.cross(fin.linear());
226 }
227 52 }
228
229 template<typename Matrix6xLike, typename Vector3Like, typename Matrix6xLikeOut>
230 void translateForceSet(
231 const Eigen::MatrixBase<Matrix6xLike> & F, const Eigen::MatrixBase<Vector3Like> & v3)
232 {
233 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix6xLike, 6, Eigen::Dynamic)
234 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3Like, 3)
235
236 for (Eigen::DenseIndex k = 0; k < F.cols(); ++k)
237 {
238 typedef ForceRef<typename Matrix6xLike::ColXpr> ForceType;
239 ForceType f(PINOCCHIO_EIGEN_CONST_CAST(Matrix6xLike, F).col(k));
240 f.angular() -= v3.cross(f.linear());
241 }
242 }
243 } // namespace
244 namespace impl
245 {
246 template<
247 typename Scalar,
248 int Options,
249 template<typename, int> class JointCollectionTpl,
250 typename ConfigVectorType,
251 typename TangentVectorType1,
252 typename TangentVectorType2,
253 typename Matrix6xLike0,
254 typename Matrix6xLike1,
255 typename Matrix6xLike2,
256 typename Matrix6xLike3>
257 4 void computeCentroidalDynamicsDerivatives(
258 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
259 DataTpl<Scalar, Options, JointCollectionTpl> & data,
260 const Eigen::MatrixBase<ConfigVectorType> & q,
261 const Eigen::MatrixBase<TangentVectorType1> & v,
262 const Eigen::MatrixBase<TangentVectorType2> & a,
263 const Eigen::MatrixBase<Matrix6xLike0> & dh_dq,
264 const Eigen::MatrixBase<Matrix6xLike1> & dhdot_dq,
265 const Eigen::MatrixBase<Matrix6xLike2> & dhdot_dv,
266 const Eigen::MatrixBase<Matrix6xLike3> & dhdot_da)
267 {
268
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(
269 q.size(), model.nq, "The joint configuration vector is not of right size");
270
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(
271 v.size(), model.nv, "The joint velocity vector is not of right size");
272
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(
273 a.size(), model.nv, "The joint acceleration vector is not of right size");
274
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dh_dq.cols(), model.nv);
275
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dh_dq.rows(), 6);
276
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dq.cols(), model.nv);
277
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dq.rows(), 6);
278
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dv.cols(), model.nv);
279
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dv.rows(), 6);
280
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_da.cols(), model.nv);
281
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
4 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_da.rows(), 6);
282
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
4 assert(model.check(data) && "data is not consistent with model.");
283
284 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
285 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
286 typedef typename Model::JointIndex JointIndex;
287 typedef typename Data::Force Force;
288
289 typedef CentroidalDynDerivativesForwardStep<
290 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1,
291 TangentVectorType2>
292 Pass1;
293
2/2
✓ Branch 0 taken 109 times.
✓ Branch 1 taken 4 times.
113 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
294 {
295
1/2
✓ Branch 1 taken 109 times.
✗ Branch 2 not taken.
109 Pass1::run(
296 109 model.joints[i], data.joints[i],
297 218 typename Pass1::ArgsType(model, data, q.derived(), v.derived(), a.derived()));
298 }
299
300 4 data.oYcrb[0].setZero();
301 4 data.oh[0].setZero();
302 4 data.of[0].setZero();
303 typedef CentroidalDynDerivativesBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
304
2/2
✓ Branch 0 taken 109 times.
✓ Branch 1 taken 4 times.
113 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
305 {
306
1/2
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
109 Pass2::run(model.joints[i], typename Pass2::ArgsType(model, data));
307 }
308
309 // expressed all the quantities around the center of mass
310 typedef typename Data::Inertia Inertia;
311
312 4 const Inertia & Ytot = data.oYcrb[0];
313 4 const typename Inertia::Vector3 & com = Ytot.lever();
314
315 // Mass of the system
316
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
4 data.mass[0] = Ytot.mass();
317
318 // Center of mass of the system
319 4 data.com[0] = Ytot.lever();
320
321 // Compute the centroidal quantities
322 4 data.hg = data.oh[0];
323
3/6
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
4 data.hg.angular() += data.hg.linear().cross(com);
324
325 4 data.dhg = data.of[0];
326
3/6
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
4 data.dhg.angular() += data.dhg.linear().cross(com);
327
328 // Compute centroidal inertia
329
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
4 data.Ig.mass() = Ytot.mass();
330 4 data.Ig.lever().setZero();
331 4 data.Ig.inertia() = Ytot.inertia();
332
333 // Compute the partial derivatives
334 4 translateForceSet(data.dHdq, com, dh_dq.const_cast_derived());
335 4 Matrix6xLike0 & dh_dq_ = dh_dq.const_cast_derived();
336
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 4 times.
135 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
337
5/15
✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 131 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 131 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
131 dh_dq_.col(k).template segment<3>(Force::ANGULAR) +=
338
3/9
✗ Branch 1 not taken.
✓ Branch 2 taken 131 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 131 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 131 times.
✗ Branch 9 not taken.
262 data.hg.linear().cross(data.dFda.col(k).template segment<3>(Force::LINEAR)) / Ytot.mass();
339
340 4 translateForceSet(data.dFdq, com, dhdot_dq.const_cast_derived());
341 4 Matrix6xLike1 & dhdot_dq_ = dhdot_dq.const_cast_derived();
342
2/2
✓ Branch 0 taken 131 times.
✓ Branch 1 taken 4 times.
135 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
343
5/15
✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 131 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 131 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 131 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
131 dhdot_dq_.col(k).template segment<3>(Force::ANGULAR) +=
344
2/6
✓ Branch 1 taken 131 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 131 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
131 data.dhg.linear().cross(data.dFda.col(k).template segment<3>(Force::LINEAR))
345
1/2
✓ Branch 2 taken 131 times.
✗ Branch 3 not taken.
262 / Ytot.mass();
346
347 4 translateForceSet(data.dFdv, com, dhdot_dv.const_cast_derived());
348
349 4 translateForceSet(data.dFda, com, data.Ag);
350 4 dhdot_da.const_cast_derived() = data.Ag;
351 4 }
352
353 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
354 struct GetCentroidalDynDerivativesBackwardStep
355 : public fusion::JointUnaryVisitorBase<
356 GetCentroidalDynDerivativesBackwardStep<Scalar, Options, JointCollectionTpl>>
357 {
358 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
359 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
360
361 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
362
363 template<typename JointModel>
364 162 static void algo(const JointModelBase<JointModel> & jmodel, const Model & model, Data & data)
365 {
366 typedef typename Model::JointIndex JointIndex;
367 typedef typename Data::Vector3 Vector3;
368 typedef
369 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
370 ColsBlock;
371
372
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
162 const JointIndex & i = jmodel.id();
373 162 const JointIndex & parent = model.parents[i];
374
375 162 typename Data::Motion & vtmp = data.v[0];
376 162 typename Data::Matrix6x & Ftmp = data.Fcrb[0];
377
378
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
162 ColsBlock J_cols = jmodel.jointCols(data.J);
379
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
162 ColsBlock dVdq_cols = jmodel.jointCols(data.dVdq);
380
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
162 ColsBlock dHdq_cols = jmodel.jointCols(data.dHdq);
381
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
162 ColsBlock Ftmp_cols = jmodel.jointCols(Ftmp);
382
383
3/6
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 81 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 81 times.
✗ Branch 10 not taken.
162 const Vector3 mg = data.oYcrb[i].mass() * model.gravity.linear();
384
3/4
✓ Branch 1 taken 177 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 96 times.
✓ Branch 4 taken 81 times.
354 for (Eigen::DenseIndex k = 0; k < jmodel.nv(); ++k)
385 {
386
2/4
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
192 MotionRef<typename ColsBlock::ColXpr> mref(J_cols.col(k));
387
6/12
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 96 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 96 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 96 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 96 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 96 times.
✗ Branch 19 not taken.
192 vtmp.linear() = mref.linear() + mref.angular().cross(data.oYcrb[i].lever());
388
389
2/4
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
192 ForceRef<typename ColsBlock::ColXpr> fout(Ftmp_cols.col(k));
390
4/8
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 96 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 96 times.
✗ Branch 11 not taken.
192 fout.angular() += vtmp.linear().cross(mg);
391 }
392
393
1/2
✓ Branch 3 taken 81 times.
✗ Branch 4 not taken.
162 data.oh[parent] += data.oh[i];
394
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 78 times.
162 if (parent == 0)
395 {
396
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
6 data.of[0] += data.of[i];
397
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
6 data.oYcrb[0] += data.oYcrb[i];
398 }
399
400
1/2
✓ Branch 2 taken 81 times.
✗ Branch 3 not taken.
162 motionSet::act(J_cols, data.oh[i], dHdq_cols);
401
1/2
✓ Branch 2 taken 81 times.
✗ Branch 3 not taken.
162 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dVdq_cols, dHdq_cols);
402 }
403 }; // struct GetCentroidalDynDerivativesBackwardStep
404
405 template<
406 typename Scalar,
407 int Options,
408 template<typename, int> class JointCollectionTpl,
409 typename Matrix6xLike0,
410 typename Matrix6xLike1,
411 typename Matrix6xLike2,
412 typename Matrix6xLike3>
413 3 void getCentroidalDynamicsDerivatives(
414 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
415 DataTpl<Scalar, Options, JointCollectionTpl> & data,
416 const Eigen::MatrixBase<Matrix6xLike0> & dh_dq,
417 const Eigen::MatrixBase<Matrix6xLike1> & dhdot_dq,
418 const Eigen::MatrixBase<Matrix6xLike2> & dhdot_dv,
419 const Eigen::MatrixBase<Matrix6xLike3> & dhdot_da)
420 {
421
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dq.cols(), model.nv);
422
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dq.rows(), 6);
423
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dv.cols(), model.nv);
424
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_dv.rows(), 6);
425
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_da.cols(), model.nv);
426
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
3 PINOCCHIO_CHECK_ARGUMENT_SIZE(dhdot_da.rows(), 6);
427
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 assert(model.check(data) && "data is not consistent with model.");
428
429 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
430 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
431 typedef typename Model::JointIndex JointIndex;
432 typedef typename Model::Force Force;
433
434 // compute first data.oh[0] and data.of[0]
435 3 data.oh[0].setZero();
436 3 data.of[0].setZero();
437 3 data.oYcrb[0].setZero();
438
439 3 typename Data::Matrix6x & Ftmp = data.Fcrb[0];
440 3 Ftmp = data.dFdq;
441
442 typedef GetCentroidalDynDerivativesBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
443
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
444 {
445
1/2
✓ Branch 3 taken 81 times.
✗ Branch 4 not taken.
81 Pass2::run(model.joints[i], typename Pass2::ArgsType(model, data));
446 }
447
448 typedef typename Data::Inertia Inertia;
449
450 3 const Inertia & Ytot = data.oYcrb[0];
451 3 const typename Inertia::Vector3 & com = Ytot.lever();
452
453 // Center of mass of the system
454 3 data.com[0] = com;
455
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
3 data.mass[0] = Ytot.mass();
456
457 // Remove the gravity contribution
458
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 data.of[0] += Ytot * model.gravity;
459
460 // Compute the centroidal quantities
461 3 data.hg = data.oh[0];
462
3/6
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
3 data.hg.angular() += data.hg.linear().cross(com);
463
464 3 data.dhg = data.of[0];
465
3/6
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 3 times.
✗ Branch 9 not taken.
3 data.dhg.angular() += data.dhg.linear().cross(com);
466
467 // Compute centroidal inertia
468
0/2
✗ Branch 3 not taken.
✗ Branch 4 not taken.
3 data.Ig.mass() = Ytot.mass();
469 3 data.Ig.lever().setZero();
470 3 data.Ig.inertia() = Ytot.inertia();
471
472 // Retrieve the partial derivatives from RNEA derivatives
473 3 translateForceSet(data.dHdq, com, dh_dq.const_cast_derived());
474 3 Matrix6xLike0 & dh_dq_ = dh_dq.const_cast_derived();
475
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 3 times.
99 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
476
5/15
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 96 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 96 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 96 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
96 dh_dq_.col(k).template segment<3>(Force::ANGULAR) +=
477
3/9
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 96 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 96 times.
✗ Branch 9 not taken.
192 data.hg.linear().cross(data.dFda.col(k).template segment<3>(Force::LINEAR)) / Ytot.mass();
478
479 3 translateForceSet(Ftmp, com, dhdot_dq.const_cast_derived());
480 3 Matrix6xLike1 & dhdot_dq_ = dhdot_dq.const_cast_derived();
481
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 3 times.
99 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
482
5/15
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 96 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 96 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 96 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
96 dhdot_dq_.col(k).template segment<3>(Force::ANGULAR) +=
483
2/6
✓ Branch 1 taken 96 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
96 data.dhg.linear().cross(data.dFda.col(k).template segment<3>(Force::LINEAR))
484
1/2
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
192 / Ytot.mass();
485
486 3 translateForceSet(data.dFdv, com, dhdot_dv.const_cast_derived());
487
488 3 translateForceSet(data.dFda, com, data.Ag);
489 3 dhdot_da.const_cast_derived() = data.Ag;
490 3 }
491 } // namespace impl
492
493 template<
494 typename Scalar,
495 int Options,
496 template<typename, int> class JointCollectionTpl,
497 typename ConfigVectorType,
498 typename TangentVectorType1,
499 typename TangentVectorType2,
500 typename Matrix6xLike0,
501 typename Matrix6xLike1,
502 typename Matrix6xLike2,
503 typename Matrix6xLike3>
504 4 void computeCentroidalDynamicsDerivatives(
505 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
506 DataTpl<Scalar, Options, JointCollectionTpl> & data,
507 const Eigen::MatrixBase<ConfigVectorType> & q,
508 const Eigen::MatrixBase<TangentVectorType1> & v,
509 const Eigen::MatrixBase<TangentVectorType2> & a,
510 const Eigen::MatrixBase<Matrix6xLike0> & dh_dq,
511 const Eigen::MatrixBase<Matrix6xLike1> & dhdot_dq,
512 const Eigen::MatrixBase<Matrix6xLike2> & dhdot_dv,
513 const Eigen::MatrixBase<Matrix6xLike3> & dhdot_da)
514 {
515
7/14
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 4 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 4 times.
✗ Branch 21 not taken.
4 impl::computeCentroidalDynamicsDerivatives(
516 model, data, make_const_ref(q), make_const_ref(v), make_const_ref(a), make_ref(dh_dq),
517 make_ref(dhdot_dq), make_ref(dhdot_dv), make_ref(dhdot_da));
518 4 }
519
520 template<
521 typename Scalar,
522 int Options,
523 template<typename, int> class JointCollectionTpl,
524 typename Matrix6xLike0,
525 typename Matrix6xLike1,
526 typename Matrix6xLike2,
527 typename Matrix6xLike3>
528 2 void getCentroidalDynamicsDerivatives(
529 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
530 DataTpl<Scalar, Options, JointCollectionTpl> & data,
531 const Eigen::MatrixBase<Matrix6xLike0> & dh_dq,
532 const Eigen::MatrixBase<Matrix6xLike1> & dhdot_dq,
533 const Eigen::MatrixBase<Matrix6xLike2> & dhdot_dv,
534 const Eigen::MatrixBase<Matrix6xLike3> & dhdot_da)
535 {
536
4/8
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
2 impl::getCentroidalDynamicsDerivatives(
537 model, data, make_ref(dh_dq), make_ref(dhdot_dq), make_ref(dhdot_dv), make_ref(dhdot_da));
538 2 }
539
540 } // namespace pinocchio
541
542 /// @endcond
543
544 #endif // ifndef __pinocchio_algorithm_centroidal_derivatives_hxx__
545