@@ -32,7 +32,7 @@ RL::RL(const std::string& urdf_path, size_t max_duration_ms) : rl_data() {
3232 this ->rl_data .ik ->setDuration (std::chrono::milliseconds (max_duration_ms));
3333}
3434
35- std::optional<VectorXd> IK ::ik (const Pose& pose, const VectorXd& q0,
35+ std::optional<VectorXd> RL ::ik (const Pose& pose, const VectorXd& q0,
3636 const Pose& tcp_offset) {
3737 // pose is assumed to be in the robots coordinate frame
3838 this ->rl_data .kin ->setPosition (q0);
@@ -50,6 +50,14 @@ std::optional<VectorXd> IK::ik(const Pose& pose, const VectorXd& q0,
5050 return std::nullopt ;
5151 }
5252}
53+ Pose RL::forward (const VectorXd& q0, const Pose& tcp_offset) {
54+ // pose is assumed to be in the robots coordinate frame
55+ this ->rl_data .kin ->setPosition (q0);
56+ this ->rl_data .kin ->forwardPosition ();
57+ rcs::common::Pose pose = this ->rl_data .kin ->getOperationalPosition (0 );
58+ // apply the tcp offset
59+ return pose * tcp_offset.inverse ();
60+ }
5361
5462Pin::Pin (const std::string& urdf_path, const std::string& frame_id) : model() {
5563 pinocchio::urdf::buildModel (urdf_path, this ->model );
@@ -61,10 +69,10 @@ Pin::Pin(const std::string& urdf_path, const std::string& frame_id) : model() {
6169 }
6270}
6371
64- std::optional<Vector7d > Pin::ik (const Pose& pose, const Vector7d & q0,
72+ std::optional<VectorXd > Pin::ik (const Pose& pose, const VectorXd & q0,
6573 const Pose& tcp_offset) {
6674 rcs::common::Pose new_pose = pose * tcp_offset.inverse ();
67- Vector7d q (q0);
75+ VectorXd q (q0);
6876 const pinocchio::SE3 oMdes (new_pose.rotation_m (), new_pose.translation ());
6977 pinocchio::Data::Matrix6x J (6 , model.nv );
7078 J.setZero ();
@@ -101,11 +109,13 @@ std::optional<Vector7d> Pin::ik(const Pose& pose, const Vector7d& q0,
101109 }
102110}
103111
104- Pose IK ::forward (const VectorXd& q0, const Pose& tcp_offset) {
112+ Pose Pin ::forward (const VectorXd& q0, const Pose& tcp_offset) {
105113 // pose is assumed to be in the robots coordinate frame
106- this ->rl .kin ->setPosition (q0);
107- this ->rl .kin ->forwardPosition ();
108- rcs::common::Pose pose = this ->rl .kin ->getOperationalPosition (0 );
114+ pinocchio::forwardKinematics (model, data, q0);
115+ pinocchio::updateFramePlacements (model, data);
116+ rcs::common::Pose pose (data.oMf [this ->FRAME_ID ].rotation (),
117+ data.oMf [this ->FRAME_ID ].translation ());
118+
109119 // apply the tcp offset
110120 return pose * tcp_offset.inverse ();
111121}
0 commit comments