1212#include < rl/mdl/Kinematic.h>
1313#include < rl/mdl/UrdfFactory.h>
1414
15+ #include < pinocchio/algorithm/frames.hpp>
16+ #include < pinocchio/algorithm/jacobian.hpp>
17+ #include < pinocchio/algorithm/joint-configuration.hpp>
18+ #include < pinocchio/algorithm/kinematics.hpp>
1519#include < pinocchio/parsers/urdf.hpp>
1620
17- #include " pinocchio/algorithm/jacobian.hpp"
18- #include " pinocchio/algorithm/joint-configuration.hpp"
19- #include " pinocchio/algorithm/kinematics.hpp"
20-
2121namespace rcs {
2222namespace common {
2323
@@ -51,9 +51,14 @@ std::optional<Vector7d> RL::ik(const Pose& pose, const Vector7d& q0,
5151 }
5252}
5353
54- Pin::Pin (const std::string& urdf_path) : model() {
54+ Pin::Pin (const std::string& urdf_path, const std::string& frame_id ) : model() {
5555 pinocchio::urdf::buildModel (urdf_path, this ->model );
5656 this ->data = pinocchio::Data (this ->model );
57+ this ->FRAME_ID = model.getFrameId (frame_id);
58+ if (FRAME_ID == -1 ) {
59+ throw std::runtime_error (
60+ frame_id + " frame id could not be found in the provided URDF" );
61+ }
5762}
5863
5964std::optional<Vector7d> Pin::ik (const Pose& pose, const Vector7d& q0,
@@ -68,8 +73,9 @@ std::optional<Vector7d> Pin::ik(const Pose& pose, const Vector7d& q0,
6873 Eigen::VectorXd v (model.nv );
6974 for (int i = 0 ;; i++) {
7075 pinocchio::forwardKinematics (model, data, q);
71- const pinocchio::SE3 iMd = data.oMi [this ->JOINT_ID ].actInv (oMdes);
72- err = pinocchio::log6 (iMd).toVector (); // in joint frame
76+ pinocchio::updateFramePlacements (model, data);
77+ const pinocchio::SE3 iMd = data.oMf [this ->FRAME_ID ].actInv (oMdes);
78+ err = pinocchio::log6 (iMd).toVector ();
7379 if (err.norm () < this ->eps ) {
7480 success = true ;
7581 break ;
@@ -78,8 +84,7 @@ std::optional<Vector7d> Pin::ik(const Pose& pose, const Vector7d& q0,
7884 success = false ;
7985 break ;
8086 }
81- pinocchio::computeJointJacobian (model, data, q, this ->JOINT_ID ,
82- J); // J in joint frame
87+ pinocchio::computeFrameJacobian (model, data, q, this ->FRAME_ID , J);
8388 pinocchio::Data::Matrix6 Jlog;
8489 pinocchio::Jlog6 (iMd.inverse (), Jlog);
8590 J = -Jlog * J;
@@ -88,16 +93,10 @@ std::optional<Vector7d> Pin::ik(const Pose& pose, const Vector7d& q0,
8893 JJt.diagonal ().array () += this ->damp ;
8994 v.noalias () = -J.transpose () * JJt.ldlt ().solve (err);
9095 q = pinocchio::integrate (model, q, v * this ->DT );
91- if (!(i % 10 ))
92- std::cout << i << " : error = " << err.transpose () << std::endl;
9396 }
9497 if (success) {
95- // print amount of iterations
96- std::cout << " IK success after " << std::to_string (IT_MAX) << " iterations"
97- << std::endl;
9898 return q;
9999 } else {
100- std::cout << " IK failed" << std::endl;
101100 return std::nullopt ;
102101 }
103102}
0 commit comments