|
| 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 | +int main(int /* argc */, char ** /* argv */) |
| 10 | +{ |
| 11 | + pinocchio::Model model; |
| 12 | + pinocchio::buildModels::manipulator(model); |
| 13 | + pinocchio::Data data(model); |
| 14 | + |
| 15 | + const int JOINT_ID = 6; |
| 16 | + const pinocchio::SE3 oMdes(Eigen::Matrix3d::Identity(), Eigen::Vector3d(1., 0., 1.)); |
| 17 | + |
| 18 | + Eigen::VectorXd q = pinocchio::neutral(model); |
| 19 | + const double eps = 1e-4; |
| 20 | + const int IT_MAX = 1000; |
| 21 | + const double DT = 1e-1; |
| 22 | + const double damp = 1e-12; |
| 23 | + |
| 24 | + pinocchio::Data::Matrix6x joint_jacobian(6, model.nv); |
| 25 | + joint_jacobian.setZero(); |
| 26 | + |
| 27 | + bool success = false; |
| 28 | + Eigen::Vector3d err; |
| 29 | + Eigen::VectorXd v(model.nv); |
| 30 | + for (int i = 0;; i++) |
| 31 | + { |
| 32 | + pinocchio::forwardKinematics(model, data, q); |
| 33 | + const pinocchio::SE3 iMd = data.oMi[JOINT_ID].actInv(oMdes); |
| 34 | + err = iMd.translation(); // in joint frame |
| 35 | + if (err.norm() < eps) |
| 36 | + { |
| 37 | + success = true; |
| 38 | + break; |
| 39 | + } |
| 40 | + if (i >= IT_MAX) |
| 41 | + { |
| 42 | + success = false; |
| 43 | + break; |
| 44 | + } |
| 45 | + pinocchio::computeJointJacobian( |
| 46 | + model, data, q, JOINT_ID, joint_jacobian); // joint_jacobian expressed in the joint frame |
| 47 | + const auto J = -joint_jacobian.topRows<3>(); // Jacobian associated with the error |
| 48 | + const Eigen::Matrix3d JJt = J * J.transpose() + damp * Eigen::Matrix3d::Identity(); |
| 49 | + v.noalias() = -J.transpose() * JJt.ldlt().solve(err); |
| 50 | + q = pinocchio::integrate(model, q, v * DT); |
| 51 | + if (!(i % 10)) |
| 52 | + std::cout << i << ": error = " << err.transpose() << std::endl; |
| 53 | + } |
| 54 | + |
| 55 | + if (success) |
| 56 | + { |
| 57 | + 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 | + std::cout << "\nresult: " << q.transpose() << std::endl; |
| 67 | + std::cout << "\nfinal error: " << err.transpose() << std::endl; |
| 68 | +} |
0 commit comments