1212#include < rl/mdl/Kinematic.h>
1313#include < rl/mdl/UrdfFactory.h>
1414
15+ #include < pinocchio/parsers/urdf.hpp>
16+
17+ #include " pinocchio/algorithm/jacobian.hpp"
18+ #include " pinocchio/algorithm/joint-configuration.hpp"
19+ #include " pinocchio/algorithm/kinematics.hpp"
20+
1521namespace rcs {
1622namespace common {
1723
@@ -21,8 +27,8 @@ RL::RL(const std::string& urdf_path, size_t max_duration_ms) : rl_data() {
2127 std::dynamic_pointer_cast<rl::mdl::Kinematic>(this ->rl_data .mdl );
2228 this ->rl_data .ik = std::make_shared<rl::mdl::JacobianInverseKinematics>(
2329 this ->rl_data .kin .get ());
24- this ->rl_data .ik ->setRandomRestarts (0 );
25- this ->rl_data .ik ->setEpsilon (1e-3 );
30+ this ->rl_data .ik ->setRandomRestarts (this -> random_restarts );
31+ this ->rl_data .ik ->setEpsilon (this -> eps );
2632 this ->rl_data .ik ->setDuration (std::chrono::milliseconds (max_duration_ms));
2733}
2834
@@ -45,5 +51,56 @@ std::optional<Vector7d> RL::ik(const Pose& pose, const Vector7d& q0,
4551 }
4652}
4753
54+ Pin::Pin (const std::string& urdf_path) : model() {
55+ pinocchio::urdf::buildModel (urdf_path, this ->model );
56+ this ->data = pinocchio::Data (this ->model );
57+ }
58+
59+ std::optional<Vector7d> Pin::ik (const Pose& pose, const Vector7d& q0,
60+ const Pose& tcp_offset) {
61+ rcs::common::Pose new_pose = pose * tcp_offset.inverse ();
62+ Vector7d q (q0);
63+ const pinocchio::SE3 oMdes (new_pose.rotation_m (), new_pose.translation ());
64+ pinocchio::Data::Matrix6x J (6 , model.nv );
65+ J.setZero ();
66+ bool success = false ;
67+ Vector6d err;
68+ Eigen::VectorXd v (model.nv );
69+ for (int i = 0 ;; i++) {
70+ 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
73+ if (err.norm () < this ->eps ) {
74+ success = true ;
75+ break ;
76+ }
77+ if (i >= this ->IT_MAX ) {
78+ success = false ;
79+ break ;
80+ }
81+ pinocchio::computeJointJacobian (model, data, q, this ->JOINT_ID ,
82+ J); // J in joint frame
83+ pinocchio::Data::Matrix6 Jlog;
84+ pinocchio::Jlog6 (iMd.inverse (), Jlog);
85+ J = -Jlog * J;
86+ pinocchio::Data::Matrix6 JJt;
87+ JJt.noalias () = J * J.transpose ();
88+ JJt.diagonal ().array () += this ->damp ;
89+ v.noalias () = -J.transpose () * JJt.ldlt ().solve (err);
90+ q = pinocchio::integrate (model, q, v * this ->DT );
91+ if (!(i % 10 ))
92+ std::cout << i << " : error = " << err.transpose () << std::endl;
93+ }
94+ if (success) {
95+ // print amount of iterations
96+ std::cout << " IK success after " << std::to_string (IT_MAX) << " iterations"
97+ << std::endl;
98+ return q;
99+ } else {
100+ std::cout << " IK failed" << std::endl;
101+ return std::nullopt ;
102+ }
103+ }
104+
48105} // namespace common
49106} // namespace rcs
0 commit comments