GCC Code Coverage Report


Directory: ./
File: examples/inverse-kinematics-3d.cpp
Date: 2025-02-12 21:03:38
Exec Total Coverage
Lines: 37 41 90.2%
Branches: 55 110 50.0%

Line Branch Exec Source
1 #include <iostream>
2
3 #include "pinocchio/multibody/sample-models.hpp"
4 #include "pinocchio/spatial/explog.hpp"
5 #include "pinocchio/algorithm/kinematics.hpp"
6 #include "pinocchio/algorithm/jacobian.hpp"
7 #include "pinocchio/algorithm/joint-configuration.hpp"
8
9 1 int main(int /* argc */, char ** /* argv */)
10 {
11
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 pinocchio::Model model;
12
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 pinocchio::buildModels::manipulator(model);
13
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 pinocchio::Data data(model);
14
15 1 const int JOINT_ID = 6;
16
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.
1 const pinocchio::SE3 oMdes(Eigen::Matrix3d::Identity(), Eigen::Vector3d(1., 0., 1.));
17
18
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Eigen::VectorXd q = pinocchio::neutral(model);
19 1 const double eps = 1e-4;
20 1 const int IT_MAX = 1000;
21 1 const double DT = 1e-1;
22 1 const double damp = 1e-12;
23
24
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 pinocchio::Data::Matrix6x joint_jacobian(6, model.nv);
25
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 joint_jacobian.setZero();
26
27 1 bool success = false;
28
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Eigen::Vector3d err;
29
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 Eigen::VectorXd v(model.nv);
30 1 for (int i = 0;; i++)
31 {
32
1/2
✓ Branch 1 taken 94 times.
✗ Branch 2 not taken.
94 pinocchio::forwardKinematics(model, data, q);
33
1/2
✓ Branch 2 taken 94 times.
✗ Branch 3 not taken.
94 const pinocchio::SE3 iMd = data.oMi[JOINT_ID].actInv(oMdes);
34
2/4
✓ Branch 1 taken 94 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 94 times.
✗ Branch 5 not taken.
94 err = iMd.translation(); // in joint frame
35
3/4
✓ Branch 1 taken 94 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 93 times.
94 if (err.norm() < eps)
36 {
37 1 success = true;
38 1 break;
39 }
40
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 93 times.
93 if (i >= IT_MAX)
41 {
42 success = false;
43 break;
44 }
45
1/2
✓ Branch 1 taken 93 times.
✗ Branch 2 not taken.
93 pinocchio::computeJointJacobian(
46 model, data, q, JOINT_ID, joint_jacobian); // joint_jacobian expressed in the joint frame
47
2/4
✓ Branch 1 taken 93 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 93 times.
✗ Branch 5 not taken.
93 const auto J = -joint_jacobian.topRows<3>(); // Jacobian associated with the error
48
6/12
✓ Branch 1 taken 93 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 93 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 93 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 93 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 93 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 93 times.
✗ Branch 17 not taken.
93 const Eigen::Matrix3d JJt = J * J.transpose() + damp * Eigen::Matrix3d::Identity();
49
7/14
✓ Branch 1 taken 93 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 93 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 93 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 93 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 93 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 93 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 93 times.
✗ Branch 20 not taken.
93 v.noalias() = -J.transpose() * JJt.ldlt().solve(err);
50
2/4
✓ Branch 1 taken 93 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 93 times.
✗ Branch 5 not taken.
93 q = pinocchio::integrate(model, q, v * DT);
51
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 83 times.
93 if (!(i % 10))
52
5/10
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 10 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
10 std::cout << i << ": error = " << err.transpose() << std::endl;
53 93 }
54
55
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (success)
56 {
57
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 std::cout << "Convergence achieved!" << std::endl;
58 }
59 else
60 {
61 std::cout
62 << "\nWarning: the iterative algorithm has not reached convergence to the desired precision"
63 << std::endl;
64 }
65
66
4/8
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 std::cout << "\nresult: " << q.transpose() << std::endl;
67
4/8
✓ 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.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
1 std::cout << "\nfinal error: " << err.transpose() << std::endl;
68 1 }
69