GCC Code Coverage Report


Directory: ./
File: unittest/kinematics-derivatives.cpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 651 651 100.0%
Branches: 1552 3090 50.2%

Line Branch Exec Source
1 //
2 // Copyright (c) 2017-2020 CNRS INRIA
3 //
4
5 #include <iostream>
6
7 #include "pinocchio/multibody/model.hpp"
8 #include "pinocchio/multibody/data.hpp"
9 #include "pinocchio/algorithm/jacobian.hpp"
10 #include "pinocchio/algorithm/joint-configuration.hpp"
11 #include "pinocchio/algorithm/kinematics.hpp"
12 #include "pinocchio/algorithm/kinematics-derivatives.hpp"
13 #include "pinocchio/multibody/sample-models.hpp"
14
15 #include <boost/test/unit_test.hpp>
16 #include <boost/utility/binary.hpp>
17
18 BOOST_AUTO_TEST_SUITE(BOOST_TEST_MODULE)
19
20
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_kinematics_derivatives_all)
21 {
22 using namespace Eigen;
23 using namespace pinocchio;
24
25
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
26
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model);
27
28
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data data(model), data_ref(model);
29
30
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
31
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
32
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
33
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v(VectorXd::Random(model.nv));
34
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a(VectorXd::Random(model.nv));
35
36
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 forwardKinematics(model, data_ref, q, v, a);
37
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
38
39
2/2
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 1 times.
56 for (size_t i = 1; i < (size_t)model.njoints; ++i)
40 {
41
7/14
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 27 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
54 BOOST_CHECK(data.oMi[i].isApprox(data_ref.oMi[i]));
42
7/14
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 27 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
54 BOOST_CHECK(data.v[i].isApprox(data_ref.v[i]));
43
8/16
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 27 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 27 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 27 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
54 BOOST_CHECK(data.ov[i].isApprox(data_ref.oMi[i].act(data_ref.v[i])));
44
7/14
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 17 taken 27 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 27 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 27 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 27 times.
54 BOOST_CHECK(data.a[i].isApprox(data_ref.a[i]));
45
8/16
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 27 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 27 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 27 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 27 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 27 times.
✗ Branch 25 not taken.
✓ Branch 27 taken 27 times.
✗ Branch 28 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 27 times.
54 BOOST_CHECK(data.oa[i].isApprox(data_ref.oMi[i].act(data_ref.a[i])));
46 }
47
48
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
49
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(data.J.isApprox(data_ref.J));
50
51
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobiansTimeVariation(model, data_ref, q, v);
52
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(data.dJ.isApprox(data_ref.dJ));
53 2 }
54
55
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_kinematics_derivatives_velocity)
56 {
57 using namespace Eigen;
58 using namespace pinocchio;
59
60
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
61
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model);
62
63
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data data(model), data_ref(model);
64
65
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
66
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
67
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
68
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v(VectorXd::Random(model.nv));
69
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a(VectorXd::Random(model.nv));
70
71
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
72
73
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex jointId = model.existJointName("rarm2_joint")
74
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm2_joint")
75
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
76
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq(6, model.nv);
77
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq.setZero();
78
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq_local_world_aligned(6, model.nv);
79
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq_local_world_aligned.setZero();
80
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq_local(6, model.nv);
81
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq_local.setZero();
82
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv(6, model.nv);
83
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv.setZero();
84
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv_local_world_aligned(6, model.nv);
85
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv_local_world_aligned.setZero();
86
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv_local(6, model.nv);
87
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv_local.setZero();
88
89
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(model, data, jointId, WORLD, partial_dq, partial_dv);
90
91
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
92 model, data, jointId, LOCAL_WORLD_ALIGNED, partial_dq_local_world_aligned,
93 partial_dv_local_world_aligned);
94
95
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(model, data, jointId, LOCAL, partial_dq_local, partial_dv_local);
96
97
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref(6, model.nv);
98
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref.setZero();
99
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref_local_world_aligned(6, model.nv);
100
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref_local_world_aligned.setZero();
101
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref_local(6, model.nv);
102
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref_local.setZero();
103
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
104
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, WORLD, J_ref);
105
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, LOCAL_WORLD_ALIGNED, J_ref_local_world_aligned);
106
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, LOCAL, J_ref_local);
107
108
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(partial_dv.isApprox(J_ref));
109
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(partial_dv_local_world_aligned.isApprox(J_ref_local_world_aligned));
110
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(partial_dv_local.isApprox(J_ref_local));
111
112 // Check against finite differences
113
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq_fd(6, model.nv);
114
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq_fd.setZero();
115
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq_fd_local_world_aligned(6, model.nv);
116
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq_fd_local_world_aligned.setZero();
117
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dq_fd_local(6, model.nv);
118
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dq_fd_local.setZero();
119
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv_fd(6, model.nv);
120
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv_fd.setZero();
121
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv_fd_local_world_aligned(6, model.nv);
122
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv_fd_local_world_aligned.setZero();
123
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x partial_dv_fd_local(6, model.nv);
124
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 partial_dv_fd_local.setZero();
125 2 const double alpha = 1e-8;
126
127 // dvel/dv
128
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Eigen::VectorXd v_plus(v);
129
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_plus(model);
130
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 forwardKinematics(model, data_ref, q, v);
131
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 SE3 oMi_rot(SE3::Identity());
132
3/6
✓ 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.
2 oMi_rot.rotation() = data_ref.oMi[jointId].rotation();
133
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 Motion v0(data_ref.oMi[jointId].act(data_ref.v[jointId]));
134
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 Motion v0_local_world_aligned(oMi_rot.act(data_ref.v[jointId]));
135
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 Motion v0_local(data_ref.v[jointId]);
136
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
137 {
138
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] += alpha;
139
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q, v_plus);
140
141
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 partial_dv_fd.col(k) =
142
5/10
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[jointId].act(data_plus.v[jointId]) - v0).toVector() / alpha;
143
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 partial_dv_fd_local_world_aligned.col(k) =
144
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
128 (oMi_rot.act(data_plus.v[jointId]) - v0_local_world_aligned).toVector() / alpha;
145
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
64 partial_dv_fd_local.col(k) = (data_plus.v[jointId] - v0_local).toVector() / alpha;
146
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] -= alpha;
147 }
148
149
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(partial_dv.isApprox(partial_dv_fd, sqrt(alpha)));
150
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(
151 partial_dv_local_world_aligned.isApprox(partial_dv_fd_local_world_aligned, sqrt(alpha)));
152
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(partial_dv_local.isApprox(partial_dv_fd_local, sqrt(alpha)));
153
154 // dvel/dq
155
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 Eigen::VectorXd q_plus(q), v_eps(Eigen::VectorXd::Zero(model.nv));
156
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 forwardKinematics(model, data_ref, q, v);
157
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 v0 = data_ref.oMi[jointId].act(data_ref.v[jointId]);
158
159
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
160 {
161
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_eps[k] += alpha;
162
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 q_plus = integrate(model, q, v_eps);
163
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q_plus, v);
164
165
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 SE3 oMi_plus_rot = data_plus.oMi[jointId];
166
2/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
64 oMi_plus_rot.translation().setZero();
167
168
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 Motion v_plus_local_world_aligned = oMi_plus_rot.act(data_plus.v[jointId]);
169
4/8
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
64 SE3::Vector3 trans = data_plus.oMi[jointId].translation() - data_ref.oMi[jointId].translation();
170
4/8
✓ 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.
64 v_plus_local_world_aligned.linear() -= v_plus_local_world_aligned.angular().cross(trans);
171
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 partial_dq_fd.col(k) =
172
5/10
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[jointId].act(data_plus.v[jointId]) - v0).toVector() / alpha;
173
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 partial_dq_fd_local_world_aligned.col(k) =
174
4/8
✓ 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.
128 (v_plus_local_world_aligned - v0_local_world_aligned).toVector() / alpha;
175
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
64 partial_dq_fd_local.col(k) = (data_plus.v[jointId] - v0_local).toVector() / alpha;
176
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_eps[k] -= alpha;
177 }
178
179
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(partial_dq.isApprox(partial_dq_fd, sqrt(alpha)));
180
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(
181 partial_dq_local_world_aligned.isApprox(partial_dq_fd_local_world_aligned, sqrt(alpha)));
182
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(partial_dq_local.isApprox(partial_dq_fd_local, sqrt(alpha)));
183 2 }
184
185
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_kinematics_derivatives_acceleration)
186 {
187 using namespace Eigen;
188 using namespace pinocchio;
189
190
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
191
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model);
192
193
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data data(model), data_ref(model);
194
195
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
196
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
197
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
198
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v(VectorXd::Random(model.nv));
199
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a(VectorXd::Random(model.nv));
200
201
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
202
203
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex jointId = model.existJointName("rarm2_joint")
204
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm2_joint")
205
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
206
207
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq(6, model.nv);
208
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq.setZero();
209
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_local(6, model.nv);
210
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_local.setZero();
211
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_local_world_aligned(6, model.nv);
212
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_local_world_aligned.setZero();
213
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq(6, model.nv);
214
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq.setZero();
215
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_local_world_aligned(6, model.nv);
216
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_local_world_aligned.setZero();
217
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_local(6, model.nv);
218
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_local.setZero();
219
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv(6, model.nv);
220
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv.setZero();
221
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_local_world_aligned(6, model.nv);
222
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_local_world_aligned.setZero();
223
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_local(6, model.nv);
224
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_local.setZero();
225
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da(6, model.nv);
226
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da.setZero();
227
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_local_world_aligned(6, model.nv);
228
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_local_world_aligned.setZero();
229
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_local(6, model.nv);
230
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_local.setZero();
231
232
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
233 model, data, jointId, WORLD, v_partial_dq, a_partial_dq, a_partial_dv, a_partial_da);
234
235
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
236 model, data, jointId, LOCAL_WORLD_ALIGNED, v_partial_dq_local_world_aligned,
237 a_partial_dq_local_world_aligned, a_partial_dv_local_world_aligned,
238 a_partial_da_local_world_aligned);
239
240
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
241 model, data, jointId, LOCAL, v_partial_dq_local, a_partial_dq_local, a_partial_dv_local,
242 a_partial_da_local);
243
244 // Check v_partial_dq against getJointVelocityDerivatives
245 {
246
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_v(model);
247
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_v, q, v, a);
248
249
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_ref(6, model.nv);
250
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
251
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_ref_local_world_aligned(6, model.nv);
252
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref_local_world_aligned.setZero();
253
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_ref_local(6, model.nv);
254
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref_local.setZero();
255
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_ref(6, model.nv);
256
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
257
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_ref_local_world_aligned(6, model.nv);
258
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref_local_world_aligned.setZero();
259
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_ref_local(6, model.nv);
260
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref_local.setZero();
261
262
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(model, data_v, jointId, WORLD, v_partial_dq_ref, v_partial_dv_ref);
263
264
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v_partial_dq.isApprox(v_partial_dq_ref));
265
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da.isApprox(v_partial_dv_ref));
266
267
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
268 model, data_v, jointId, LOCAL_WORLD_ALIGNED, v_partial_dq_ref_local_world_aligned,
269 v_partial_dv_ref_local_world_aligned);
270
271
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v_partial_dq_local_world_aligned.isApprox(v_partial_dq_ref_local_world_aligned));
272
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da_local_world_aligned.isApprox(v_partial_dv_ref_local_world_aligned));
273
274
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
275 model, data_v, jointId, LOCAL, v_partial_dq_ref_local, v_partial_dv_ref_local);
276
277
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v_partial_dq_local.isApprox(v_partial_dq_ref_local));
278
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da_local.isApprox(v_partial_dv_ref_local));
279 2 }
280
281
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref(6, model.nv);
282
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref.setZero();
283
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref_local(6, model.nv);
284
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref_local.setZero();
285
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_ref_local_world_aligned(6, model.nv);
286
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref_local_world_aligned.setZero();
287
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
288
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, WORLD, J_ref);
289
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, LOCAL_WORLD_ALIGNED, J_ref_local_world_aligned);
290
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, jointId, LOCAL, J_ref_local);
291
292
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da.isApprox(J_ref));
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da_local_world_aligned.isApprox(J_ref_local_world_aligned));
294
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a_partial_da_local.isApprox(J_ref_local));
295
296 // Check against finite differences
297
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_fd(6, model.nv);
298
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_fd.setZero();
299
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_fd_local_world_aligned(6, model.nv);
300
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_fd_local_world_aligned.setZero();
301
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_fd_local(6, model.nv);
302
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_fd_local.setZero();
303 2 const double alpha = 1e-8;
304
305
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd v_plus(v), a_plus(a);
306
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_plus(model);
307
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 forwardKinematics(model, data_ref, q, v, a);
308
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 SE3 oMi_rot(SE3::Identity());
309
3/6
✓ 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.
2 oMi_rot.rotation() = data_ref.oMi[jointId].rotation();
310
311 // dacc/da
312
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 Motion a0(data_ref.oMi[jointId].act(data_ref.a[jointId]));
313
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 Motion a0_local_world_aligned(oMi_rot.act(data_ref.a[jointId]));
314
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 Motion a0_local(data_ref.a[jointId]);
315
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
316 {
317
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_plus[k] += alpha;
318
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q, v, a_plus);
319
320
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_da_fd.col(k) =
321
5/10
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[jointId].act(data_plus.a[jointId]) - a0).toVector() / alpha;
322
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_da_fd_local_world_aligned.col(k) =
323
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
128 (oMi_rot.act(data_plus.a[jointId]) - a0_local_world_aligned).toVector() / alpha;
324
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
64 a_partial_da_fd_local.col(k) = (data_plus.a[jointId] - a0_local).toVector() / alpha;
325
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_plus[k] -= alpha;
326 }
327
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(a_partial_da.isApprox(a_partial_da_fd, sqrt(alpha)));
328
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(
329 a_partial_da_local_world_aligned.isApprox(a_partial_da_fd_local_world_aligned, sqrt(alpha)));
330
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(a_partial_da_local.isApprox(a_partial_da_fd_local, sqrt(alpha)));
331
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 motionSet::se3Action(data_ref.oMi[jointId].inverse(), a_partial_da, a_partial_da_local);
332
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(a_partial_da_local.isApprox(a_partial_da_fd_local, sqrt(alpha)));
333
334 // dacc/dv
335
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_fd(6, model.nv);
336
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_fd.setZero();
337
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_fd_local_world_aligned(6, model.nv);
338
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_fd_local_world_aligned.setZero();
339
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_fd_local(6, model.nv);
340
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_fd_local.setZero();
341
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
342 {
343
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] += alpha;
344
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q, v_plus, a);
345
346
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_dv_fd.col(k) =
347
5/10
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[jointId].act(data_plus.a[jointId]) - a0).toVector() / alpha;
348
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_dv_fd_local_world_aligned.col(k) =
349
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
128 (oMi_rot.act(data_plus.a[jointId]) - a0_local_world_aligned).toVector() / alpha;
350
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
64 a_partial_dv_fd_local.col(k) = (data_plus.a[jointId] - a0_local).toVector() / alpha;
351
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] -= alpha;
352 }
353
354
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(a_partial_dv.isApprox(a_partial_dv_fd, sqrt(alpha)));
355
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(
356 a_partial_dv_local_world_aligned.isApprox(a_partial_dv_fd_local_world_aligned, sqrt(alpha)));
357
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(a_partial_dv_local.isApprox(a_partial_dv_fd_local, sqrt(alpha)));
358
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 motionSet::se3Action(data_ref.oMi[jointId].inverse(), a_partial_dv, a_partial_dv_local);
359
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(a_partial_dv_local.isApprox(a_partial_dv_fd_local, sqrt(alpha)));
360
361 // dacc/dq
362
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq.setZero();
363
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv.setZero();
364
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da.setZero();
365
366
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_local_world_aligned.setZero();
367
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_local_world_aligned.setZero();
368
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_local_world_aligned.setZero();
369
370
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_local.setZero();
371
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_local.setZero();
372
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_local.setZero();
373
374
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_fd(6, model.nv);
375
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_fd.setZero();
376
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_fd_local_world_aligned(6, model.nv);
377
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_fd_local_world_aligned.setZero();
378
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_fd_local(6, model.nv);
379
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_fd_local.setZero();
380
381
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
382
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
383 model, data, jointId, WORLD, v_partial_dq, a_partial_dq, a_partial_dv, a_partial_da);
384
385
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
386 model, data, jointId, LOCAL_WORLD_ALIGNED, v_partial_dq_local_world_aligned,
387 a_partial_dq_local_world_aligned, a_partial_dv_local_world_aligned,
388 a_partial_da_local_world_aligned);
389
390
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
391 model, data, jointId, LOCAL, v_partial_dq_local, a_partial_dq_local, a_partial_dv_local,
392 a_partial_da_local);
393
394
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 Eigen::VectorXd q_plus(q), v_eps(Eigen::VectorXd::Zero(model.nv));
395
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 forwardKinematics(model, data_ref, q, v, a);
396
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
2 a0 = data_ref.oMi[jointId].act(data_ref.a[jointId]);
397
3/6
✓ 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.
2 oMi_rot.rotation() = data_ref.oMi[jointId].rotation();
398
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 a0_local_world_aligned = oMi_rot.act(data_ref.a[jointId]);
399
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 a0_local = data_ref.a[jointId];
400
401
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
402 {
403
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_eps[k] += alpha;
404
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 q_plus = integrate(model, q, v_eps);
405
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q_plus, v, a);
406
407
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 SE3 oMi_plus_rot = data_plus.oMi[jointId];
408
2/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
64 oMi_plus_rot.translation().setZero();
409
410
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 Motion a_plus_local_world_aligned = oMi_plus_rot.act(data_plus.a[jointId]);
411 const SE3::Vector3 trans =
412
4/8
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
64 data_plus.oMi[jointId].translation() - data_ref.oMi[jointId].translation();
413
4/8
✓ 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.
64 a_plus_local_world_aligned.linear() -= a_plus_local_world_aligned.angular().cross(trans);
414
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_dq_fd.col(k) =
415
5/10
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[jointId].act(data_plus.a[jointId]) - a0).toVector() / alpha;
416
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_partial_dq_fd_local_world_aligned.col(k) =
417
4/8
✓ 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.
128 (a_plus_local_world_aligned - a0_local_world_aligned).toVector() / alpha;
418
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
64 a_partial_dq_fd_local.col(k) = (data_plus.a[jointId] - a0_local).toVector() / alpha;
419
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_eps[k] -= alpha;
420 }
421
422
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(a_partial_dq.isApprox(a_partial_dq_fd, sqrt(alpha)));
423
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(
424 a_partial_dq_local_world_aligned.isApprox(a_partial_dq_fd_local_world_aligned, sqrt(alpha)));
425
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(a_partial_dq_local.isApprox(a_partial_dq_fd_local, sqrt(alpha)));
426 2 }
427
428
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_kinematics_derivatives_against_classic_formula)
429 {
430 using namespace Eigen;
431 using namespace pinocchio;
432
433
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
434
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model, true);
435
436
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data data(model), data_ref(model);
437
438
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
439
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
440
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
441
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v(VectorXd::Random(model.nv));
442
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a(VectorXd::Random(model.nv));
443
444
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex jointId = model.existJointName("rarm4_joint")
445
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm4_joint")
446
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
447
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq(6, model.nv);
448
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq.setZero();
449
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_ref(6, model.nv);
450
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
451
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_ref(6, model.nv);
452
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
453
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq(6, model.nv);
454
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq.setZero();
455
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv(6, model.nv);
456
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv.setZero();
457
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da(6, model.nv);
458
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da.setZero();
459
460 // LOCAL: da/dv == dJ/dt + dv/dq
461 // {
462 // Data::Matrix6x rhs(6,model.nv); rhs.setZero();
463 //
464 // v_partial_dq.setZero();
465 // a_partial_dq.setZero();
466 // a_partial_dv.setZero();
467 // a_partial_da.setZero();
468 //
469 // computeForwardKinematicsDerivatives(model,data_ref,q,v,a);
470 // computeForwardKinematicsDerivatives(model,data,q,v,a);
471 //
472 // getJointAccelerationDerivatives<LOCAL>(model,data,jointId,
473 // v_partial_dq,
474 // a_partial_dq,a_partial_dv,a_partial_da);
475 //
476 // getJointJacobianTimeVariation<LOCAL>(model,data_ref,jointId,rhs);
477 //
478 // v_partial_dq_ref.setZero(); v_partial_dv_ref.setZero();
479 // getJointVelocityDerivatives<LOCAL>(model,data_ref,jointId,
480 // v_partial_dq_ref,v_partial_dv_ref);
481 // rhs += v_partial_dq_ref;
482 // BOOST_CHECK(a_partial_dv.isApprox(rhs,1e-12));
483 //
484 // std::cout << "a_partial_dv\n" << a_partial_dv << std::endl;
485 // std::cout << "rhs\n" << rhs << std::endl;
486 // }
487
488 // WORLD: da/dv == dJ/dt + dv/dq
489 {
490
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x rhs(6, model.nv);
491
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 rhs.setZero();
492
493
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq.setZero();
494
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq.setZero();
495
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv.setZero();
496
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da.setZero();
497
498
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_ref, q, v, a);
499
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
500
501
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
502 model, data, jointId, WORLD, v_partial_dq, a_partial_dq, a_partial_dv, a_partial_da);
503
504
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobianTimeVariation(model, data_ref, jointId, WORLD, rhs);
505
506
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
507
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
508
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
509 model, data_ref, jointId, WORLD, v_partial_dq_ref, v_partial_dv_ref);
510
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 rhs += v_partial_dq_ref;
511
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(a_partial_dv.isApprox(rhs, 1e-12));
512
513 // std::cout << "a_partial_dv\n" << a_partial_dv << std::endl;
514 // std::cout << "rhs\n" << rhs << std::endl;
515 2 }
516
517 // // WORLD: da/dq == d/dt(dv/dq)
518 // {
519 // const double alpha = 1e-8;
520 // Eigen::VectorXd q_plus(model.nq), v_plus(model.nv);
521 //
522 // Data data_plus(model);
523 // v_plus = v + alpha * a;
524 // q_plus = integrate(model,q,alpha*v);
525 //
526 // computeForwardKinematicsDerivatives(model,data_plus,q_plus,v_plus,a);
527 // computeForwardKinematicsDerivatives(model,data_ref,q,v,a);
528 //
529 // Data::Matrix6x v_partial_dq_plus(6,model.nv); v_partial_dq_plus.setZero();
530 // Data::Matrix6x v_partial_dv_plus(6,model.nv); v_partial_dv_plus.setZero();
531 //
532 // v_partial_dq_ref.setZero(); v_partial_dv_ref.setZero();
533 //
534 // v_partial_dq.setZero();
535 // a_partial_dq.setZero();
536 // a_partial_dv.setZero();
537 // a_partial_da.setZero();
538 //
539 // getJointVelocityDerivatives<WORLD>(model,data_ref,jointId,
540 // v_partial_dq_ref,v_partial_dv_ref);
541 // getJointVelocityDerivatives<WORLD>(model,data_plus,jointId,
542 // v_partial_dq_plus,v_partial_dv_plus);
543 //
544 // getJointAccelerationDerivatives<WORLD>(model,data_ref,jointId,
545 // v_partial_dq,
546 // a_partial_dq,a_partial_dv,a_partial_da);
547 //
548 // Data::Matrix6x a_partial_dq_fd(6,model.nv); a_partial_dq_fd.setZero();
549 // {
550 // Data data_fd(model);
551 // VectorXd q_fd(model.nq), v_eps(model.nv); v_eps.setZero();
552 // for(int k = 0; k < model.nv; ++k)
553 // {
554 // v_eps[k] += alpha;
555 // q_fd = integrate(model,q,v_eps);
556 // forwardKinematics(model,data_fd,q_fd,v,a);
557 // a_partial_dq_fd.col(k) = (data_fd.oMi[jointId].act(data_fd.a[jointId]) -
558 // data_ref.oa[jointId]).toVector()/alpha; v_eps[k] = 0.;
559 // }
560 // }
561 //
562 // Data::Matrix6x rhs = (v_partial_dq_plus - v_partial_dq_ref)/alpha;
563 // BOOST_CHECK(a_partial_dq.isApprox(rhs,sqrt(alpha)));
564 //
565 // std::cout << "a_partial_dq\n" << a_partial_dq << std::endl;
566 // std::cout << "a_partial_dq_fd\n" << a_partial_dq_fd << std::endl;
567 // std::cout << "rhs\n" << rhs << std::endl;
568 // }
569
570 // LOCAL: da/dq == d/dt(dv/dq)
571 {
572 2 const double alpha = 1e-8;
573
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd q_plus(model.nq), v_plus(model.nv);
574
575
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_plus(model);
576
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 v_plus = v + alpha * a;
577
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 q_plus = integrate(model, q, alpha * v);
578
579
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_plus, q_plus, v_plus, a);
580
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_ref, q, v, a);
581
582
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_plus(6, model.nv);
583
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_plus.setZero();
584
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_plus(6, model.nv);
585
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_plus.setZero();
586
587
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
588
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
589
590
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq.setZero();
591
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq.setZero();
592
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv.setZero();
593
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da.setZero();
594
595
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
596 model, data_ref, jointId, LOCAL, v_partial_dq_ref, v_partial_dv_ref);
597
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointVelocityDerivatives(
598 model, data_plus, jointId, LOCAL, v_partial_dq_plus, v_partial_dv_plus);
599
600
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
601 model, data_ref, jointId, LOCAL, v_partial_dq, a_partial_dq, a_partial_dv, a_partial_da);
602
603
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 Data::Matrix6x rhs = (v_partial_dq_plus - v_partial_dq_ref) / alpha;
604
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(a_partial_dq.isApprox(rhs, sqrt(alpha)));
605
606 // std::cout << "a_partial_dq\n" << a_partial_dq << std::endl;
607 // std::cout << "rhs\n" << rhs << std::endl;
608 2 }
609 2 }
610
611
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_classic_acceleration_derivatives)
612 {
613 using namespace Eigen;
614 using namespace pinocchio;
615
616
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
617
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model, true);
618
619
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 Data data(model), data_ref(model), data_plus(model);
620
621
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
622
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
623
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
624
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v = VectorXd::Random(model.nv);
625
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a = VectorXd::Random(model.nv);
626
627
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex joint_id = model.existJointName("rarm4_joint")
628
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm4_joint")
629
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
630
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq(3, model.nv);
631
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq.setZero();
632
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dq(3, model.nv);
633
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dq.setZero();
634
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dv(3, model.nv);
635
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dv.setZero();
636
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_da(3, model.nv);
637
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_da.setZero();
638
639
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dq_ref(6, model.nv);
640
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
641
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x v_partial_dv_ref(6, model.nv);
642
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
643
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dq_ref(6, model.nv);
644
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_ref.setZero();
645
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_dv_ref(6, model.nv);
646
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_ref.setZero();
647
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x a_partial_da_ref(6, model.nv);
648
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_ref.setZero();
649
650
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeForwardKinematicsDerivatives(model, data_ref, q, 0 * v, a);
651
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, 0 * v, a);
652
653 // LOCAL
654
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
655 model, data_ref, joint_id, LOCAL, v_partial_dq_ref, v_partial_dv_ref, a_partial_dq_ref,
656 a_partial_dv_ref, a_partial_da_ref);
657
658
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
659
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 model, data, joint_id, SE3::Identity(), LOCAL, v3_partial_dq, a3_partial_dq, a3_partial_dv,
660 a3_partial_da);
661
662
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(v3_partial_dq.isApprox(v_partial_dq_ref.middleRows<3>(Motion::LINEAR)));
663
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(a3_partial_dq.isApprox(a_partial_dq_ref.middleRows<3>(Motion::LINEAR)));
664
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(a3_partial_dv.isApprox(a_partial_dv_ref.middleRows<3>(Motion::LINEAR)));
665
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(a3_partial_da.isApprox(a_partial_da_ref.middleRows<3>(Motion::LINEAR)));
666
667 // LOCAL_WORLD_ALIGNED
668
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref.setZero();
669
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref.setZero();
670
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_ref.setZero();
671
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_ref.setZero();
672
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_ref.setZero();
673
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointAccelerationDerivatives(
674 model, data_ref, joint_id, LOCAL_WORLD_ALIGNED, v_partial_dq_ref, v_partial_dv_ref,
675 a_partial_dq_ref, a_partial_dv_ref, a_partial_da_ref);
676
677
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq.setZero();
678
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dq.setZero();
679
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dv.setZero();
680
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_da.setZero();
681
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
682
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
4 model, data, joint_id, SE3::Identity(), LOCAL_WORLD_ALIGNED, v3_partial_dq, a3_partial_dq,
683 a3_partial_dv, a3_partial_da);
684
685
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(v3_partial_dq.isApprox(v_partial_dq_ref.middleRows<3>(Motion::LINEAR)));
686 // BOOST_CHECK(a3_partial_dq.isApprox(a_partial_dq_ref.middleRows<3>(Motion::LINEAR)));
687
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(a3_partial_dv.isApprox(a_partial_dv_ref.middleRows<3>(Motion::LINEAR)));
688
8/16
✓ 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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 times.
2 BOOST_CHECK(a3_partial_da.isApprox(a_partial_da_ref.middleRows<3>(Motion::LINEAR)));
689
690 // std::cout << "a3_partial_dq:\n" << a3_partial_dq << std::endl;
691 // std::cout << "a3_partial_dq_ref:\n" << a_partial_dq_ref.middleRows<3>(Motion::LINEAR) <<
692 // std::endl;
693
694
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const SE3 iMpoint = SE3::Random();
695
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, a);
696
697
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq.setZero();
698
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dq.setZero();
699
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dv.setZero();
700
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_da.setZero();
701
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
702 model, data, joint_id, iMpoint, LOCAL, v3_partial_dq, a3_partial_dq, a3_partial_dv,
703 a3_partial_da);
704
705
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_LWA(3, model.nv);
706
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq_LWA.setZero();
707
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dq_LWA(3, model.nv);
708
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dq_LWA.setZero();
709
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_LWA_dv(3, model.nv);
710
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_LWA_dv.setZero();
711
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_LWA_da(3, model.nv);
712
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_LWA_da.setZero();
713
714
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
715 model, data, joint_id, iMpoint, LOCAL_WORLD_ALIGNED, v3_partial_dq_LWA, a3_partial_dq_LWA,
716 a3_partial_LWA_dv, a3_partial_LWA_da);
717
718 2 const double eps = 1e-8;
719
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd v_plus = Eigen::VectorXd::Zero(model.nv);
720
721
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_fd(3, model.nv);
722
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dv_fd(3, model.nv);
723
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dq_fd(3, model.nv);
724
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dv_fd(3, model.nv);
725
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_da_fd(3, model.nv);
726
727
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_LWA_fd(3, model.nv);
728
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dv_LWA_fd(3, model.nv);
729
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dq_LWA_fd(3, model.nv);
730
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dv_LWA_fd(3, model.nv);
731
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_da_LWA_fd(3, model.nv);
732
733
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 const SE3 oMpoint = data.oMi[joint_id] * iMpoint;
734
3/6
✓ 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.
2 const Motion::Vector3 point_vec_L = iMpoint.actInv(data.v[joint_id]).linear(); // LOCAL
735 const Motion::Vector3 point_acc_L =
736
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
2 classicAcceleration(data.v[joint_id], data.a[joint_id], iMpoint); // LOCAL
737
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 const Motion::Vector3 point_vec_LWA = oMpoint.rotation() * point_vec_L; // LOCAL_WORLD_ALIGNED
738
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 const Motion::Vector3 point_acc_LWA = oMpoint.rotation() * point_acc_L; // LOCAL_WORLD_ALIGNED
739
740 // Derivatives w.r.t q
741
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
742 {
743
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = eps;
744
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 const VectorXd q_plus = integrate(model, q, v_plus);
745
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q_plus, v, a);
746
747
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 const SE3 oMpoint_plus = data_plus.oMi[joint_id] * iMpoint;
748
3/6
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
64 const Motion::Vector3 point_vec_L_plus = iMpoint.actInv(data_plus.v[joint_id]).linear();
749 const Motion::Vector3 point_acc_L_plus =
750
1/2
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
64 classicAcceleration(data_plus.v[joint_id], data_plus.a[joint_id], iMpoint);
751
752
3/6
✓ 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.
64 const Motion::Vector3 point_vec_LWA_plus = oMpoint_plus.rotation() * point_vec_L_plus;
753
3/6
✓ 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.
64 const Motion::Vector3 point_acc_LWA_plus = oMpoint_plus.rotation() * point_acc_L_plus;
754
755
4/8
✓ 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.
64 v3_partial_dq_fd.col(k) = (point_vec_L_plus - point_vec_L) / eps;
756
4/8
✓ 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.
64 a3_partial_dq_fd.col(k) = (point_acc_L_plus - point_acc_L) / eps;
757
758
4/8
✓ 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.
64 v3_partial_dq_LWA_fd.col(k) = (point_vec_LWA_plus - point_vec_LWA) / eps;
759
4/8
✓ 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.
64 a3_partial_dq_LWA_fd.col(k) = (point_acc_LWA_plus - point_acc_LWA) / eps;
760
761
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = 0.;
762 64 }
763
764
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(v3_partial_dq_fd.isApprox(v3_partial_dq, sqrt(eps)));
765
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(a3_partial_dq_fd.isApprox(a3_partial_dq, sqrt(eps)));
766
767
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(v3_partial_dq_LWA_fd.isApprox(v3_partial_dq_LWA, sqrt(eps)));
768
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(a3_partial_dq_LWA_fd.isApprox(a3_partial_dq_LWA, sqrt(eps)));
769
770 // Derivatives w.r.t v
771
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
772 {
773
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus = v;
774
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] += eps;
775
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q, v_plus, a);
776
777
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 const SE3 oMpoint_plus = data_plus.oMi[joint_id] * iMpoint;
778
3/6
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 32 times.
✗ Branch 9 not taken.
64 const Motion::Vector3 point_vec_L_plus = iMpoint.actInv(data_plus.v[joint_id]).linear();
779 const Motion::Vector3 point_acc_L_plus =
780
1/2
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
64 classicAcceleration(data_plus.v[joint_id], data_plus.a[joint_id], iMpoint);
781
782
3/6
✓ 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.
64 const Motion::Vector3 point_vec_LWA_plus = oMpoint_plus.rotation() * point_vec_L_plus;
783
3/6
✓ 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.
64 const Motion::Vector3 point_acc_LWA_plus = oMpoint_plus.rotation() * point_acc_L_plus;
784
785
4/8
✓ 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.
64 v3_partial_dv_fd.col(k) = (point_vec_L_plus - point_vec_L) / eps;
786
4/8
✓ 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.
64 a3_partial_dv_fd.col(k) = (point_acc_L_plus - point_acc_L) / eps;
787
788
4/8
✓ 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.
64 v3_partial_dv_LWA_fd.col(k) = (point_vec_LWA_plus - point_vec_LWA) / eps;
789
4/8
✓ 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.
64 a3_partial_dv_LWA_fd.col(k) = (point_acc_LWA_plus - point_acc_LWA) / eps;
790 }
791
792
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(v3_partial_dv_fd.isApprox(a3_partial_da, sqrt(eps)));
793
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(a3_partial_dv_fd.isApprox(a3_partial_dv, sqrt(eps)));
794
795 // Derivatives w.r.t v
796
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Eigen::VectorXd a_plus = Eigen::VectorXd::Zero(model.nv);
797
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
798 {
799
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_plus = a;
800
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 a_plus[k] += eps;
801
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 forwardKinematics(model, data_plus, q, v, a_plus);
802
803
1/2
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
64 const SE3 oMpoint_plus = data_plus.oMi[joint_id] * iMpoint;
804 const Motion::Vector3 point_acc_L_plus =
805
1/2
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
64 classicAcceleration(data_plus.v[joint_id], data_plus.a[joint_id], iMpoint);
806
807
3/6
✓ 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.
64 const Motion::Vector3 point_acc_LWA_plus = oMpoint_plus.rotation() * point_acc_L_plus;
808
809
4/8
✓ 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.
64 a3_partial_da_fd.col(k) = (point_acc_L_plus - point_acc_L) / eps;
810
4/8
✓ 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.
64 a3_partial_da_LWA_fd.col(k) = (point_acc_LWA_plus - point_acc_LWA) / eps;
811 }
812
813
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(a3_partial_da_fd.isApprox(a3_partial_da, sqrt(eps)));
814
815 // Test other signature
816
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data_other(model);
817
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_other(3, model.nv);
818
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq_other.setZero();
819
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dv_other(3, model.nv);
820
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dv_other.setZero();
821
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dq_other(3, model.nv);
822
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dq_other.setZero();
823
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_dv_other(3, model.nv);
824
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_dv_other.setZero();
825
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a3_partial_da_other(3, model.nv);
826
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a3_partial_da_other.setZero();
827
828
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_other, q, v, a);
829
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
830 model, data_other, joint_id, iMpoint, LOCAL, v3_partial_dq_other, v3_partial_dv_other,
831 a3_partial_dq_other, a3_partial_dv_other, a3_partial_da_other);
832
833
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dq_other.isApprox(v3_partial_dq));
834
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dv_other.isApprox(a3_partial_da));
835
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a3_partial_dq_other.isApprox(a3_partial_dq));
836
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a3_partial_dv_other.isApprox(a3_partial_dv));
837
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(a3_partial_da_other.isApprox(a3_partial_da));
838 2 }
839
840
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_classic_velocity_derivatives)
841 {
842 using namespace Eigen;
843 using namespace pinocchio;
844
845
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
846
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model, true);
847
848
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data data(model), data_ref(model);
849
850
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
851
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
852
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
853
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v = VectorXd::Random(model.nv);
854
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd a = VectorXd::Random(model.nv);
855
856
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 const SE3 iMpoint = SE3::Random();
857
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex joint_id = model.existJointName("rarm4_joint")
858
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm4_joint")
859
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
860
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_L(3, model.nv);
861
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq_L.setZero();
862
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dv_L(3, model.nv);
863
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dv_L.setZero();
864
865
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 computeForwardKinematicsDerivatives(model, data, q, v, 0 * a);
866
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointVelocityDerivatives(
867 model, data, joint_id, iMpoint, LOCAL, v3_partial_dq_L, v3_partial_dv_L);
868
869
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v_partial_dq_ref_L(3, model.nv);
870
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref_L.setZero();
871
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v_partial_dv_ref_L(3, model.nv);
872
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref_L.setZero();
873
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_dq_ref_L(3, model.nv);
874
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_ref_L.setZero();
875
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_dv_ref_L(3, model.nv);
876
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_ref_L.setZero();
877
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_da_ref_L(3, model.nv);
878
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_ref_L.setZero();
879
880
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeForwardKinematicsDerivatives(model, data_ref, q, v, a);
881
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
882 model, data_ref, joint_id, iMpoint, LOCAL, v_partial_dq_ref_L, v_partial_dv_ref_L,
883 a_partial_dq_ref_L, a_partial_dv_ref_L, a_partial_da_ref_L);
884
885
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dq_L.isApprox(v_partial_dq_ref_L));
886
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dv_L.isApprox(v_partial_dv_ref_L));
887
888 // LOCAL_WORLD_ALIGNED
889
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dq_LWA(3, model.nv);
890
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dq_LWA.setZero();
891
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v3_partial_dv_LWA(3, model.nv);
892
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v3_partial_dv_LWA.setZero();
893
894
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointVelocityDerivatives(
895 model, data, joint_id, iMpoint, LOCAL_WORLD_ALIGNED, v3_partial_dq_LWA, v3_partial_dv_LWA);
896
897
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v_partial_dq_ref_LWA(3, model.nv);
898
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dq_ref_LWA.setZero();
899
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x v_partial_dv_ref_LWA(3, model.nv);
900
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 v_partial_dv_ref_LWA.setZero();
901
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_dq_ref_LWA(3, model.nv);
902
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dq_ref_LWA.setZero();
903
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_dv_ref_LWA(3, model.nv);
904
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_dv_ref_LWA.setZero();
905
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x a_partial_da_ref_LWA(3, model.nv);
906
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 a_partial_da_ref_LWA.setZero();
907
908
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getPointClassicAccelerationDerivatives(
909 model, data_ref, joint_id, iMpoint, LOCAL_WORLD_ALIGNED, v_partial_dq_ref_LWA,
910 v_partial_dv_ref_LWA, a_partial_dq_ref_LWA, a_partial_dv_ref_LWA, a_partial_da_ref_LWA);
911
912
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dq_LWA.isApprox(v_partial_dq_ref_LWA));
913
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(v3_partial_dv_LWA.isApprox(v_partial_dv_ref_LWA));
914 2 }
915
916
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_kinematics_hessians)
917 {
918 using namespace Eigen;
919 using namespace pinocchio;
920
921
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Model model;
922
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 buildModels::humanoidRandom(model, true);
923
924
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
2 Data data(model), data_ref(model), data_plus(model);
925
926
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.lowerPositionLimit.head<3>().fill(-1.);
927
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 model.upperPositionLimit.head<3>().fill(1.);
928
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 VectorXd q = randomConfiguration(model);
929
930
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
4 const Model::JointIndex joint_id = model.existJointName("rarm2_joint")
931
4/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
4 ? model.getJointId("rarm2_joint")
932
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 : (Model::Index)(model.njoints - 1);
933
934
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data, q);
935
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointKinematicHessians(model, data);
936
937
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data data2(model);
938
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointKinematicHessians(model, data2, q);
939
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 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 1 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 1 times.
2 BOOST_CHECK(data2.J.isApprox(data.J));
940
941 2 const Eigen::DenseIndex matrix_offset = 6 * model.nv;
942
943
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int k = 0; k < model.nv; ++k)
944 {
945
3/6
✓ 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.
64 Eigen::Map<Data::Matrix6x> dJ(data.kinematic_hessians.data() + k * matrix_offset, 6, model.nv);
946 Eigen::Map<Data::Matrix6x> dJ2(
947
3/6
✓ 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.
64 data2.kinematic_hessians.data() + k * matrix_offset, 6, model.nv);
948
949
7/14
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 32 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 32 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 32 times.
64 BOOST_CHECK(dJ2.isApprox(dJ));
950 }
951
952
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (int i = 0; i < model.nv; ++i)
953 {
954
2/2
✓ Branch 0 taken 528 times.
✓ Branch 1 taken 32 times.
1120 for (int j = i; j < model.nv; ++j)
955 {
956 1056 bool j_is_children_of_i = false;
957
2/2
✓ Branch 1 taken 4208 times.
✓ Branch 2 taken 240 times.
8896 for (int parent = j; parent >= 0; parent = data.parents_fromRow[(size_t)parent])
958 {
959
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 3920 times.
8416 if (parent == i)
960 {
961 576 j_is_children_of_i = true;
962 576 break;
963 }
964 }
965
966
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 240 times.
1056 if (j_is_children_of_i)
967 {
968
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 256 times.
576 if (i == j)
969 {
970 Eigen::Map<Data::Motion::Vector6> SixSi(
971
3/6
✓ 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.
64 data.kinematic_hessians.data() + i * matrix_offset + i * 6);
972
7/14
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 32 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 32 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 32 times.
64 BOOST_CHECK(SixSi.isZero());
973 }
974 else
975 {
976 Eigen::Map<Data::Motion::Vector6> SixSj(
977
3/6
✓ Branch 1 taken 256 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 256 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 256 times.
✗ Branch 8 not taken.
512 data.kinematic_hessians.data() + i * matrix_offset + j * 6);
978
979 Eigen::Map<Data::Motion::Vector6> SjxSi(
980
3/6
✓ Branch 1 taken 256 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 256 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 256 times.
✗ Branch 8 not taken.
512 data.kinematic_hessians.data() + j * matrix_offset + i * 6);
981
982
8/16
✓ Branch 1 taken 256 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 256 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 256 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 256 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 256 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 256 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 256 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 256 times.
512 BOOST_CHECK(SixSj.isApprox(-SjxSi));
983 }
984 }
985 else
986 {
987 Eigen::Map<Data::Motion::Vector6> SixSj(
988
3/6
✓ Branch 1 taken 240 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 240 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 240 times.
✗ Branch 8 not taken.
480 data.kinematic_hessians.data() + i * matrix_offset + j * 6);
989
990 Eigen::Map<Data::Motion::Vector6> SjxSi(
991
3/6
✓ Branch 1 taken 240 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 240 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 240 times.
✗ Branch 8 not taken.
480 data.kinematic_hessians.data() + j * matrix_offset + i * 6);
992
993
7/14
✓ Branch 1 taken 240 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 240 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 240 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 240 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 240 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 240 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 240 times.
480 BOOST_CHECK(SixSj.isZero());
994
7/14
✓ Branch 1 taken 240 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 240 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 240 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 240 times.
✗ Branch 16 not taken.
✓ Branch 18 taken 240 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 240 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 240 times.
480 BOOST_CHECK(SjxSi.isZero());
995 }
996 }
997 }
998
999 2 const double eps = 1e-8;
1000
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 Data::Matrix6x J_ref(6, model.nv), J_plus(6, model.nv);
1001
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_ref.setZero();
1002
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_plus.setZero();
1003
1004
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
1005
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 VectorXd v_plus(VectorXd::Zero(model.nv));
1006
1007 2 const Eigen::DenseIndex outer_offset = model.nv * 6;
1008
1009 // WORLD
1010
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, joint_id, WORLD, J_ref);
1011
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Tensor3x kinematic_hessian_world = getJointKinematicHessian(model, data, joint_id, WORLD);
1012
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
1013 {
1014
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = eps;
1015
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 const VectorXd q_plus = integrate(model, q, v_plus);
1016
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 computeJointJacobians(model, data_plus, q_plus);
1017
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 J_plus.setZero();
1018
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 getJointJacobian(model, data_plus, joint_id, WORLD, J_plus);
1019
1020
3/6
✓ 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.
64 Data::Matrix6x dJ_dq_ref = (J_plus - J_ref) / eps;
1021 Eigen::Map<Data::Matrix6x> dJ_dq(
1022
3/6
✓ 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.
64 kinematic_hessian_world.data() + k * outer_offset, 6, model.nv);
1023
1024 // std::cout << "k: " << k << std::endl;
1025 // std::cout << "dJ_dq:\n" << dJ_dq << std::endl;
1026 // std::cout << "dJ_dq_ref:\n" << dJ_dq_ref << std::endl;
1027
8/16
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 32 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 32 times.
64 BOOST_CHECK((dJ_dq_ref - dJ_dq).isZero(sqrt(eps)));
1028
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = 0.;
1029 64 }
1030
1031 // LOCAL_WORLD_ALIGNED
1032
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
1033
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, joint_id, LOCAL_WORLD_ALIGNED, J_ref);
1034 Data::Tensor3x kinematic_hessian_local_world_aligned =
1035
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointKinematicHessian(model, data, joint_id, LOCAL_WORLD_ALIGNED);
1036
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix3x dt_last_fd(3, model.nv);
1037
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
1038 {
1039
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = eps;
1040
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 const VectorXd q_plus = integrate(model, q, v_plus);
1041
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 computeJointJacobians(model, data_plus, q_plus);
1042
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 J_plus.setZero();
1043
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 getJointJacobian(model, data_plus, joint_id, LOCAL_WORLD_ALIGNED, J_plus);
1044
1045
2/4
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
64 SE3 tMt_plus = data_ref.oMi[joint_id].inverse() * data_plus.oMi[joint_id];
1046
2/4
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 32 times.
✗ Branch 5 not taken.
64 tMt_plus.rotation().setIdentity();
1047
1048
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 dt_last_fd.col(k) =
1049
5/10
✓ Branch 2 taken 32 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 32 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 32 times.
✗ Branch 10 not taken.
✓ Branch 12 taken 32 times.
✗ Branch 13 not taken.
✓ Branch 15 taken 32 times.
✗ Branch 16 not taken.
128 (data_plus.oMi[joint_id].translation() - data_ref.oMi[joint_id].translation()) / eps;
1050
1051
3/6
✓ 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.
64 Data::Matrix6x dJ_dq_ref = (J_plus - J_ref) / eps;
1052 Eigen::Map<Data::Matrix6x> dJ_dq(
1053
3/6
✓ 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.
64 kinematic_hessian_local_world_aligned.data() + k * outer_offset, 6, model.nv);
1054
1055 // std::cout << "k: " << k << std::endl;
1056 // std::cout << "dJ_dq:\n" << dJ_dq << std::endl;
1057 // std::cout << "dJ_dq_ref:\n" << dJ_dq_ref << std::endl;
1058
8/16
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 32 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 32 times.
64 BOOST_CHECK((dJ_dq_ref - dJ_dq).isZero(sqrt(eps)));
1059
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = 0.;
1060 64 }
1061
1062
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Matrix6x J_world(6, model.nv);
1063
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 J_world.setZero();
1064
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, joint_id, LOCAL_WORLD_ALIGNED, J_world);
1065
1066
8/16
✓ 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 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
2 BOOST_CHECK(dt_last_fd.isApprox(J_world.topRows<3>(), sqrt(eps)));
1067
1068 // LOCAL
1069
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 computeJointJacobians(model, data_ref, q);
1070
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 getJointJacobian(model, data_ref, joint_id, LOCAL, J_ref);
1071
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 Data::Tensor3x kinematic_hessian_local = getJointKinematicHessian(model, data, joint_id, LOCAL);
1072
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
66 for (Eigen::DenseIndex k = 0; k < model.nv; ++k)
1073 {
1074
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = eps;
1075
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 const VectorXd q_plus = integrate(model, q, v_plus);
1076
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 computeJointJacobians(model, data_plus, q_plus);
1077
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 J_plus.setZero();
1078
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 getJointJacobian(model, data_plus, joint_id, LOCAL, J_plus);
1079
1080 // const SE3 tMt_plus = data_ref.oMi[joint_id].inverse() * data_plus.oMi[joint_id];
1081
1082
3/6
✓ 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.
64 Data::Matrix6x dJ_dq_ref = (J_plus - J_ref) / eps;
1083 Eigen::Map<Data::Matrix6x> dJ_dq(
1084
3/6
✓ 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.
64 kinematic_hessian_local.data() + k * outer_offset, 6, model.nv);
1085
1086 // std::cout << "k: " << k << std::endl;
1087 // std::cout << "dJ_dq:\n" << dJ_dq << std::endl;
1088 // std::cout << "dJ_dq_ref:\n" << dJ_dq_ref << std::endl;
1089
8/16
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 32 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 32 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 32 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 32 times.
✗ Branch 21 not taken.
✓ Branch 23 taken 32 times.
✗ Branch 24 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 32 times.
64 BOOST_CHECK((dJ_dq_ref - dJ_dq).isZero(sqrt(eps)));
1090
1/2
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
64 v_plus[k] = 0.;
1091 64 }
1092 2 }
1093
1094 BOOST_AUTO_TEST_SUITE_END()
1095