GCC Code Coverage Report


Directory: ./
File: include/pinocchio/algorithm/rnea-derivatives.hxx
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 246 253 97.2%
Branches: 345 1223 28.2%

Line Branch Exec Source
1 //
2 // Copyright (c) 2017-2021 CNRS INRIA
3 //
4
5 #ifndef __pinocchio_algorithm_rnea_derivatives_hxx__
6 #define __pinocchio_algorithm_rnea_derivatives_hxx__
7
8 #include "pinocchio/multibody/visitor.hpp"
9 #include "pinocchio/algorithm/check.hpp"
10
11 namespace pinocchio
12 {
13 namespace impl
14 {
15 template<
16 typename Scalar,
17 int Options,
18 template<typename, int> class JointCollectionTpl,
19 typename ConfigVectorType>
20 struct ComputeGeneralizedGravityDerivativeForwardStep
21 : public fusion::JointUnaryVisitorBase<ComputeGeneralizedGravityDerivativeForwardStep<
22 Scalar,
23 Options,
24 JointCollectionTpl,
25 ConfigVectorType>>
26 {
27 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
28 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
29
30 typedef boost::fusion::vector<const Model &, Data &, const ConfigVectorType &> ArgsType;
31
32 template<typename JointModel>
33 270 static void algo(
34 const JointModelBase<JointModel> & jmodel,
35 JointDataBase<typename JointModel::JointDataDerived> & jdata,
36 const Model & model,
37 Data & data,
38 const Eigen::MatrixBase<ConfigVectorType> & q)
39 {
40 typedef typename Model::JointIndex JointIndex;
41 typedef typename Data::Motion Motion;
42
43
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 const JointIndex i = jmodel.id();
44 270 const JointIndex parent = model.parents[i];
45 270 const Motion & minus_gravity = data.oa_gf[0];
46
47
1/2
✓ Branch 3 taken 135 times.
✗ Branch 4 not taken.
270 jmodel.calc(jdata.derived(), q.derived());
48
49
6/10
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 130 times.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 130 times.
✓ Branch 9 taken 5 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 130 times.
✗ Branch 13 not taken.
270 data.liMi[i] = model.jointPlacements[i] * jdata.M();
50
51
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 5 times.
270 if (parent > 0)
52
2/4
✓ Branch 3 taken 130 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 130 times.
✗ Branch 8 not taken.
260 data.oMi[i] = data.oMi[parent] * data.liMi[i];
53 else
54
1/2
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
10 data.oMi[i] = data.liMi[i];
55
56
3/6
✓ Branch 3 taken 135 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 135 times.
✗ Branch 12 not taken.
270 data.oYcrb[i] = data.oinertias[i] = data.oMi[i].act(model.inertias[i]);
57
2/4
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
270 data.of[i] = data.oYcrb[i] * minus_gravity;
58
59 typedef
60 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
61 ColsBlock;
62
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock J_cols = jmodel.jointCols(data.J);
63
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
64
3/6
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
270 J_cols = data.oMi[i].act(jdata.S());
65
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 motionSet::motionAction(minus_gravity, J_cols, dAdq_cols);
66 }
67 };
68
69 template<
70 typename Scalar,
71 int Options,
72 template<typename, int> class JointCollectionTpl,
73 typename ReturnMatrixType>
74 struct ComputeGeneralizedGravityDerivativeBackwardStep
75 : public fusion::JointUnaryVisitorBase<ComputeGeneralizedGravityDerivativeBackwardStep<
76 Scalar,
77 Options,
78 JointCollectionTpl,
79 ReturnMatrixType>>
80 {
81 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
82 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
83
84 typedef boost::fusion::
85 vector<const Model &, Data &, typename Data::VectorXs &, ReturnMatrixType &>
86 ArgsType;
87
88 template<typename JointModel>
89 270 static void algo(
90 const JointModelBase<JointModel> & jmodel,
91 const Model & model,
92 Data & data,
93 typename Data::VectorXs & g,
94 const Eigen::MatrixBase<ReturnMatrixType> & gravity_partial_dq)
95 {
96 typedef typename Model::JointIndex JointIndex;
97 typedef Eigen::Matrix<
98 Scalar, JointModel::NV, 6, Options, JointModel::NV == Eigen::Dynamic ? 6 : JointModel::NV,
99 6>
100 MatrixNV6;
101
102
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 const JointIndex i = jmodel.id();
103 270 const JointIndex parent = model.parents[i];
104
105
2/4
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
270 typename PINOCCHIO_EIGEN_PLAIN_ROW_MAJOR_TYPE(MatrixNV6) YS(jmodel.nv(), 6);
106
107 typedef
108 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
109 ColsBlock;
110
111
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock J_cols = jmodel.jointCols(data.J);
112
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
113
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock dFdq_cols = jmodel.jointCols(data.dFdq);
114
1/2
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
270 ColsBlock Ag_cols = jmodel.jointCols(data.Ag);
115
116
1/2
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
270 motionSet::inertiaAction(data.oYcrb[i], dAdq_cols, dFdq_cols);
117
118 ReturnMatrixType & gravity_partial_dq_ =
119 270 PINOCCHIO_EIGEN_CONST_CAST(ReturnMatrixType, gravity_partial_dq);
120
4/8
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 135 times.
✗ Branch 12 not taken.
270 gravity_partial_dq_.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), data.nvSubtree[i])
121
6/12
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 135 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 135 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 135 times.
✗ Branch 18 not taken.
540 .noalias() = J_cols.transpose() * data.dFdq.middleCols(jmodel.idx_v(), data.nvSubtree[i]);
122
123
1/2
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
270 motionSet::act<ADDTO>(J_cols, data.of[i], dFdq_cols);
124
125
1/2
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
270 motionSet::inertiaAction(data.oYcrb[i], J_cols, Ag_cols);
126
3/4
✓ Branch 1 taken 135 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1205 times.
✓ Branch 5 taken 135 times.
2680 for (int j = data.parents_fromRow[(typename Model::Index)jmodel.idx_v()]; j >= 0;
127 2410 j = data.parents_fromRow[(typename Model::Index)j])
128
6/12
✓ Branch 1 taken 1205 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1205 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1205 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1205 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1205 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1205 times.
✗ Branch 17 not taken.
2410 gravity_partial_dq_.middleRows(jmodel.idx_v(), jmodel.nv()).col(j).noalias() =
129
3/6
✓ Branch 1 taken 1205 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1205 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1205 times.
✗ Branch 8 not taken.
4820 Ag_cols.transpose() * data.dAdq.col(j);
130
131
6/12
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 135 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 135 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 135 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 135 times.
✗ Branch 18 not taken.
270 jmodel.jointVelocitySelector(g).noalias() = J_cols.transpose() * data.of[i].toVector();
132
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 5 times.
270 if (parent > 0)
133 {
134
1/2
✓ Branch 3 taken 130 times.
✗ Branch 4 not taken.
260 data.oYcrb[parent] += data.oYcrb[i];
135
1/2
✓ Branch 3 taken 130 times.
✗ Branch 4 not taken.
260 data.of[parent] += data.of[i];
136 }
137 }
138 };
139
140 template<
141 typename Scalar,
142 int Options,
143 template<typename, int> class JointCollectionTpl,
144 typename ConfigVectorType,
145 typename ReturnMatrixType>
146 3 void computeGeneralizedGravityDerivatives(
147 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
148 DataTpl<Scalar, Options, JointCollectionTpl> & data,
149 const Eigen::MatrixBase<ConfigVectorType> & q,
150 const Eigen::MatrixBase<ReturnMatrixType> & gravity_partial_dq)
151 {
152
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(
153 q.size(), model.nq, "The configuration vector is not of right size");
154
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(gravity_partial_dq.cols(), model.nv);
155
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(gravity_partial_dq.rows(), model.nv);
156
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 assert(model.check(data) && "data is not consistent with model.");
157
158 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
159 typedef typename Model::JointIndex JointIndex;
160
161
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 data.oa_gf[0] = -model.gravity; // minus_gravity used in the two Passes
162
163 typedef ComputeGeneralizedGravityDerivativeForwardStep<
164 Scalar, Options, JointCollectionTpl, ConfigVectorType>
165 Pass1;
166
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
167 {
168
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
81 Pass1::run(
169 162 model.joints[i], data.joints[i], typename Pass1::ArgsType(model, data, q.derived()));
170 }
171
172 typedef ComputeGeneralizedGravityDerivativeBackwardStep<
173 Scalar, Options, JointCollectionTpl, ReturnMatrixType>
174 Pass2;
175 ReturnMatrixType & gravity_partial_dq_ =
176 3 PINOCCHIO_EIGEN_CONST_CAST(ReturnMatrixType, gravity_partial_dq);
177
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
178 {
179
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
81 Pass2::run(
180 162 model.joints[i], typename Pass2::ArgsType(model, data, data.g, gravity_partial_dq_));
181 }
182 3 }
183
184 template<
185 typename Scalar,
186 int Options,
187 template<typename, int> class JointCollectionTpl,
188 typename ConfigVectorType,
189 typename ReturnMatrixType>
190 2 void computeStaticTorqueDerivatives(
191 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
192 DataTpl<Scalar, Options, JointCollectionTpl> & data,
193 const Eigen::MatrixBase<ConfigVectorType> & q,
194 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext,
195 const Eigen::MatrixBase<ReturnMatrixType> & static_torque_partial_dq)
196 {
197
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 2 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.
2 PINOCCHIO_CHECK_ARGUMENT_SIZE(
198 q.size(), model.nq, "The configuration vector is not of right size");
199
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 2 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.
2 PINOCCHIO_CHECK_ARGUMENT_SIZE(static_torque_partial_dq.cols(), model.nv);
200
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 2 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.
2 PINOCCHIO_CHECK_ARGUMENT_SIZE(static_torque_partial_dq.rows(), model.nv);
201
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 2 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.
2 PINOCCHIO_CHECK_ARGUMENT_SIZE(
202 fext.size(), (size_t)model.njoints, "The size of the external forces is not of right size");
203
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 assert(model.check(data) && "data is not consistent with model.");
204
205 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
206 typedef typename Model::JointIndex JointIndex;
207
208
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 data.oa_gf[0] = -model.gravity; // minus_gravity used in the two Passes
209
210 typedef ComputeGeneralizedGravityDerivativeForwardStep<
211 Scalar, Options, JointCollectionTpl, ConfigVectorType>
212 Pass1;
213
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 2 times.
56 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
214 {
215
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
54 Pass1::run(
216 54 model.joints[i], data.joints[i], typename Pass1::ArgsType(model, data, q.derived()));
217
1/2
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
54 data.of[i] -= data.oMi[i].act(fext[i]);
218 }
219
220 typedef ComputeGeneralizedGravityDerivativeBackwardStep<
221 Scalar, Options, JointCollectionTpl, ReturnMatrixType>
222 Pass2;
223 ReturnMatrixType & static_torque_partial_dq_ =
224 2 PINOCCHIO_EIGEN_CONST_CAST(ReturnMatrixType, static_torque_partial_dq);
225
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 2 times.
56 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
226 {
227
1/2
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
54 Pass2::run(
228 54 model.joints[i],
229 108 typename Pass2::ArgsType(model, data, data.tau, static_torque_partial_dq_));
230 }
231 2 }
232
233 template<
234 typename Scalar,
235 int Options,
236 template<typename, int> class JointCollectionTpl,
237 typename ConfigVectorType,
238 typename TangentVectorType1,
239 typename TangentVectorType2>
240 struct ComputeRNEADerivativesForwardStep
241 : public fusion::JointUnaryVisitorBase<ComputeRNEADerivativesForwardStep<
242 Scalar,
243 Options,
244 JointCollectionTpl,
245 ConfigVectorType,
246 TangentVectorType1,
247 TangentVectorType2>>
248 {
249 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
250 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
251
252 typedef boost::fusion::vector<
253 const Model &,
254 Data &,
255 const ConfigVectorType &,
256 const TangentVectorType1 &,
257 const TangentVectorType2 &>
258 ArgsType;
259
260 template<typename JointModel>
261 9734 static void algo(
262 const JointModelBase<JointModel> & jmodel,
263 JointDataBase<typename JointModel::JointDataDerived> & jdata,
264 const Model & model,
265 Data & data,
266 const Eigen::MatrixBase<ConfigVectorType> & q,
267 const Eigen::MatrixBase<TangentVectorType1> & v,
268 const Eigen::MatrixBase<TangentVectorType2> & a)
269 {
270 typedef typename Model::JointIndex JointIndex;
271 typedef typename Data::Motion Motion;
272
273
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 const JointIndex i = jmodel.id();
274 9734 const JointIndex parent = model.parents[i];
275 9734 Motion & ov = data.ov[i];
276 9734 Motion & oa = data.oa[i];
277 9734 Motion & oa_gf = data.oa_gf[i];
278
279
1/2
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
9734 jmodel.calc(jdata.derived(), q.derived(), v.derived());
280
281
6/10
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4686 times.
✓ Branch 5 taken 181 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4686 times.
✓ Branch 9 taken 181 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 4686 times.
✗ Branch 13 not taken.
9734 data.liMi[i] = model.jointPlacements[i] * jdata.M();
282
283
2/4
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
9734 data.v[i] = jdata.v();
284
285
2/2
✓ Branch 0 taken 4686 times.
✓ Branch 1 taken 181 times.
9734 if (parent > 0)
286 {
287
2/4
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 4686 times.
✗ Branch 8 not taken.
9372 data.oMi[i] = data.oMi[parent] * data.liMi[i];
288
2/4
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 4686 times.
✗ Branch 8 not taken.
9372 data.v[i] += data.liMi[i].actInv(data.v[parent]);
289 }
290 else
291
1/2
✓ Branch 3 taken 181 times.
✗ Branch 4 not taken.
362 data.oMi[i] = data.liMi[i];
292
293
5/9
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4687 times.
✓ Branch 5 taken 180 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4687 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 4687 times.
✗ Branch 12 not taken.
19468 data.a[i] =
294
7/14
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4867 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 4867 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 4867 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 180 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 180 times.
✗ Branch 21 not taken.
19522 jdata.S() * jmodel.jointVelocitySelector(a) + jdata.c() + (data.v[i] ^ jdata.v());
295
2/2
✓ Branch 0 taken 4686 times.
✓ Branch 1 taken 181 times.
9734 if (parent > 0)
296 {
297
2/4
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 4686 times.
✗ Branch 8 not taken.
9372 data.a[i] += data.liMi[i].actInv(data.a[parent]);
298 }
299
300
3/6
✓ Branch 3 taken 4867 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 4867 times.
✗ Branch 12 not taken.
9734 data.oYcrb[i] = data.oinertias[i] = data.oMi[i].act(model.inertias[i]);
301
2/4
✓ Branch 3 taken 4867 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4867 times.
✗ Branch 7 not taken.
9734 ov = data.oMi[i].act(data.v[i]);
302
2/4
✓ Branch 3 taken 4867 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 4867 times.
✗ Branch 7 not taken.
9734 oa = data.oMi[i].act(data.a[i]);
303
2/4
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
9734 oa_gf = oa - model.gravity; // add gravity contribution
304
305
2/4
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 4867 times.
✗ Branch 7 not taken.
9734 data.oh[i] = data.oYcrb[i] * ov;
306
4/8
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 4867 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 4867 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 4867 times.
✗ Branch 14 not taken.
9734 data.of[i] = data.oYcrb[i] * oa_gf + ov.cross(data.oh[i]);
307
308 typedef
309 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
310 ColsBlock;
311
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock J_cols = jmodel.jointCols(data.J);
312
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dJ_cols = jmodel.jointCols(data.dJ);
313
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dVdq_cols = jmodel.jointCols(data.dVdq);
314
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
315
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dAdv_cols = jmodel.jointCols(data.dAdv);
316
317
3/6
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4867 times.
✗ Branch 9 not taken.
9734 J_cols = data.oMi[i].act(jdata.S());
318
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 motionSet::motionAction(ov, J_cols, dJ_cols);
319
1/2
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
9734 motionSet::motionAction(data.oa_gf[parent], J_cols, dAdq_cols);
320
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 dAdv_cols = dJ_cols;
321
2/2
✓ Branch 0 taken 4686 times.
✓ Branch 1 taken 181 times.
9734 if (parent > 0)
322 {
323
1/2
✓ Branch 2 taken 4686 times.
✗ Branch 3 not taken.
9372 motionSet::motionAction(data.ov[parent], J_cols, dVdq_cols);
324
1/2
✓ Branch 2 taken 4686 times.
✗ Branch 3 not taken.
9372 motionSet::motionAction<ADDTO>(data.ov[parent], dVdq_cols, dAdq_cols);
325
2/4
✓ Branch 1 taken 4686 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4686 times.
✗ Branch 5 not taken.
9372 dAdv_cols.noalias() += dVdq_cols;
326 }
327 else
328 {
329
1/2
✓ Branch 1 taken 181 times.
✗ Branch 2 not taken.
362 dVdq_cols.setZero();
330 }
331
332 // computes variation of inertias
333
1/2
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
9734 data.doYcrb[i] = data.oYcrb[i].variation(ov);
334
335
1/2
✓ Branch 3 taken 4867 times.
✗ Branch 4 not taken.
9734 addForceCrossMatrix(data.oh[i], data.doYcrb[i]);
336 }
337
338 template<typename ForceDerived, typename M6>
339 static void
340 5461 addForceCrossMatrix(const ForceDense<ForceDerived> & f, const Eigen::MatrixBase<M6> & mout)
341 {
342 5461 M6 & mout_ = PINOCCHIO_EIGEN_CONST_CAST(M6, mout);
343
2/4
✓ Branch 1 taken 5461 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5461 times.
✗ Branch 5 not taken.
5461 addSkew(
344
1/2
✓ Branch 2 taken 5461 times.
✗ Branch 3 not taken.
5461 -f.linear(), mout_.template block<3, 3>(ForceDerived::LINEAR, ForceDerived::ANGULAR));
345
2/4
✓ Branch 1 taken 5461 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5461 times.
✗ Branch 5 not taken.
5461 addSkew(
346
1/2
✓ Branch 2 taken 5461 times.
✗ Branch 3 not taken.
5461 -f.linear(), mout_.template block<3, 3>(ForceDerived::ANGULAR, ForceDerived::LINEAR));
347
2/4
✓ Branch 1 taken 5461 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5461 times.
✗ Branch 5 not taken.
5461 addSkew(
348
1/2
✓ Branch 2 taken 5461 times.
✗ Branch 3 not taken.
5461 -f.angular(), mout_.template block<3, 3>(ForceDerived::ANGULAR, ForceDerived::ANGULAR));
349 5461 }
350 };
351
352 template<
353 typename Scalar,
354 int Options,
355 template<typename, int> class JointCollectionTpl,
356 typename MatrixType1,
357 typename MatrixType2,
358 typename MatrixType3>
359 struct ComputeRNEADerivativesBackwardStep
360 : public fusion::JointUnaryVisitorBase<ComputeRNEADerivativesBackwardStep<
361 Scalar,
362 Options,
363 JointCollectionTpl,
364 MatrixType1,
365 MatrixType2,
366 MatrixType3>>
367 {
368 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
369 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
370
371 typedef boost::fusion::
372 vector<const Model &, Data &, const MatrixType1 &, const MatrixType2 &, const MatrixType3 &>
373 ArgsType;
374
375 template<typename JointModel>
376 9734 static void algo(
377 const JointModelBase<JointModel> & jmodel,
378 const Model & model,
379 Data & data,
380 const Eigen::MatrixBase<MatrixType1> & rnea_partial_dq,
381 const Eigen::MatrixBase<MatrixType2> & rnea_partial_dv,
382 const Eigen::MatrixBase<MatrixType3> & rnea_partial_da)
383 {
384 typedef typename Model::JointIndex JointIndex;
385 typedef typename Data::Matrix6x Matrix6x;
386
387
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 const JointIndex i = jmodel.id();
388 9734 const JointIndex parent = model.parents[i];
389
390 typedef typename SizeDepType<JointModel::NV>::template ColsReturn<Matrix6x>::Type ColsBlock;
391
392 9734 Matrix6x & dYtJ = data.Fcrb[0];
393
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock J_cols = jmodel.jointCols(data.J);
394
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dVdq_cols = jmodel.jointCols(data.dVdq);
395
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dAdq_cols = jmodel.jointCols(data.dAdq);
396
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dAdv_cols = jmodel.jointCols(data.dAdv);
397
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dFdq_cols = jmodel.jointCols(data.dFdq);
398
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dFdv_cols = jmodel.jointCols(data.dFdv);
399
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dFda_cols = jmodel.jointCols(data.dFda); // Also equals to Ag_cols
400
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 ColsBlock dYtJ_cols = jmodel.jointCols(dYtJ);
401
402 9734 MatrixType1 & rnea_partial_dq_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixType1, rnea_partial_dq);
403 9734 MatrixType2 & rnea_partial_dv_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixType2, rnea_partial_dv);
404 9734 MatrixType3 & rnea_partial_da_ = PINOCCHIO_EIGEN_CONST_CAST(MatrixType3, rnea_partial_da);
405
406 // tau
407
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 jmodel.jointVelocitySelector(data.tau).noalias() =
408
3/6
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4867 times.
✗ Branch 9 not taken.
9734 J_cols.transpose() * data.of[i].toVector();
409
410 9734 const Eigen::DenseIndex nv_subtree = data.nvSubtree[i];
411
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 const Eigen::DenseIndex nv = jmodel.nv();
412
1/2
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
9734 const Eigen::DenseIndex idx_v = jmodel.idx_v();
413 9734 const Eigen::DenseIndex idx_v_plus = idx_v + nv;
414 9734 const Eigen::DenseIndex nv_subtree_plus = nv_subtree - nv;
415
416 // dtau/da similar to data.M
417
1/2
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
9734 motionSet::inertiaAction(data.oYcrb[i], J_cols, dFda_cols);
418
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 rnea_partial_da_.block(idx_v, idx_v, nv, nv_subtree).noalias() =
419
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 J_cols.transpose() * data.dFda.middleCols(idx_v, nv_subtree);
420
421 // dtau/dq
422
2/2
✓ Branch 0 taken 4686 times.
✓ Branch 1 taken 181 times.
9734 if (parent > 0)
423 {
424
3/6
✓ Branch 2 taken 4686 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4686 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4686 times.
✗ Branch 9 not taken.
9372 dFdq_cols.noalias() = data.doYcrb[i] * dVdq_cols;
425
1/2
✓ Branch 2 taken 4686 times.
✗ Branch 3 not taken.
9372 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dAdq_cols, dFdq_cols);
426 }
427 else
428
1/2
✓ Branch 2 taken 181 times.
✗ Branch 3 not taken.
362 motionSet::inertiaAction(data.oYcrb[i], dAdq_cols, dFdq_cols);
429
430
5/10
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4867 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 4867 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 4867 times.
✗ Branch 15 not taken.
9734 dYtJ_cols.transpose().noalias() = J_cols.transpose() * data.doYcrb[i];
431
4/8
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4867 times.
✗ Branch 11 not taken.
9734 rnea_partial_dq_.block(idx_v_plus, idx_v, nv_subtree_plus, nv).noalias() =
432
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 data.dFda.middleCols(idx_v_plus, nv_subtree_plus).transpose() * dAdq_cols
433
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 + dYtJ.middleCols(idx_v_plus, nv_subtree_plus).transpose() * dVdq_cols;
434
435
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 rnea_partial_dq_.block(idx_v, idx_v, nv, nv_subtree).noalias() =
436
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 J_cols.transpose() * data.dFdq.middleCols(idx_v, nv_subtree);
437
438
1/2
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
9734 motionSet::act<ADDTO>(J_cols, data.of[i], dFdq_cols);
439
440 // dtau/dv
441
3/6
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4867 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4867 times.
✗ Branch 9 not taken.
9734 dFdv_cols.noalias() = data.doYcrb[i] * J_cols;
442
1/2
✓ Branch 2 taken 4867 times.
✗ Branch 3 not taken.
9734 motionSet::inertiaAction<ADDTO>(data.oYcrb[i], dAdv_cols, dFdv_cols);
443
444
4/8
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 4867 times.
✗ Branch 11 not taken.
9734 rnea_partial_dv_.block(idx_v_plus, idx_v, nv_subtree_plus, nv).noalias() =
445
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 data.dFda.middleCols(idx_v_plus, nv_subtree_plus).transpose() * dAdv_cols
446
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 + dYtJ.middleCols(idx_v_plus, nv_subtree_plus).transpose() * J_cols;
447
448
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 rnea_partial_dv_.block(idx_v, idx_v, nv, nv_subtree).noalias() =
449
3/6
✓ Branch 1 taken 4867 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4867 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 4867 times.
✗ Branch 8 not taken.
9734 J_cols.transpose() * data.dFdv.middleCols(idx_v, nv_subtree);
450
451
2/2
✓ Branch 0 taken 4686 times.
✓ Branch 1 taken 181 times.
9734 if (parent > 0)
452 {
453
1/2
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
9372 data.oYcrb[parent] += data.oYcrb[i];
454
1/2
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
9372 data.doYcrb[parent] += data.doYcrb[i];
455
1/2
✓ Branch 3 taken 4686 times.
✗ Branch 4 not taken.
9372 data.of[parent] += data.of[i];
456 }
457 }
458 };
459
460 template<
461 typename Scalar,
462 int Options,
463 template<typename, int> class JointCollectionTpl,
464 typename ConfigVectorType,
465 typename TangentVectorType1,
466 typename TangentVectorType2,
467 typename MatrixType1,
468 typename MatrixType2,
469 typename MatrixType3>
470 347 void computeRNEADerivatives(
471 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
472 DataTpl<Scalar, Options, JointCollectionTpl> & data,
473 const Eigen::MatrixBase<ConfigVectorType> & q,
474 const Eigen::MatrixBase<TangentVectorType1> & v,
475 const Eigen::MatrixBase<TangentVectorType2> & a,
476 const Eigen::MatrixBase<MatrixType1> & rnea_partial_dq,
477 const Eigen::MatrixBase<MatrixType2> & rnea_partial_dv,
478 const Eigen::MatrixBase<MatrixType3> & rnea_partial_da)
479 {
480
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(
481 q.size(), model.nq, "The joint configuration vector is not of right size");
482
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(
483 v.size(), model.nv, "The joint velocity vector is not of right size");
484
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(
485 a.size(), model.nv, "The joint acceleration vector is not of right size");
486
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dq.cols(), model.nv);
487
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dq.rows(), model.nv);
488
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dv.cols(), model.nv);
489
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dv.rows(), model.nv);
490
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_da.cols(), model.nv);
491
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 174 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.
347 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_da.rows(), model.nv);
492
4/10
✓ Branch 2 taken 174 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 174 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 173 times.
✓ Branch 9 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
347 PINOCCHIO_CHECK_INPUT_ARGUMENT(
493 isZero(model.gravity.angular()),
494 "The gravity must be a pure force vector, no angular part");
495
1/2
✓ Branch 1 taken 174 times.
✗ Branch 2 not taken.
347 assert(model.check(data) && "data is not consistent with model.");
496
497 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
498 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
499 typedef typename Model::JointIndex JointIndex;
500
501
1/2
✓ Branch 3 taken 174 times.
✗ Branch 4 not taken.
347 data.oa_gf[0] = -model.gravity;
502
503 typedef ComputeRNEADerivativesForwardStep<
504 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1,
505 TangentVectorType2>
506 Pass1;
507
2/2
✓ Branch 0 taken 4678 times.
✓ Branch 1 taken 174 times.
9676 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
508 {
509
1/2
✓ Branch 1 taken 4678 times.
✗ Branch 2 not taken.
9329 Pass1::run(
510 9329 model.joints[i], data.joints[i],
511 18658 typename Pass1::ArgsType(model, data, q.derived(), v.derived(), a.derived()));
512 }
513
514 typedef ComputeRNEADerivativesBackwardStep<
515 Scalar, Options, JointCollectionTpl, MatrixType1, MatrixType2, MatrixType3>
516 Pass2;
517
2/2
✓ Branch 0 taken 4678 times.
✓ Branch 1 taken 174 times.
9676 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
518 {
519
1/2
✓ Branch 1 taken 4678 times.
✗ Branch 2 not taken.
9329 Pass2::run(
520 18658 model.joints[i], typename Pass2::ArgsType(
521 9329 model, data, PINOCCHIO_EIGEN_CONST_CAST(MatrixType1, rnea_partial_dq),
522 9329 PINOCCHIO_EIGEN_CONST_CAST(MatrixType2, rnea_partial_dv),
523 9329 PINOCCHIO_EIGEN_CONST_CAST(MatrixType3, rnea_partial_da)));
524 }
525
526 // Restore the status of dAdq_cols (remove gravity)
527
2/2
✓ Branch 0 taken 5545 times.
✓ Branch 1 taken 174 times.
11405 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
528 {
529
2/4
✓ Branch 1 taken 5545 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5545 times.
✗ Branch 5 not taken.
11058 MotionRef<typename Data::Matrix6x::ColXpr> m_in(data.J.col(k));
530
2/4
✓ Branch 1 taken 5545 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5545 times.
✗ Branch 5 not taken.
11058 MotionRef<typename Data::Matrix6x::ColXpr> m_out(data.dAdq.col(k));
531
5/10
✓ Branch 1 taken 5545 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5545 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5545 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5545 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 5545 times.
✗ Branch 14 not taken.
11058 m_out.linear() += model.gravity.linear().cross(m_in.angular());
532 }
533
534 // Add armature contribution
535
3/6
✓ Branch 1 taken 174 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 174 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 174 times.
✗ Branch 8 not taken.
347 data.tau.array() +=
536
1/2
✓ Branch 2 taken 174 times.
✗ Branch 3 not taken.
347 model.armature.array() * a.array(); // TODO: check if there is memory allocation
537
1/2
✓ Branch 3 taken 174 times.
✗ Branch 4 not taken.
347 PINOCCHIO_EIGEN_CONST_CAST(MatrixType3, rnea_partial_da).diagonal() += model.armature;
538 347 }
539
540 template<
541 typename Scalar,
542 int Options,
543 template<typename, int> class JointCollectionTpl,
544 typename ConfigVectorType,
545 typename TangentVectorType1,
546 typename TangentVectorType2,
547 typename MatrixType1,
548 typename MatrixType2,
549 typename MatrixType3>
550 14 void computeRNEADerivatives(
551 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
552 DataTpl<Scalar, Options, JointCollectionTpl> & data,
553 const Eigen::MatrixBase<ConfigVectorType> & q,
554 const Eigen::MatrixBase<TangentVectorType1> & v,
555 const Eigen::MatrixBase<TangentVectorType2> & a,
556 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext,
557 const Eigen::MatrixBase<MatrixType1> & rnea_partial_dq,
558 const Eigen::MatrixBase<MatrixType2> & rnea_partial_dv,
559 const Eigen::MatrixBase<MatrixType3> & rnea_partial_da)
560 {
561
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(
562 q.size(), model.nq, "The joint configuration vector is not of right size");
563
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(
564 v.size(), model.nv, "The joint velocity vector is not of right size");
565
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(
566 a.size(), model.nv, "The joint acceleration vector is not of right size");
567
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(
568 fext.size(), (size_t)model.njoints, "The size of the external forces is not of right size");
569
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dq.cols(), model.nv);
570
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dq.rows(), model.nv);
571
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dv.cols(), model.nv);
572
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_dv.rows(), model.nv);
573
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_da.cols(), model.nv);
574
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 7 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.
14 PINOCCHIO_CHECK_ARGUMENT_SIZE(rnea_partial_da.rows(), model.nv);
575
1/2
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
14 assert(model.check(data) && "data is not consistent with model.");
576
577 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
578 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
579 typedef typename Model::JointIndex JointIndex;
580
581
1/2
✓ Branch 3 taken 7 times.
✗ Branch 4 not taken.
14 data.oa_gf[0] = -model.gravity;
582
583 typedef ComputeRNEADerivativesForwardStep<
584 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1,
585 TangentVectorType2>
586 Pass1;
587
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 7 times.
392 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
588 {
589
1/2
✓ Branch 1 taken 189 times.
✗ Branch 2 not taken.
378 Pass1::run(
590 378 model.joints[i], data.joints[i],
591 378 typename Pass1::ArgsType(model, data, q.derived(), v.derived(), a.derived()));
592
1/2
✓ Branch 5 taken 189 times.
✗ Branch 6 not taken.
378 data.of[i] -= data.oMi[i].act(fext[i]);
593 }
594
595 typedef ComputeRNEADerivativesBackwardStep<
596 Scalar, Options, JointCollectionTpl, MatrixType1, MatrixType2, MatrixType3>
597 Pass2;
598
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 7 times.
392 for (JointIndex i = (JointIndex)(model.njoints - 1); i > 0; --i)
599 {
600
1/2
✓ Branch 1 taken 189 times.
✗ Branch 2 not taken.
378 Pass2::run(
601 756 model.joints[i], typename Pass2::ArgsType(
602 378 model, data, PINOCCHIO_EIGEN_CONST_CAST(MatrixType1, rnea_partial_dq),
603 378 PINOCCHIO_EIGEN_CONST_CAST(MatrixType2, rnea_partial_dv),
604 378 PINOCCHIO_EIGEN_CONST_CAST(MatrixType3, rnea_partial_da)));
605 }
606
607 // Restore the status of dAdq_cols (remove gravity)
608
2/2
✓ Branch 0 taken 224 times.
✓ Branch 1 taken 7 times.
462 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
609 {
610
2/4
✓ Branch 1 taken 224 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 224 times.
✗ Branch 5 not taken.
448 MotionRef<typename Data::Matrix6x::ColXpr> m_in(data.J.col(k));
611
2/4
✓ Branch 1 taken 224 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 224 times.
✗ Branch 5 not taken.
448 MotionRef<typename Data::Matrix6x::ColXpr> m_out(data.dAdq.col(k));
612
5/10
✓ Branch 1 taken 224 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 224 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 224 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 224 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 224 times.
✗ Branch 14 not taken.
448 m_out.linear() += model.gravity.linear().cross(m_in.angular());
613 }
614
615 // Add armature contribution
616
3/6
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
14 data.tau.array() +=
617
1/2
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
14 model.armature.array() * a.array(); // TODO: check if there is memory allocation
618
1/2
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
14 data.M.diagonal() += model.armature;
619 }
620
621 template<
622 typename Scalar,
623 int Options,
624 template<typename, int> class JointCollectionTpl,
625 typename ConfigVectorType,
626 typename TangentVectorType1,
627 typename TangentVectorType2>
628 void computeRNEADerivatives(
629 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
630 DataTpl<Scalar, Options, JointCollectionTpl> & data,
631 const Eigen::MatrixBase<ConfigVectorType> & q,
632 const Eigen::MatrixBase<TangentVectorType1> & v,
633 const Eigen::MatrixBase<TangentVectorType2> & a)
634 {
635 impl::computeRNEADerivatives(
636 model, data, q.derived(), v.derived(), a.derived(), data.dtau_dq, data.dtau_dv, data.M);
637 }
638
639 template<
640 typename Scalar,
641 int Options,
642 template<typename, int> class JointCollectionTpl,
643 typename ConfigVectorType,
644 typename TangentVectorType1,
645 typename TangentVectorType2>
646 void computeRNEADerivatives(
647 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
648 DataTpl<Scalar, Options, JointCollectionTpl> & data,
649 const Eigen::MatrixBase<ConfigVectorType> & q,
650 const Eigen::MatrixBase<TangentVectorType1> & v,
651 const Eigen::MatrixBase<TangentVectorType2> & a,
652 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext)
653 {
654 impl::computeRNEADerivatives(
655 model, data, q.derived(), v.derived(), a.derived(), fext, data.dtau_dq, data.dtau_dv,
656 data.M);
657 }
658
659 } // namespace impl
660
661 template<
662 typename Scalar,
663 int Options,
664 template<typename, int> class JointCollectionTpl,
665 typename ConfigVectorType,
666 typename ReturnMatrixType>
667 3 void computeGeneralizedGravityDerivatives(
668 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
669 DataTpl<Scalar, Options, JointCollectionTpl> & data,
670 const Eigen::MatrixBase<ConfigVectorType> & q,
671 const Eigen::MatrixBase<ReturnMatrixType> & gravity_partial_dq)
672 {
673
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 impl::computeGeneralizedGravityDerivatives(
674 model, data, make_const_ref(q), make_ref(gravity_partial_dq));
675 3 }
676
677 template<
678 typename Scalar,
679 int Options,
680 template<typename, int> class JointCollectionTpl,
681 typename ConfigVectorType,
682 typename ReturnMatrixType>
683 2 void computeStaticTorqueDerivatives(
684 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
685 DataTpl<Scalar, Options, JointCollectionTpl> & data,
686 const Eigen::MatrixBase<ConfigVectorType> & q,
687 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext,
688 const Eigen::MatrixBase<ReturnMatrixType> & static_torque_partial_dq)
689 {
690
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 impl::computeStaticTorqueDerivatives(
691 model, data, make_const_ref(q), fext, make_ref(static_torque_partial_dq));
692 2 }
693
694 template<
695 typename Scalar,
696 int Options,
697 template<typename, int> class JointCollectionTpl,
698 typename ConfigVectorType,
699 typename TangentVectorType1,
700 typename TangentVectorType2,
701 typename MatrixType1,
702 typename MatrixType2,
703 typename MatrixType3>
704 274 void computeRNEADerivatives(
705 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
706 DataTpl<Scalar, Options, JointCollectionTpl> & data,
707 const Eigen::MatrixBase<ConfigVectorType> & q,
708 const Eigen::MatrixBase<TangentVectorType1> & v,
709 const Eigen::MatrixBase<TangentVectorType2> & a,
710 const Eigen::MatrixBase<MatrixType1> & rnea_partial_dq,
711 const Eigen::MatrixBase<MatrixType2> & rnea_partial_dv,
712 const Eigen::MatrixBase<MatrixType3> & rnea_partial_da)
713 {
714
6/12
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 138 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 138 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 138 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 138 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 138 times.
✗ Branch 18 not taken.
274 impl::computeRNEADerivatives(
715 model, data, make_const_ref(q), make_const_ref(v), make_const_ref(a),
716 make_ref(rnea_partial_dq), make_ref(rnea_partial_dv), make_ref(rnea_partial_da));
717 274 }
718
719 template<
720 typename Scalar,
721 int Options,
722 template<typename, int> class JointCollectionTpl,
723 typename ConfigVectorType,
724 typename TangentVectorType1,
725 typename TangentVectorType2,
726 typename MatrixType1,
727 typename MatrixType2,
728 typename MatrixType3>
729 1 void computeRNEADerivatives(
730 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
731 DataTpl<Scalar, Options, JointCollectionTpl> & data,
732 const Eigen::MatrixBase<ConfigVectorType> & q,
733 const Eigen::MatrixBase<TangentVectorType1> & v,
734 const Eigen::MatrixBase<TangentVectorType2> & a,
735 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext,
736 const Eigen::MatrixBase<MatrixType1> & rnea_partial_dq,
737 const Eigen::MatrixBase<MatrixType2> & rnea_partial_dv,
738 const Eigen::MatrixBase<MatrixType3> & rnea_partial_da)
739 {
740
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
1 impl::computeRNEADerivatives(
741 model, data, make_const_ref(q), make_const_ref(v), make_const_ref(a), fext,
742 make_ref(rnea_partial_dq), make_ref(rnea_partial_dv), make_ref(rnea_partial_da));
743 1 }
744
745 template<
746 typename Scalar,
747 int Options,
748 template<typename, int> class JointCollectionTpl,
749 typename ConfigVectorType,
750 typename TangentVectorType1,
751 typename TangentVectorType2>
752 36 void computeRNEADerivatives(
753 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
754 DataTpl<Scalar, Options, JointCollectionTpl> & data,
755 const Eigen::MatrixBase<ConfigVectorType> & q,
756 const Eigen::MatrixBase<TangentVectorType1> & v,
757 const Eigen::MatrixBase<TangentVectorType2> & a)
758 {
759
4/8
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 36 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 36 times.
✗ Branch 11 not taken.
36 impl::computeRNEADerivatives(
760
1/2
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
36 model, data, make_const_ref(q), make_const_ref(v), make_const_ref(a), make_ref(data.dtau_dq),
761
1/2
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
36 make_ref(data.dtau_dv), make_ref(data.M));
762 36 }
763
764 template<
765 typename Scalar,
766 int Options,
767 template<typename, int> class JointCollectionTpl,
768 typename ConfigVectorType,
769 typename TangentVectorType1,
770 typename TangentVectorType2>
771 6 void computeRNEADerivatives(
772 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
773 DataTpl<Scalar, Options, JointCollectionTpl> & data,
774 const Eigen::MatrixBase<ConfigVectorType> & q,
775 const Eigen::MatrixBase<TangentVectorType1> & v,
776 const Eigen::MatrixBase<TangentVectorType2> & a,
777 const container::aligned_vector<ForceTpl<Scalar, Options>> & fext)
778 {
779
4/8
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 11 not taken.
6 impl::computeRNEADerivatives(
780 model, data, make_const_ref(q), make_const_ref(v), make_const_ref(a), fext,
781
2/4
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6 times.
✗ Branch 6 not taken.
6 make_ref(data.dtau_dq), make_ref(data.dtau_dv), make_ref(data.M));
782 6 }
783
784 } // namespace pinocchio
785
786 #endif // ifndef __pinocchio_algorithm_rnea_derivatives_hxx__
787