GCC Code Coverage Report


Directory: ./
File: unittest/finite-differences.cpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 101 101 100.0%
Branches: 191 386 49.5%

Line Branch Exec Source
1 //
2 // Copyright (c) 2016-2019 CNRS INRIA
3 //
4
5 #include "pinocchio/multibody/model.hpp"
6 #include "pinocchio/multibody/data.hpp"
7 #include "pinocchio/multibody/sample-models.hpp"
8 #include "pinocchio/algorithm/joint-configuration.hpp"
9 #include "pinocchio/algorithm/kinematics.hpp"
10 #include "pinocchio/algorithm/jacobian.hpp"
11
12 #include <iostream>
13 #include <boost/test/unit_test.hpp>
14 #include <boost/utility/binary.hpp>
15
16 using namespace pinocchio;
17 using namespace Eigen;
18
19 template<bool local>
20 4 Data::Matrix6x finiteDiffJacobian(
21 const Model & model, Data & data, const Eigen::VectorXd & q, const Model::JointIndex joint_id)
22 {
23
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 Data::Matrix6x res(6, model.nv);
24
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 res.setZero();
25
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 VectorXd q_integrate(model.nq);
26
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 VectorXd v_integrate(model.nv);
27
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 v_integrate.setZero();
28
29
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 forwardKinematics(model, data, q);
30
1/2
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 const SE3 oMi_ref = data.oMi[joint_id];
31
32 4 double eps = 1e-8;
33
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2 times.
132 for (int k = 0; k < model.nv; ++k)
34 {
35 // Integrate along kth direction
36
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
128 v_integrate[k] = eps;
37
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
128 q_integrate = integrate(model, q, v_integrate);
38
39
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
128 forwardKinematics(model, data, q_integrate);
40 128 const SE3 & oMi = data.oMi[joint_id];
41
42 if (local)
43
6/12
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 17 not taken.
64 res.col(k) = log6(oMi_ref.inverse() * oMi).toVector();
44 else
45
7/14
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 32 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 32 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 32 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 32 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 32 times.
✗ Branch 20 not taken.
64 res.col(k) = oMi_ref.act(log6(oMi_ref.inverse() * oMi)).toVector();
46
47
2/4
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
128 res.col(k) /= eps;
48
49
1/2
✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
128 v_integrate[k] = 0.;
50 }
51
52 8 return res;
53 4 }
54
55 template<typename Matrix>
56 void filterValue(MatrixBase<Matrix> & mat, typename Matrix::Scalar value)
57 {
58 for (int k = 0; k < mat.size(); ++k)
59 mat.derived().data()[k] =
60 math::fabs(mat.derived().data()[k]) <= value ? 0 : mat.derived().data()[k];
61 }
62
63 template<typename JointModel_>
64 struct init;
65
66 template<typename JointModel_>
67 struct init
68 {
69 34 static JointModel_ run()
70 {
71 34 JointModel_ jmodel;
72 34 jmodel.setIndexes(0, 0, 0);
73 34 return jmodel;
74 }
75 };
76
77 template<typename Scalar, int Options>
78 struct init<pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options>>
79 {
80 typedef pinocchio::JointModelRevoluteUnalignedTpl<Scalar, Options> JointModel;
81
82 1 static JointModel run()
83 {
84 typedef typename JointModel::Vector3 Vector3;
85
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 JointModel jmodel(Vector3::Random().normalized());
86
87 1 jmodel.setIndexes(0, 0, 0);
88 1 return jmodel;
89 }
90 };
91
92 template<typename Scalar, int Options>
93 struct init<pinocchio::JointModelRevoluteUnboundedUnalignedTpl<Scalar, Options>>
94 {
95 typedef pinocchio::JointModelRevoluteUnboundedUnalignedTpl<Scalar, Options> JointModel;
96
97 1 static JointModel run()
98 {
99 typedef typename JointModel::Vector3 Vector3;
100
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 JointModel jmodel(Vector3::Random().normalized());
101
102 1 jmodel.setIndexes(0, 0, 0);
103 1 return jmodel;
104 }
105 };
106
107 template<typename Scalar, int Options>
108 struct init<pinocchio::JointModelPrismaticUnalignedTpl<Scalar, Options>>
109 {
110 typedef pinocchio::JointModelPrismaticUnalignedTpl<Scalar, Options> JointModel;
111
112 1 static JointModel run()
113 {
114 typedef typename JointModel::Vector3 Vector3;
115
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 JointModel jmodel(Vector3::Random().normalized());
116
117 1 jmodel.setIndexes(0, 0, 0);
118 1 return jmodel;
119 }
120 };
121
122 template<typename Scalar, int Options>
123 struct init<pinocchio::JointModelHelicalUnalignedTpl<Scalar, Options>>
124 {
125 typedef pinocchio::JointModelHelicalUnalignedTpl<Scalar, Options> JointModel;
126
127 1 static JointModel run()
128 {
129 typedef typename JointModel::Vector3 Vector3;
130
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 JointModel jmodel(Vector3::Random().normalized());
131
132 1 jmodel.setIndexes(0, 0, 0);
133 1 return jmodel;
134 }
135 };
136
137 template<typename Scalar, int Options>
138 struct init<pinocchio::JointModelUniversalTpl<Scalar, Options>>
139 {
140 typedef pinocchio::JointModelUniversalTpl<Scalar, Options> JointModel;
141
142 1 static JointModel run()
143 {
144 typedef typename JointModel::Vector3 Vector3;
145
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 JointModel jmodel(XAxis::vector(), YAxis::vector());
146
147 1 jmodel.setIndexes(0, 0, 0);
148 1 return jmodel;
149 }
150 };
151
152 template<typename Scalar, int Options, int axis>
153 struct init<pinocchio::JointModelHelicalTpl<Scalar, Options, axis>>
154 {
155 typedef pinocchio::JointModelHelicalTpl<Scalar, Options, axis> JointModel;
156
157 6 static JointModel run()
158 {
159
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 JointModel jmodel(static_cast<Scalar>(0.5));
160
161 6 jmodel.setIndexes(0, 0, 0);
162 6 return jmodel;
163 }
164 };
165
166 template<typename Scalar, int Options, template<typename, int> class JointCollection>
167 struct init<pinocchio::JointModelTpl<Scalar, Options, JointCollection>>
168 {
169 typedef pinocchio::JointModelTpl<Scalar, Options, JointCollection> JointModel;
170
171 static JointModel run()
172 {
173 typedef pinocchio::JointModelRevoluteTpl<Scalar, Options, 0> JointModelRX;
174 JointModel jmodel((JointModelRX()));
175
176 jmodel.setIndexes(0, 0, 0);
177 return jmodel;
178 }
179 };
180
181 template<typename Scalar, int Options, template<typename, int> class JointCollection>
182 struct init<pinocchio::JointModelCompositeTpl<Scalar, Options, JointCollection>>
183 {
184 typedef pinocchio::JointModelCompositeTpl<Scalar, Options, JointCollection> JointModel;
185
186 static JointModel run()
187 {
188 typedef pinocchio::JointModelRevoluteTpl<Scalar, Options, 0> JointModelRX;
189 typedef pinocchio::JointModelRevoluteTpl<Scalar, Options, 1> JointModelRY;
190 JointModel jmodel((JointModelRX()));
191 jmodel.addJoint(JointModelRY());
192
193 jmodel.setIndexes(0, 0, 0);
194 return jmodel;
195 }
196 };
197
198 template<typename JointModel_>
199 struct init<pinocchio::JointModelMimic<JointModel_>>
200 {
201 typedef pinocchio::JointModelMimic<JointModel_> JointModel;
202
203 6 static JointModel run()
204 {
205
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 JointModel_ jmodel_ref = init<JointModel_>::run();
206
207
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 JointModel jmodel(jmodel_ref, 1., 0.);
208
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 jmodel.setIndexes(0, 0, 0);
209
210 12 return jmodel;
211 }
212 };
213
214 struct FiniteDiffJoint
215 {
216 1 void operator()(JointModelComposite & /*jmodel*/) const
217 {
218 1 }
219
220 template<typename JointModel>
221 50 void operator()(JointModelBase<JointModel> & /*jmodel*/) const
222 {
223 typedef typename JointModel::ConfigVector_t CV;
224 typedef typename JointModel::TangentVector_t TV;
225 typedef typename LieGroup<JointModel>::type LieGroupType;
226
227
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
50 JointModel jmodel = init<JointModel>::run();
228
4/8
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 25 times.
✗ Branch 11 not taken.
50 std::cout << "name: " << jmodel.classname() << std::endl;
229
230
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
50 typename JointModel::JointDataDerived jdata_ = jmodel.createData();
231 typedef JointDataBase<typename JointModel::JointDataDerived> DataBaseType;
232 50 DataBaseType & jdata = static_cast<DataBaseType &>(jdata_);
233
234
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 CV q = LieGroupType().random();
235
1/2
✓ Branch 2 taken 25 times.
✗ Branch 3 not taken.
50 jmodel.calc(jdata.derived(), q);
236
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 SE3 M_ref(jdata.M());
237
238
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
50 CV q_int(q);
239
2/4
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
50 const Eigen::DenseIndex nv = jdata.S().nv();
240
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
50 TV v(nv);
241
1/2
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
50 v.setZero();
242 50 double eps = 1e-8;
243
244
4/8
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
50 Eigen::Matrix<double, 6, JointModel::NV> S(6, nv), S_ref(jdata.S().matrix());
245
246
2/2
✓ Branch 0 taken 39 times.
✓ Branch 1 taken 25 times.
128 for (int k = 0; k < nv; ++k)
247 {
248
1/2
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
78 v[k] = eps;
249
2/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
78 q_int = LieGroupType().integrate(q, v);
250
1/2
✓ Branch 2 taken 39 times.
✗ Branch 3 not taken.
78 jmodel.calc(jdata.derived(), q_int);
251
2/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
78 SE3 M_int = jdata.M();
252
253
6/12
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 39 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 39 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 39 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 39 times.
✗ Branch 17 not taken.
78 S.col(k) = log6(M_ref.inverse() * M_int).toVector();
254
2/4
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 39 times.
✗ Branch 5 not taken.
78 S.col(k) /= eps;
255
256
1/2
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
78 v[k] = 0.;
257 }
258
259
7/14
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 25 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 25 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 25 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 25 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 25 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 25 times.
50 BOOST_CHECK(S.isApprox(S_ref, eps * 1e1));
260
3/6
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25 times.
✗ Branch 8 not taken.
50 std::cout << "S_ref:\n" << S_ref << std::endl;
261
3/6
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 25 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 25 times.
✗ Branch 8 not taken.
50 std::cout << "S:\n" << S << std::endl;
262 50 }
263 };
264
265 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
266
267
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 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 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_S_finit_diff)
268 {
269 2 boost::mpl::for_each<JointModelVariant::types>(FiniteDiffJoint());
270 2 }
271
272
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 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 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_jacobian_vs_finit_diff)
273 {
274
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Model model;
275
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::buildModels::humanoidRandom(model);
276
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 pinocchio::Data data(model);
277
278
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd q = VectorXd::Ones(model.nq);
279
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 q.segment<4>(3).normalize();
280
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data, q);
281
282 Model::Index idx =
283
5/18
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
2 model.existJointName("rarm2") ? model.getJointId("rarm2") : (Model::Index)(model.njoints - 1);
284
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x Jrh(6, model.nv);
285
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jrh.fill(0);
286
287
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data, idx, WORLD, Jrh);
288
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x Jrh_finite_diff = finiteDiffJacobian<false>(model, data, q, idx);
289
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 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.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(Jrh_finite_diff.isApprox(Jrh, sqrt(1e-8)));
290
291
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data, idx, LOCAL, Jrh);
292
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Jrh_finite_diff = finiteDiffJacobian<true>(model, data, q, idx);
293
7/14
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 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.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
2 BOOST_CHECK(Jrh_finite_diff.isApprox(Jrh, sqrt(1e-8)));
294 2 }
295
296 BOOST_AUTO_TEST_SUITE_END()
297