GCC Code Coverage Report


Directory: ./
File: include/pinocchio/algorithm/aba.hxx
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 315 315 100.0%
Branches: 500 1090 45.9%

Line Branch Exec Source
1 //
2 // Copyright (c) 2016-2021 CNRS INRIA
3 //
4
5 #ifndef __pinocchio_algorithm_aba_hxx__
6 #define __pinocchio_algorithm_aba_hxx__
7
8 #include "pinocchio/spatial/act-on-set.hpp"
9 #include "pinocchio/multibody/visitor.hpp"
10 #include "pinocchio/algorithm/check.hpp"
11
12 /// @cond DEV
13
14 namespace pinocchio
15 {
16 namespace impl
17 {
18 namespace internal
19 {
20
21 template<typename Scalar>
22 struct SE3actOn
23 {
24 template<int Options, typename Matrix6Type>
25 static typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix6Type)
26 5696 run(const SE3Tpl<Scalar, Options> & M, const Eigen::MatrixBase<Matrix6Type> & I)
27 {
28 typedef SE3Tpl<Scalar, Options> SE3;
29 typedef typename SE3::Matrix3 Matrix3;
30 typedef typename SE3::Vector3 Vector3;
31
32 typedef const Eigen::Block<Matrix6Type, 3, 3> constBlock3;
33
34 typedef typename PINOCCHIO_EIGEN_PLAIN_TYPE(Matrix6Type) ReturnType;
35 typedef Eigen::Block<ReturnType, 3, 3> Block3;
36
37 5696 Matrix6Type & I_ = PINOCCHIO_EIGEN_CONST_CAST(Matrix6Type, I);
38
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 const constBlock3 & Ai = I_.template block<3, 3>(Inertia::LINEAR, Inertia::LINEAR);
39
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 const constBlock3 & Bi = I_.template block<3, 3>(Inertia::LINEAR, Inertia::ANGULAR);
40
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 const constBlock3 & Di = I_.template block<3, 3>(Inertia::ANGULAR, Inertia::ANGULAR);
41
42
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 const Matrix3 & R = M.rotation();
43
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 const Vector3 & t = M.translation();
44
45
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 ReturnType res;
46
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 Block3 Ao = res.template block<3, 3>(Inertia::LINEAR, Inertia::LINEAR);
47
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 Block3 Bo = res.template block<3, 3>(Inertia::LINEAR, Inertia::ANGULAR);
48
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 Block3 Co = res.template block<3, 3>(Inertia::ANGULAR, Inertia::LINEAR);
49
1/2
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
5696 Block3 Do = res.template block<3, 3>(Inertia::ANGULAR, Inertia::ANGULAR);
50
51
3/6
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
5696 Do.noalias() = R * Ai; // tmp variable
52
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Ao.noalias() = Do * R.transpose();
53
54
3/6
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
5696 Do.noalias() = R * Bi; // tmp variable
55
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Bo.noalias() = Do * R.transpose();
56
57
3/6
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
5696 Co.noalias() = R * Di; // tmp variable
58
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.noalias() = Co * R.transpose();
59
60
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.row(0) += t.cross(Bo.col(0));
61
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.row(1) += t.cross(Bo.col(1));
62
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.row(2) += t.cross(Bo.col(2));
63
64
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Co.col(0) = t.cross(Ao.col(0));
65
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Co.col(1) = t.cross(Ao.col(1));
66
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Co.col(2) = t.cross(Ao.col(2));
67
2/4
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
5696 Co += Bo.transpose();
68
69
2/4
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
5696 Bo = Co.transpose();
70
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.col(0) += t.cross(Bo.col(0));
71
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.col(1) += t.cross(Bo.col(1));
72
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
5696 Do.col(2) += t.cross(Bo.col(2));
73
74 11392 return res;
75 }
76 };
77 } // namespace internal
78
79 template<
80 typename Scalar,
81 int Options,
82 template<typename, int> class JointCollectionTpl,
83 typename ConfigVectorType,
84 typename TangentVectorType>
85 struct AbaWorldConventionForwardStep1
86 : public fusion::JointUnaryVisitorBase<AbaWorldConventionForwardStep1<
87 Scalar,
88 Options,
89 JointCollectionTpl,
90 ConfigVectorType,
91 TangentVectorType>>
92 {
93 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
94 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
95
96 typedef boost::fusion::
97 vector<const Model &, Data &, const ConfigVectorType &, const TangentVectorType &>
98 ArgsType;
99
100 template<typename JointModel>
101 910 static void algo(
102 const pinocchio::JointModelBase<JointModel> & jmodel,
103 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
104 const Model & model,
105 Data & data,
106 const Eigen::MatrixBase<ConfigVectorType> & q,
107 const Eigen::MatrixBase<TangentVectorType> & v)
108 {
109 typedef typename Model::JointIndex JointIndex;
110 typedef typename Data::Motion Motion;
111
112 910 const JointIndex i = jmodel.id();
113 910 Motion & ov = data.ov[i];
114 910 jmodel.calc(jdata.derived(), q.derived(), v.derived());
115
116 910 const JointIndex & parent = model.parents[i];
117
3/5
✓ Branch 4 taken 427 times.
✓ Branch 5 taken 28 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 427 times.
✗ Branch 9 not taken.
910 data.liMi[i] = model.jointPlacements[i] * jdata.M();
118
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 38 times.
910 if (parent > 0)
119
1/2
✓ Branch 5 taken 417 times.
✗ Branch 6 not taken.
834 data.oMi[i] = data.oMi[parent] * data.liMi[i];
120 else
121 76 data.oMi[i] = data.liMi[i];
122
123
2/4
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
910 jmodel.jointCols(data.J) = data.oMi[i].act(jdata.S());
124
125
1/2
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
910 ov = data.oMi[i].act(jdata.v());
126
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 38 times.
910 if (parent > 0)
127 834 ov += data.ov[parent];
128
129
1/2
✓ Branch 5 taken 455 times.
✗ Branch 6 not taken.
910 data.oa_gf[i] = data.oMi[i].act(jdata.c());
130
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 38 times.
910 if (parent > 0)
131
1/2
✓ Branch 4 taken 417 times.
✗ Branch 5 not taken.
834 data.oa_gf[i] += (data.ov[parent] ^ ov);
132
133
2/4
✓ Branch 5 taken 455 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 455 times.
✗ Branch 10 not taken.
910 data.oinertias[i] = data.oYcrb[i] = data.oMi[i].act(model.inertias[i]);
134 910 data.oYaba[i] = data.oYcrb[i].matrix();
135
136
1/2
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
910 data.oh[i] = data.oYcrb[i] * ov; // necessary for ABA derivatives
137
1/2
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
910 data.of[i] = ov.cross(data.oh[i]);
138 }
139 };
140
141 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
142 struct AbaWorldConventionBackwardStep
143 : public fusion::JointUnaryVisitorBase<
144 AbaWorldConventionBackwardStep<Scalar, Options, JointCollectionTpl>>
145 {
146 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
147 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
148
149 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
150
151 template<typename JointModel>
152 910 static void algo(
153 const JointModelBase<JointModel> & jmodel,
154 JointDataBase<typename JointModel::JointDataDerived> & jdata,
155 const Model & model,
156 Data & data)
157 {
158 typedef typename Model::JointIndex JointIndex;
159 typedef typename Data::Inertia Inertia;
160 typedef typename Data::Force Force;
161 typedef typename Data::Matrix6x Matrix6x;
162
163
1/2
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
910 const JointIndex i = jmodel.id();
164 910 const JointIndex parent = model.parents[i];
165 910 typename Inertia::Matrix6 & Ia = data.oYaba[i];
166
167 typedef typename SizeDepType<JointModel::NV>::template ColsReturn<Matrix6x>::Type ColBlock;
168
1/2
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
910 ColBlock Jcols = jmodel.jointCols(data.J);
169
170 910 Force & fi = data.of[i];
171
172
6/12
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 455 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 455 times.
✗ Branch 17 not taken.
910 jmodel.jointVelocitySelector(data.u).noalias() -= Jcols.transpose() * fi.toVector();
173
174
4/8
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
910 jdata.U().noalias() = Ia * Jcols;
175
6/12
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 455 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 455 times.
✗ Branch 17 not taken.
910 jdata.StU().noalias() = Jcols.transpose() * jdata.U();
176
177 // Account for the rotor inertia contribution
178
4/8
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
910 jdata.StU().diagonal() += jmodel.jointVelocitySelector(model.armature);
179
180
3/6
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
910 ::pinocchio::internal::PerformStYSInversion<Scalar>::run(jdata.StU(), jdata.Dinv());
181
6/12
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 455 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 455 times.
✗ Branch 17 not taken.
910 jdata.UDinv().noalias() = jdata.U() * jdata.Dinv();
182
183
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 38 times.
910 if (parent > 0)
184 {
185
6/12
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 417 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 417 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 417 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 417 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 417 times.
✗ Branch 17 not taken.
834 Ia.noalias() -= jdata.UDinv() * jdata.U().transpose();
186
187
4/8
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 417 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 417 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 417 times.
✗ Branch 11 not taken.
834 fi.toVector().noalias() +=
188
5/10
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 417 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 417 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 417 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 417 times.
✗ Branch 15 not taken.
834 Ia * data.oa_gf[i].toVector() + jdata.UDinv() * jmodel.jointVelocitySelector(data.u);
189
1/2
✓ Branch 2 taken 417 times.
✗ Branch 3 not taken.
834 data.oYaba[parent] += Ia;
190
1/2
✓ Branch 2 taken 417 times.
✗ Branch 3 not taken.
834 data.of[parent] += fi;
191 }
192 }
193 };
194
195 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
196 struct AbaWorldConventionForwardStep2
197 : public fusion::JointUnaryVisitorBase<
198 AbaWorldConventionForwardStep2<Scalar, Options, JointCollectionTpl>>
199 {
200 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
201 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
202
203 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
204
205 template<typename JointModel>
206 910 static void algo(
207 const pinocchio::JointModelBase<JointModel> & jmodel,
208 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
209 const Model & model,
210 Data & data)
211 {
212
213 typedef typename Model::JointIndex JointIndex;
214 typedef typename Data::Matrix6x Matrix6x;
215
216 typedef typename SizeDepType<JointModel::NV>::template ColsReturn<Matrix6x>::Type ColBlock;
217
1/2
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
910 ColBlock J_cols = jmodel.jointCols(data.J);
218
219
1/2
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
910 const JointIndex i = jmodel.id();
220 910 const JointIndex parent = model.parents[i];
221
222
1/2
✓ Branch 3 taken 455 times.
✗ Branch 4 not taken.
910 data.oa_gf[i] += data.oa_gf[parent]; // does take into account the gravity field
223
4/8
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 455 times.
✗ Branch 11 not taken.
910 jmodel.jointVelocitySelector(data.ddq).noalias() =
224
3/6
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 455 times.
✗ Branch 8 not taken.
910 jdata.Dinv() * jmodel.jointVelocitySelector(data.u)
225
4/8
✓ Branch 2 taken 455 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 455 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 455 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 455 times.
✗ Branch 12 not taken.
910 - jdata.UDinv().transpose() * data.oa_gf[i].toVector();
226
5/10
✓ Branch 1 taken 455 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 455 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 455 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 455 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 455 times.
✗ Branch 15 not taken.
910 data.oa_gf[i].toVector().noalias() += J_cols * jmodel.jointVelocitySelector(data.ddq);
227
228 // Handle consistent output
229
2/4
✓ Branch 2 taken 455 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 455 times.
✗ Branch 7 not taken.
910 data.oa[i] = data.oa_gf[i] + model.gravity;
230
4/8
✓ Branch 3 taken 455 times.
✗ Branch 4 not taken.
✓ Branch 8 taken 455 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 455 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 455 times.
✗ Branch 16 not taken.
910 data.of[i] = data.oinertias[i] * data.oa_gf[i] + data.ov[i].cross(data.oh[i]);
231 }
232 };
233
234 template<
235 typename Scalar,
236 int Options,
237 template<typename, int> class JointCollectionTpl,
238 typename ConfigVectorType,
239 typename TangentVectorType1,
240 typename TangentVectorType2>
241 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType &
242 51 abaWorldConvention(
243 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
244 DataTpl<Scalar, Options, JointCollectionTpl> & data,
245 const Eigen::MatrixBase<ConfigVectorType> & q,
246 const Eigen::MatrixBase<TangentVectorType1> & v,
247 const Eigen::MatrixBase<TangentVectorType2> & tau)
248 {
249
1/2
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
51 assert(model.check(data) && "data is not consistent with model.");
250
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
51 PINOCCHIO_CHECK_INPUT_ARGUMENT(
251 q.size() == model.nq, "The joint configuration vector is not of right size");
252
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
51 PINOCCHIO_CHECK_INPUT_ARGUMENT(
253 v.size() == model.nv, "The joint velocity vector is not of right size");
254
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 35 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
51 PINOCCHIO_CHECK_INPUT_ARGUMENT(
255 tau.size() == model.nv, "The joint acceleration vector is not of right size");
256
257 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
258
259
1/2
✓ Branch 3 taken 35 times.
✗ Branch 4 not taken.
51 data.oa_gf[0] = -model.gravity;
260 51 data.of[0].setZero();
261 51 data.u = tau;
262
263 typedef AbaWorldConventionForwardStep1<
264 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1>
265 Pass1;
266
2/2
✓ Branch 0 taken 374 times.
✓ Branch 1 taken 35 times.
545 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
267 {
268
1/2
✓ Branch 1 taken 374 times.
✗ Branch 2 not taken.
494 Pass1::run(
269 494 model.joints[i], data.joints[i],
270 988 typename Pass1::ArgsType(model, data, q.derived(), v.derived()));
271 }
272
273 typedef AbaWorldConventionBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
274
2/2
✓ Branch 0 taken 374 times.
✓ Branch 1 taken 35 times.
545 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
275 {
276
1/2
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
494 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
277 }
278
279 typedef AbaWorldConventionForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
280
2/2
✓ Branch 0 taken 374 times.
✓ Branch 1 taken 35 times.
545 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
281 {
282
1/2
✓ Branch 4 taken 374 times.
✗ Branch 5 not taken.
494 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
283 }
284
285
2/2
✓ Branch 0 taken 374 times.
✓ Branch 1 taken 35 times.
545 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
286 {
287 494 const JointIndex parent = model.parents[i];
288 494 data.of[parent] += data.of[i];
289 }
290
291 51 return data.ddq;
292 }
293
294 template<
295 typename Scalar,
296 int Options,
297 template<typename, int> class JointCollectionTpl,
298 typename ConfigVectorType,
299 typename TangentVectorType1,
300 typename TangentVectorType2,
301 typename ForceDerived>
302 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType &
303 3 abaWorldConvention(
304 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
305 DataTpl<Scalar, Options, JointCollectionTpl> & data,
306 const Eigen::MatrixBase<ConfigVectorType> & q,
307 const Eigen::MatrixBase<TangentVectorType1> & v,
308 const Eigen::MatrixBase<TangentVectorType2> & tau,
309 const container::aligned_vector<ForceDerived> & fext)
310
311 {
312
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
3 assert(model.check(data) && "data is not consistent with model.");
313
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
3 PINOCCHIO_CHECK_INPUT_ARGUMENT(
314 q.size() == model.nq, "The joint configuration vector is not of right size");
315
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
3 PINOCCHIO_CHECK_INPUT_ARGUMENT(
316 v.size() == model.nv, "The joint velocity vector is not of right size");
317
1/4
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
3 PINOCCHIO_CHECK_INPUT_ARGUMENT(
318 tau.size() == model.nv, "The joint acceleration vector is not of right size");
319
320 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
321
322
1/2
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
3 data.oa_gf[0] = -model.gravity;
323 3 data.u = tau;
324
325 typedef AbaWorldConventionForwardStep1<
326 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1>
327 Pass1;
328
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
329 {
330
1/2
✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
81 Pass1::run(
331 81 model.joints[i], data.joints[i],
332 81 typename Pass1::ArgsType(model, data, q.derived(), v.derived()));
333
1/2
✓ Branch 5 taken 81 times.
✗ Branch 6 not taken.
81 data.of[i] -= data.oMi[i].act(fext[i]);
334 }
335
336 typedef AbaWorldConventionBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
337
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
338 {
339
1/2
✓ Branch 4 taken 81 times.
✗ Branch 5 not taken.
81 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
340 }
341
342 typedef AbaWorldConventionForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
343
2/2
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 3 times.
84 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
344 {
345
1/2
✓ Branch 4 taken 81 times.
✗ Branch 5 not taken.
81 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
346 }
347
348 3 return data.ddq;
349 }
350
351 template<
352 typename Scalar,
353 int Options,
354 template<typename, int> class JointCollectionTpl,
355 typename ConfigVectorType,
356 typename TangentVectorType>
357 struct AbaLocalConventionForwardStep1
358 : public fusion::JointUnaryVisitorBase<AbaLocalConventionForwardStep1<
359 Scalar,
360 Options,
361 JointCollectionTpl,
362 ConfigVectorType,
363 TangentVectorType>>
364 {
365 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
366 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
367
368 typedef boost::fusion::
369 vector<const Model &, Data &, const ConfigVectorType &, const TangentVectorType &>
370 ArgsType;
371
372 template<typename JointModel>
373 12048 static void algo(
374 const pinocchio::JointModelBase<JointModel> & jmodel,
375 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
376 const Model & model,
377 Data & data,
378 const Eigen::MatrixBase<ConfigVectorType> & q,
379 const Eigen::MatrixBase<TangentVectorType> & v)
380 {
381 typedef typename Model::JointIndex JointIndex;
382
383 12048 const JointIndex i = jmodel.id();
384 12048 jmodel.calc(jdata.derived(), q.derived(), v.derived());
385
386 12048 const JointIndex & parent = model.parents[i];
387
3/5
✓ Branch 4 taken 5647 times.
✓ Branch 5 taken 377 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 5647 times.
✗ Branch 9 not taken.
12048 data.liMi[i] = model.jointPlacements[i] * jdata.M();
388
389 12048 data.v[i] = jdata.v();
390
2/2
✓ Branch 0 taken 5644 times.
✓ Branch 1 taken 380 times.
12048 if (parent > 0)
391
1/2
✓ Branch 5 taken 5644 times.
✗ Branch 6 not taken.
11288 data.v[i] += data.liMi[i].actInv(data.v[parent]);
392
393
2/8
✓ Branch 4 taken 6024 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 6024 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
12048 data.a_gf[i] = jdata.c() + (data.v[i] ^ jdata.v());
394
395 12048 data.Yaba[i] = model.inertias[i].matrix();
396
1/2
✓ Branch 5 taken 6024 times.
✗ Branch 6 not taken.
12048 data.h[i] = model.inertias[i] * data.v[i];
397
1/2
✓ Branch 5 taken 6024 times.
✗ Branch 6 not taken.
12048 data.f[i] = data.v[i].cross(data.h[i]); // -f_ext
398 }
399 };
400
401 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
402 struct AbaLocalConventionBackwardStep
403 : public fusion::JointUnaryVisitorBase<
404 AbaLocalConventionBackwardStep<Scalar, Options, JointCollectionTpl>>
405 {
406 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
407 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
408
409 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
410
411 template<typename JointModel>
412 12048 static void algo(
413 const JointModelBase<JointModel> & jmodel,
414 JointDataBase<typename JointModel::JointDataDerived> & jdata,
415 const Model & model,
416 Data & data)
417 {
418 typedef typename Model::JointIndex JointIndex;
419 typedef typename Data::Inertia Inertia;
420 typedef typename Data::Force Force;
421
422 12048 const JointIndex i = jmodel.id();
423 12048 const JointIndex parent = model.parents[i];
424 12048 typename Inertia::Matrix6 & Ia = data.Yaba[i];
425
426
3/6
✓ Branch 4 taken 6024 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6024 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6024 times.
✗ Branch 11 not taken.
12048 jmodel.jointVelocitySelector(data.u) -= jdata.S().transpose() * data.f[i];
427
1/2
✓ Branch 1 taken 6024 times.
✗ Branch 2 not taken.
12048 jmodel.calc_aba(
428 12048 jdata.derived(), jmodel.jointVelocitySelector(model.armature), Ia, parent > 0);
429
430
2/2
✓ Branch 0 taken 5644 times.
✓ Branch 1 taken 380 times.
12048 if (parent > 0)
431 {
432 11288 Force & pa = data.f[i];
433
4/8
✓ Branch 1 taken 5644 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 5644 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 5644 times.
✗ Branch 11 not taken.
11288 pa.toVector().noalias() +=
434
4/8
✓ Branch 2 taken 5644 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5644 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 5644 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 5644 times.
✗ Branch 13 not taken.
11288 Ia * data.a_gf[i].toVector() + jdata.UDinv() * jmodel.jointVelocitySelector(data.u);
435
1/2
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
11288 data.Yaba[parent] += internal::SE3actOn<Scalar>::run(data.liMi[i], Ia);
436
1/2
✓ Branch 4 taken 5644 times.
✗ Branch 5 not taken.
11288 data.f[parent] += data.liMi[i].act(pa);
437 }
438 }
439 };
440
441 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
442 struct AbaLocalConventionForwardStep2
443 : public fusion::JointUnaryVisitorBase<
444 AbaLocalConventionForwardStep2<Scalar, Options, JointCollectionTpl>>
445 {
446 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
447 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
448
449 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
450
451 template<typename JointModel>
452 12048 static void algo(
453 const pinocchio::JointModelBase<JointModel> & jmodel,
454 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
455 const Model & model,
456 Data & data)
457 {
458 typedef typename Model::JointIndex JointIndex;
459
460 12048 const JointIndex i = jmodel.id();
461 12048 const JointIndex parent = model.parents[i];
462
463
1/2
✓ Branch 5 taken 6024 times.
✗ Branch 6 not taken.
12048 data.a_gf[i] += data.liMi[i].actInv(data.a_gf[parent]);
464
4/8
✓ Branch 1 taken 6024 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6024 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6024 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 6024 times.
✗ Branch 11 not taken.
12048 jmodel.jointVelocitySelector(data.ddq).noalias() =
465
3/6
✓ Branch 1 taken 6024 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6024 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 6024 times.
✗ Branch 8 not taken.
12048 jdata.Dinv() * jmodel.jointVelocitySelector(data.u)
466
1/2
✓ Branch 5 taken 6024 times.
✗ Branch 6 not taken.
12048 - jdata.UDinv().transpose() * data.a_gf[i].toVector();
467
3/6
✓ Branch 2 taken 6024 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 6024 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 6024 times.
✗ Branch 10 not taken.
12048 data.a_gf[i] += jdata.S() * jmodel.jointVelocitySelector(data.ddq);
468
469 12048 data.a[i] = data.a_gf[i];
470
6/12
✓ Branch 3 taken 6024 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 6024 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 6024 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 6024 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 6024 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 6024 times.
✗ Branch 20 not taken.
12048 data.a[i].linear().noalias() += data.oMi[i].rotation().transpose() * model.gravity.linear();
471
3/6
✓ Branch 6 taken 6024 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 6024 times.
✗ Branch 10 not taken.
✓ Branch 13 taken 6024 times.
✗ Branch 14 not taken.
12048 data.f[i] = model.inertias[i] * data.a_gf[i] + data.v[i].cross(data.h[i]);
472 }
473 };
474
475 template<
476 typename Scalar,
477 int Options,
478 template<typename, int> class JointCollectionTpl,
479 typename ConfigVectorType,
480 typename TangentVectorType1,
481 typename TangentVectorType2>
482 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType &
483 279 abaLocalConvention(
484 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
485 DataTpl<Scalar, Options, JointCollectionTpl> & data,
486 const Eigen::MatrixBase<ConfigVectorType> & q,
487 const Eigen::MatrixBase<TangentVectorType1> & v,
488 const Eigen::MatrixBase<TangentVectorType2> & tau)
489 {
490
1/2
✓ Branch 1 taken 276 times.
✗ Branch 2 not taken.
279 assert(model.check(data) && "data is not consistent with model.");
491
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 276 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.
279 PINOCCHIO_CHECK_ARGUMENT_SIZE(
492 q.size(), model.nq, "The joint configuration vector is not of right size");
493
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 276 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.
279 PINOCCHIO_CHECK_ARGUMENT_SIZE(
494 v.size(), model.nv, "The joint velocity vector is not of right size");
495
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 276 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.
279 PINOCCHIO_CHECK_ARGUMENT_SIZE(
496 tau.size(), model.nv, "The joint torque vector is not of right size");
497 ;
498
499 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
500
501 279 data.v[0].setZero();
502
1/2
✓ Branch 3 taken 276 times.
✗ Branch 4 not taken.
279 data.a_gf[0] = -model.gravity;
503 279 data.f[0].setZero();
504 279 data.u = tau;
505
506 typedef AbaLocalConventionForwardStep1<
507 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1>
508 Pass1;
509
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 276 times.
3576 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
510 {
511
1/2
✓ Branch 1 taken 3216 times.
✗ Branch 2 not taken.
3297 Pass1::run(
512 3297 model.joints[i], data.joints[i],
513 6594 typename Pass1::ArgsType(model, data, q.derived(), v.derived()));
514 }
515
516 typedef AbaLocalConventionBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
517
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 276 times.
3576 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
518 {
519
1/2
✓ Branch 4 taken 3216 times.
✗ Branch 5 not taken.
3297 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
520 }
521
522 typedef AbaLocalConventionForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
523
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 276 times.
3576 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
524 {
525
1/2
✓ Branch 4 taken 3216 times.
✗ Branch 5 not taken.
3297 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
526 }
527
528
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 276 times.
3576 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
529 {
530 3297 const JointIndex parent = model.parents[i];
531
1/2
✓ Branch 5 taken 3216 times.
✗ Branch 6 not taken.
3297 data.f[parent] += data.liMi[i].act(data.f[i]);
532 }
533
534 279 return data.ddq;
535 }
536
537 template<
538 typename Scalar,
539 int Options,
540 template<typename, int> class JointCollectionTpl,
541 typename ConfigVectorType,
542 typename TangentVectorType1,
543 typename TangentVectorType2,
544 typename ForceDerived>
545 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType &
546 104 abaLocalConvention(
547 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
548 DataTpl<Scalar, Options, JointCollectionTpl> & data,
549 const Eigen::MatrixBase<ConfigVectorType> & q,
550 const Eigen::MatrixBase<TangentVectorType1> & v,
551 const Eigen::MatrixBase<TangentVectorType2> & tau,
552 const container::aligned_vector<ForceDerived> & fext)
553
554 {
555
1/2
✓ Branch 1 taken 104 times.
✗ Branch 2 not taken.
104 assert(model.check(data) && "data is not consistent with model.");
556
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 104 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.
104 PINOCCHIO_CHECK_ARGUMENT_SIZE(
557 q.size(), model.nq, "The joint configuration vector is not of right size");
558
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 104 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.
104 PINOCCHIO_CHECK_ARGUMENT_SIZE(
559 v.size(), model.nv, "The joint velocity vector is not of right size");
560
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 104 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.
104 PINOCCHIO_CHECK_ARGUMENT_SIZE(
561 tau.size(), model.nv, "The joint torque vector is not of right size");
562
563 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
564
565 104 data.v[0].setZero();
566
1/2
✓ Branch 3 taken 104 times.
✗ Branch 4 not taken.
104 data.a_gf[0] = -model.gravity;
567 104 data.u = tau;
568
569 typedef AbaLocalConventionForwardStep1<
570 Scalar, Options, JointCollectionTpl, ConfigVectorType, TangentVectorType1>
571 Pass1;
572
2/2
✓ Branch 0 taken 2808 times.
✓ Branch 1 taken 104 times.
2912 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
573 {
574
1/2
✓ Branch 1 taken 2808 times.
✗ Branch 2 not taken.
2808 Pass1::run(
575 2808 model.joints[i], data.joints[i],
576 2808 typename Pass1::ArgsType(model, data, q.derived(), v.derived()));
577 2808 data.f[i] -= fext[i];
578 }
579
580 typedef AbaLocalConventionBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
581
2/2
✓ Branch 0 taken 2808 times.
✓ Branch 1 taken 104 times.
2912 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
582 {
583
1/2
✓ Branch 4 taken 2808 times.
✗ Branch 5 not taken.
2808 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
584 }
585
586 typedef AbaLocalConventionForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
587
2/2
✓ Branch 0 taken 2808 times.
✓ Branch 1 taken 104 times.
2912 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
588 {
589
1/2
✓ Branch 4 taken 2808 times.
✗ Branch 5 not taken.
2808 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
590 }
591
592
2/2
✓ Branch 0 taken 2808 times.
✓ Branch 1 taken 104 times.
2912 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
593 {
594 2808 const JointIndex parent = model.parents[i];
595
1/2
✓ Branch 5 taken 2808 times.
✗ Branch 6 not taken.
2808 data.f[parent] += data.liMi[i].act(data.f[i]);
596 }
597
598 104 return data.ddq;
599 }
600
601 template<
602 typename Scalar,
603 int Options,
604 template<typename, int> class JointCollectionTpl,
605 typename ConfigVectorType>
606 struct ComputeMinverseForwardStep1
607 : public fusion::JointUnaryVisitorBase<
608 ComputeMinverseForwardStep1<Scalar, Options, JointCollectionTpl, ConfigVectorType>>
609 {
610 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
611 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
612
613 typedef boost::fusion::vector<const Model &, Data &, const ConfigVectorType &> ArgsType;
614
615 template<typename JointModel>
616 1458 static void algo(
617 const pinocchio::JointModelBase<JointModel> & jmodel,
618 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
619 const Model & model,
620 Data & data,
621 const Eigen::MatrixBase<ConfigVectorType> & q)
622 {
623 typedef typename Model::JointIndex JointIndex;
624
625
1/2
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
1458 const JointIndex & i = jmodel.id();
626
1/2
✓ Branch 3 taken 729 times.
✗ Branch 4 not taken.
1458 jmodel.calc(jdata.derived(), q.derived());
627
628 1458 const JointIndex & parent = model.parents[i];
629
6/10
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 702 times.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 702 times.
✓ Branch 9 taken 27 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 702 times.
✗ Branch 13 not taken.
1458 data.liMi[i] = model.jointPlacements[i] * jdata.M();
630
631
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 27 times.
1458 if (parent > 0)
632
2/4
✓ Branch 3 taken 702 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 702 times.
✗ Branch 8 not taken.
1404 data.oMi[i] = data.oMi[parent] * data.liMi[i];
633 else
634
1/2
✓ Branch 3 taken 27 times.
✗ Branch 4 not taken.
54 data.oMi[i] = data.liMi[i];
635
636 typedef
637 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
638 ColsBlock;
639
1/2
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
1458 ColsBlock J_cols = jmodel.jointCols(data.J);
640
3/6
✓ Branch 2 taken 729 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 729 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 729 times.
✗ Branch 9 not taken.
1458 J_cols = data.oMi[i].act(jdata.S());
641
642
2/4
✓ Branch 3 taken 729 times.
✗ Branch 4 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
1458 data.oYcrb[i] = data.oMi[i].act(model.inertias[i]);
643
1/2
✓ Branch 2 taken 729 times.
✗ Branch 3 not taken.
1458 data.oYaba[i] = data.oYcrb[i].matrix();
644 }
645 };
646
647 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
648 struct ComputeMinverseBackwardStep
649 : public fusion::JointUnaryVisitorBase<
650 ComputeMinverseBackwardStep<Scalar, Options, JointCollectionTpl>>
651 {
652 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
653 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
654
655 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
656
657 template<typename JointModel>
658 1458 static void algo(
659 const JointModelBase<JointModel> & jmodel,
660 JointDataBase<typename JointModel::JointDataDerived> & jdata,
661 const Model & model,
662 Data & data)
663 {
664 typedef typename Model::JointIndex JointIndex;
665 typedef typename Data::Inertia Inertia;
666
667
1/2
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
1458 const JointIndex i = jmodel.id();
668 1458 const JointIndex parent = model.parents[i];
669
670 1458 typename Inertia::Matrix6 & Ia = data.oYaba[i];
671 1458 typename Data::RowMatrixXs & Minv = data.Minv;
672 1458 typename Data::Matrix6x & Fcrb = data.Fcrb[0];
673 typedef
674 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
675 ColsBlock;
676
677
1/2
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
1458 ColsBlock J_cols = jmodel.jointCols(data.J);
678
679
4/8
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 729 times.
✗ Branch 11 not taken.
1458 jdata.U().noalias() = Ia * J_cols;
680
6/12
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 729 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 729 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 729 times.
✗ Branch 17 not taken.
1458 jdata.StU().noalias() = J_cols.transpose() * jdata.U();
681
682 // Account for the rotor inertia contribution
683
4/8
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 729 times.
✗ Branch 11 not taken.
1458 jdata.StU().diagonal() += jmodel.jointVelocitySelector(model.armature);
684
685
3/6
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
1458 ::pinocchio::internal::PerformStYSInversion<Scalar>::run(jdata.StU(), jdata.Dinv());
686
6/12
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 729 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 729 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 729 times.
✗ Branch 17 not taken.
1458 jdata.UDinv().noalias() = jdata.U() * jdata.Dinv();
687
688
7/14
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 729 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 729 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 729 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 729 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 729 times.
✗ Branch 20 not taken.
1458 Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), jmodel.nv()) = jdata.Dinv();
689
1/2
✓ Branch 2 taken 729 times.
✗ Branch 3 not taken.
1458 const int nv_children = data.nvSubtree[i] - jmodel.nv();
690
2/2
✓ Branch 0 taken 621 times.
✓ Branch 1 taken 108 times.
1458 if (nv_children > 0)
691 {
692
1/2
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
1242 ColsBlock SDinv_cols = jmodel.jointCols(data.SDinv);
693
4/8
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 621 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 621 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 621 times.
✗ Branch 11 not taken.
1242 SDinv_cols.noalias() = J_cols * jdata.Dinv();
694
695
5/10
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 621 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 621 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 621 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 621 times.
✗ Branch 14 not taken.
1242 Minv.block(jmodel.idx_v(), jmodel.idx_v() + jmodel.nv(), jmodel.nv(), nv_children)
696
4/8
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 621 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 621 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 621 times.
✗ Branch 11 not taken.
2484 .noalias() =
697
4/8
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 621 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 621 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 621 times.
✗ Branch 11 not taken.
1242 -SDinv_cols.transpose() * Fcrb.middleCols(jmodel.idx_v() + jmodel.nv(), nv_children);
698
699
2/2
✓ Branch 0 taken 594 times.
✓ Branch 1 taken 27 times.
1242 if (parent > 0)
700 {
701
4/8
✓ Branch 2 taken 594 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 594 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 594 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 594 times.
✗ Branch 12 not taken.
1188 Fcrb.middleCols(jmodel.idx_v(), data.nvSubtree[i]).noalias() +=
702
1/2
✓ Branch 1 taken 594 times.
✗ Branch 2 not taken.
1188 jdata.U()
703
5/10
✓ Branch 2 taken 594 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 594 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 594 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 594 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 594 times.
✗ Branch 15 not taken.
3564 * Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), data.nvSubtree[i]);
704 ;
705 }
706 }
707 else
708 {
709
4/8
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 108 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 108 times.
✗ Branch 12 not taken.
216 Fcrb.middleCols(jmodel.idx_v(), data.nvSubtree[i]).noalias() =
710
6/12
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 108 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 108 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 108 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 108 times.
✗ Branch 18 not taken.
432 jdata.U() * Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), data.nvSubtree[i]);
711 }
712
713
2/2
✓ Branch 0 taken 702 times.
✓ Branch 1 taken 27 times.
1458 if (parent > 0)
714 {
715
6/12
✓ Branch 1 taken 702 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 702 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 702 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 702 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 702 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 702 times.
✗ Branch 17 not taken.
1404 Ia.noalias() -= jdata.UDinv() * jdata.U().transpose();
716
1/2
✓ Branch 2 taken 702 times.
✗ Branch 3 not taken.
1404 data.oYaba[parent] += Ia;
717 }
718 }
719 };
720
721 namespace optimized
722 {
723 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
724 struct ComputeMinverseBackwardStep
725 : public fusion::JointUnaryVisitorBase<
726 ComputeMinverseBackwardStep<Scalar, Options, JointCollectionTpl>>
727 {
728 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
729 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
730
731 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
732
733 template<typename JointModel>
734 54 static void algo(
735 const JointModelBase<JointModel> & jmodel,
736 JointDataBase<typename JointModel::JointDataDerived> & jdata,
737 const Model & model,
738 Data & data)
739 {
740 typedef typename Model::JointIndex JointIndex;
741
742
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
54 const JointIndex i = jmodel.id();
743 54 const JointIndex parent = model.parents[i];
744
745 54 typename Data::RowMatrixXs & Minv = data.Minv;
746 54 typename Data::Matrix6x & Fcrb = data.Fcrb[0];
747 typedef
748 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
749 ColsBlock;
750
751
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
54 const ColsBlock J_cols = jmodel.jointCols(data.J);
752
753
7/14
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 27 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 27 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 27 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 27 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 27 times.
✗ Branch 20 not taken.
54 Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), jmodel.nv()) = jdata.Dinv();
754
1/2
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 const int nv_children = data.nvSubtree[i] - jmodel.nv();
755
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 4 times.
54 if (nv_children > 0)
756 {
757
1/2
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
46 ColsBlock SDinv_cols = jmodel.jointCols(data.SDinv);
758
4/8
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 23 times.
✗ Branch 11 not taken.
46 SDinv_cols.noalias() = J_cols * jdata.Dinv();
759
5/10
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 23 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 23 times.
✗ Branch 14 not taken.
46 Minv.block(jmodel.idx_v(), jmodel.idx_v() + jmodel.nv(), jmodel.nv(), nv_children)
760
4/8
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 23 times.
✗ Branch 11 not taken.
92 .noalias() =
761
4/8
✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 23 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 23 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 23 times.
✗ Branch 11 not taken.
46 -SDinv_cols.transpose() * Fcrb.middleCols(jmodel.idx_v() + jmodel.nv(), nv_children);
762
763
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 1 times.
46 if (parent > 0)
764 {
765
4/8
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 22 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 22 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 22 times.
✗ Branch 12 not taken.
44 Fcrb.middleCols(jmodel.idx_v(), data.nvSubtree[i]).noalias() +=
766
1/2
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
44 jdata.U()
767
5/10
✓ Branch 2 taken 22 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 22 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 22 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 22 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 22 times.
✗ Branch 15 not taken.
132 * Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), data.nvSubtree[i]);
768 ;
769 }
770 }
771 else
772 {
773
4/8
✓ 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.
8 Fcrb.middleCols(jmodel.idx_v(), data.nvSubtree[i]).noalias() =
774
1/2
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
8 jdata.U()
775
5/10
✓ 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.
24 * Minv.block(jmodel.idx_v(), jmodel.idx_v(), jmodel.nv(), data.nvSubtree[i]);
776 }
777 }
778 };
779 } // namespace optimized
780
781 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
782 struct ComputeMinverseForwardStep2
783 : public fusion::JointUnaryVisitorBase<
784 ComputeMinverseForwardStep2<Scalar, Options, JointCollectionTpl>>
785 {
786 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
787 typedef DataTpl<Scalar, Options, JointCollectionTpl> Data;
788
789 typedef boost::fusion::vector<const Model &, Data &> ArgsType;
790
791 template<typename JointModel>
792 1512 static void algo(
793 const pinocchio::JointModelBase<JointModel> & jmodel,
794 pinocchio::JointDataBase<typename JointModel::JointDataDerived> & jdata,
795 const Model & model,
796 Data & data)
797 {
798 typedef typename Model::JointIndex JointIndex;
799
800
1/2
✓ Branch 1 taken 756 times.
✗ Branch 2 not taken.
1512 const JointIndex i = jmodel.id();
801 1512 const JointIndex parent = model.parents[i];
802 1512 typename Data::RowMatrixXs & Minv = data.Minv;
803
804 typedef
805 typename SizeDepType<JointModel::NV>::template ColsReturn<typename Data::Matrix6x>::Type
806 ColsBlock;
807
1/2
✓ Branch 1 taken 756 times.
✗ Branch 2 not taken.
1512 ColsBlock J_cols = jmodel.jointCols(data.J);
808
809
2/2
✓ Branch 0 taken 728 times.
✓ Branch 1 taken 28 times.
1512 if (parent > 0)
810 {
811
3/6
✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 728 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 728 times.
✗ Branch 8 not taken.
1456 Minv.middleRows(jmodel.idx_v(), jmodel.nv())
812
2/4
✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 728 times.
✗ Branch 5 not taken.
1456 .rightCols(model.nv - jmodel.idx_v())
813
2/4
✓ Branch 1 taken 728 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 728 times.
✗ Branch 5 not taken.
1456 .noalias() -=
814
5/10
✓ Branch 2 taken 728 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 728 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 728 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 728 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 728 times.
✗ Branch 15 not taken.
2912 jdata.UDinv().transpose() * data.Fcrb[parent].rightCols(model.nv - jmodel.idx_v());
815 }
816
817
4/8
✓ Branch 2 taken 756 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 756 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 756 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 756 times.
✗ Branch 12 not taken.
1512 data.Fcrb[i].rightCols(model.nv - jmodel.idx_v()).noalias() =
818 J_cols
819
6/12
✓ Branch 1 taken 756 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 756 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 756 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 756 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 756 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 756 times.
✗ Branch 17 not taken.
1512 * Minv.middleRows(jmodel.idx_v(), jmodel.nv()).rightCols(model.nv - jmodel.idx_v());
820
2/2
✓ Branch 0 taken 728 times.
✓ Branch 1 taken 28 times.
1512 if (parent > 0)
821
3/6
✓ Branch 2 taken 728 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 728 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 728 times.
✗ Branch 9 not taken.
1456 data.Fcrb[i].rightCols(model.nv - jmodel.idx_v()) +=
822
2/4
✓ Branch 2 taken 728 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 728 times.
✗ Branch 6 not taken.
2912 data.Fcrb[parent].rightCols(model.nv - jmodel.idx_v());
823 }
824 };
825
826 template<
827 typename Scalar,
828 int Options,
829 template<typename, int> class JointCollectionTpl,
830 typename ConfigVectorType>
831 27 const typename DataTpl<Scalar, Options, JointCollectionTpl>::RowMatrixXs & computeMinverse(
832 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
833 DataTpl<Scalar, Options, JointCollectionTpl> & data,
834 const Eigen::MatrixBase<ConfigVectorType> & q)
835 {
836
1/2
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
27 assert(model.check(data) && "data is not consistent with model.");
837
1/24
✗ Branch 1 not taken.
✓ Branch 2 taken 27 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.
27 PINOCCHIO_CHECK_ARGUMENT_SIZE(
838 q.size(), model.nq, "The joint configuration vector is not of right size");
839
840 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
841
1/2
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
27 data.Minv.template triangularView<Eigen::Upper>().setZero();
842
843 typedef ComputeMinverseForwardStep1<Scalar, Options, JointCollectionTpl, ConfigVectorType>
844 Pass1;
845
2/2
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 27 times.
756 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
846 {
847
1/2
✓ Branch 1 taken 729 times.
✗ Branch 2 not taken.
729 Pass1::run(
848 1458 model.joints[i], data.joints[i], typename Pass1::ArgsType(model, data, q.derived()));
849 }
850
851 27 data.Fcrb[0].setZero();
852 typedef ComputeMinverseBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
853
2/2
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 27 times.
756 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
854 {
855
1/2
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
729 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
856 }
857
858 typedef ComputeMinverseForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
859
2/2
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 27 times.
756 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
860 {
861
1/2
✓ Branch 4 taken 729 times.
✗ Branch 5 not taken.
729 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
862 }
863
864 27 return data.Minv;
865 }
866 } // namespace impl
867
868 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
869 1 const typename DataTpl<Scalar, Options, JointCollectionTpl>::RowMatrixXs & computeMinverse(
870 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
871 DataTpl<Scalar, Options, JointCollectionTpl> & data)
872 {
873
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 assert(model.check(data) && "data is not consistent with model.");
874
875 typedef typename ModelTpl<Scalar, Options, JointCollectionTpl>::JointIndex JointIndex;
876
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 data.Minv.template triangularView<Eigen::Upper>().setZero();
877
878 1 data.Fcrb[0].setZero();
879 typedef impl::optimized::ComputeMinverseBackwardStep<Scalar, Options, JointCollectionTpl> Pass2;
880
2/2
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 1 times.
28 for (JointIndex i = (JointIndex)model.njoints - 1; i > 0; --i)
881 {
882
1/2
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
27 Pass2::run(model.joints[i], data.joints[i], typename Pass2::ArgsType(model, data));
883 }
884
885 typedef impl::ComputeMinverseForwardStep2<Scalar, Options, JointCollectionTpl> Pass3;
886
2/2
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 1 times.
28 for (JointIndex i = 1; i < (JointIndex)model.njoints; ++i)
887 {
888
1/2
✓ Branch 4 taken 27 times.
✗ Branch 5 not taken.
27 Pass3::run(model.joints[i], data.joints[i], typename Pass3::ArgsType(model, data));
889 }
890
891 1 return data.Minv;
892 }
893
894 // --- CHECKER ---------------------------------------------------------------
895 // --- CHECKER ---------------------------------------------------------------
896 // --- CHECKER ---------------------------------------------------------------
897
898 // Check whether all masses are nonzero and diagonal of inertia is nonzero
899 // The second test is overconstraining.
900 template<typename Scalar, int Options, template<typename, int> class JointCollectionTpl>
901 inline bool
902 3 ABAChecker::checkModel_impl(const ModelTpl<Scalar, Options, JointCollectionTpl> & model) const
903 {
904 typedef ModelTpl<Scalar, Options, JointCollectionTpl> Model;
905 typedef typename Model::JointIndex JointIndex;
906
907
2/2
✓ Branch 0 taken 55 times.
✓ Branch 1 taken 2 times.
57 for (JointIndex j = 1; j < (JointIndex)model.njoints; j++)
908 55 if (
909
2/2
✓ Branch 6 taken 54 times.
✓ Branch 7 taken 1 times.
110 (model.inertias[j].mass() < 1e-5) || (model.inertias[j].inertia().data()[0] < 1e-5)
910
1/2
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
54 || (model.inertias[j].inertia().data()[2] < 1e-5)
911
4/6
✓ Branch 0 taken 55 times.
✗ Branch 1 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 54 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 54 times.
110 || (model.inertias[j].inertia().data()[5] < 1e-5))
912 1 return false;
913 2 return true;
914 }
915
916 template<
917 typename Scalar,
918 int Options,
919 template<typename, int> class JointCollectionTpl,
920 typename ConfigVectorType,
921 typename TangentVectorType1,
922 typename TangentVectorType2>
923 330 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType & aba(
924 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
925 DataTpl<Scalar, Options, JointCollectionTpl> & data,
926 const Eigen::MatrixBase<ConfigVectorType> & q,
927 const Eigen::MatrixBase<TangentVectorType1> & v,
928 const Eigen::MatrixBase<TangentVectorType2> & tau,
929 const Convention convention)
930 {
931
2/3
✓ Branch 0 taken 276 times.
✓ Branch 1 taken 35 times.
✗ Branch 2 not taken.
330 switch (convention)
932 {
933 279 case Convention::LOCAL:
934 279 return impl::abaLocalConvention(model, data, q, v, tau);
935 51 case Convention::WORLD:
936 51 return impl::abaWorldConvention(model, data, q, v, tau);
937 }
938 }
939
940 template<
941 typename Scalar,
942 int Options,
943 template<typename, int> class JointCollectionTpl,
944 typename ConfigVectorType,
945 typename TangentVectorType1,
946 typename TangentVectorType2,
947 typename ForceDerived>
948 107 const typename DataTpl<Scalar, Options, JointCollectionTpl>::TangentVectorType & aba(
949 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
950 DataTpl<Scalar, Options, JointCollectionTpl> & data,
951 const Eigen::MatrixBase<ConfigVectorType> & q,
952 const Eigen::MatrixBase<TangentVectorType1> & v,
953 const Eigen::MatrixBase<TangentVectorType2> & tau,
954 const container::aligned_vector<ForceDerived> & fext,
955 const Convention convention)
956 {
957
2/3
✓ Branch 0 taken 104 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
107 switch (convention)
958 {
959 104 case Convention::LOCAL:
960 104 return impl::abaLocalConvention(model, data, q, v, tau, fext);
961 3 case Convention::WORLD:
962 3 return impl::abaWorldConvention(model, data, q, v, tau, fext);
963 }
964 }
965
966 template<
967 typename Scalar,
968 int Options,
969 template<typename, int> class JointCollectionTpl,
970 typename ConfigVectorType>
971 27 const typename DataTpl<Scalar, Options, JointCollectionTpl>::RowMatrixXs & computeMinverse(
972 const ModelTpl<Scalar, Options, JointCollectionTpl> & model,
973 DataTpl<Scalar, Options, JointCollectionTpl> & data,
974 const Eigen::MatrixBase<ConfigVectorType> & q)
975 {
976
1/2
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
27 return impl::computeMinverse(model, data, make_const_ref(q));
977 }
978
979 } // namespace pinocchio
980
981 /// @endcond
982
983 #endif // ifndef __pinocchio_algorithm_aba_hxx__
984