| Directory: | ./ |
|---|---|
| File: | examples/inverse-kinematics.cpp |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 41 | 45 | 91.1% |
| Branches: | 62 | 124 | 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-6; | |
| 23 | |||
| 24 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pinocchio::Data::Matrix6x J(6, model.nv); |
| 25 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | J.setZero(); |
| 26 | |||
| 27 | 1 | bool success = false; | |
| 28 | typedef Eigen::Matrix<double, 6, 1> Vector6d; | ||
| 29 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Vector6d err; |
| 30 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | Eigen::VectorXd v(model.nv); |
| 31 | 1 | for (int i = 0;; i++) | |
| 32 | { | ||
| 33 |
1/2✓ Branch 1 taken 91 times.
✗ Branch 2 not taken.
|
91 | pinocchio::forwardKinematics(model, data, q); |
| 34 |
1/2✓ Branch 2 taken 91 times.
✗ Branch 3 not taken.
|
91 | const pinocchio::SE3 iMd = data.oMi[JOINT_ID].actInv(oMdes); |
| 35 |
3/6✓ Branch 1 taken 91 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 91 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 91 times.
✗ Branch 8 not taken.
|
91 | err = pinocchio::log6(iMd).toVector(); // in joint frame |
| 36 |
3/4✓ Branch 1 taken 91 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 90 times.
|
91 | if (err.norm() < eps) |
| 37 | { | ||
| 38 | 1 | success = true; | |
| 39 | 1 | break; | |
| 40 | } | ||
| 41 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
|
90 | if (i >= IT_MAX) |
| 42 | { | ||
| 43 | ✗ | success = false; | |
| 44 | ✗ | break; | |
| 45 | } | ||
| 46 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
90 | pinocchio::computeJointJacobian(model, data, q, JOINT_ID, J); // J in joint frame |
| 47 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
90 | pinocchio::Data::Matrix6 Jlog; |
| 48 |
2/4✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
|
90 | pinocchio::Jlog6(iMd.inverse(), Jlog); |
| 49 |
3/6✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
|
90 | J = -Jlog * J; |
| 50 |
1/2✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
|
90 | pinocchio::Data::Matrix6 JJt; |
| 51 |
4/8✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 90 times.
✗ Branch 11 not taken.
|
90 | JJt.noalias() = J * J.transpose(); |
| 52 |
3/6✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
|
90 | JJt.diagonal().array() += damp; |
| 53 |
7/14✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 90 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 90 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 90 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 90 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 90 times.
✗ Branch 20 not taken.
|
90 | v.noalias() = -J.transpose() * JJt.ldlt().solve(err); |
| 54 |
2/4✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
|
90 | q = pinocchio::integrate(model, q, v * DT); |
| 55 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 81 times.
|
90 | if (!(i % 10)) |
| 56 |
5/10✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 9 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 9 times.
✗ Branch 14 not taken.
|
9 | std::cout << i << ": error = " << err.transpose() << std::endl; |
| 57 | 90 | } | |
| 58 | |||
| 59 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if (success) |
| 60 | { | ||
| 61 |
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; |
| 62 | } | ||
| 63 | else | ||
| 64 | { | ||
| 65 | std::cout | ||
| 66 | ✗ | << "\nWarning: the iterative algorithm has not reached convergence to the desired precision" | |
| 67 | ✗ | << std::endl; | |
| 68 | } | ||
| 69 | |||
| 70 |
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; |
| 71 |
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; |
| 72 | 1 | } | |
| 73 |