Skip to content

Commit b7995ae

Browse files
committed
fix: pinocchio ik to use custom frame
1 parent 29714dc commit b7995ae

8 files changed

Lines changed: 27 additions & 26 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ find_package(Eigen3 REQUIRED)
4949
find_package(glfw3 REQUIRED)
5050
find_package(Python3 COMPONENTS Interpreter Development REQUIRED)
5151
find_package(MuJoCo REQUIRED)
52-
52+
find_package(pinocchio REQUIRED)
5353
FetchContent_Declare(
5454
libfranka
5555
GIT_REPOSITORY https://github.com/frankaemika/libfranka.git

python/rcsss/_core/common.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class NRobotsWithGripper:
7171
def shut(self, idxs: list[int]) -> None: ...
7272

7373
class Pin(IK):
74-
def __init__(self, urdf_path: str) -> None: ...
74+
def __init__(self, urdf_path: str, frame_id: str = "fr3_link8") -> None: ...
7575

7676
class Pose:
7777
def __getstate__(self) -> typing.Annotated[list[float], pybind11_stubgen.typing_ext.FixedSize(16)]: ...

src/common/IK.cpp

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
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-
2121
namespace rcs {
2222
namespace 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

5964
std::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
}

src/common/IK.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include <memory>
1010
#include <optional>
1111
#include <pinocchio/parsers/urdf.hpp>
12+
#include <string>
1213

1314
#include "Pose.h"
1415
#include "pinocchio/algorithm/jacobian.hpp"
@@ -50,13 +51,13 @@ class Pin : public IK {
5051
const int IT_MAX = 1000;
5152
const double DT = 1e-1;
5253
const double damp = 1e-6;
53-
const int JOINT_ID = 7;
54+
int FRAME_ID;
5455

5556
pinocchio::Model model;
5657
pinocchio::Data data;
5758

5859
public:
59-
Pin(const std::string& urdf_path);
60+
Pin(const std::string& urdf_path, const std::string& frame_id);
6061
std::optional<Vector7d> ik(
6162
const Pose& pose, const Vector7d& q0,
6263
const Pose& tcp_offset = Pose::Identity()) override;

src/hw/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ target_link_libraries(
66
PRIVATE math
77
)
88

9-
add_executable(test_hw main.cpp)
10-
target_link_libraries(test_hw PRIVATE hw)
9+
# add_executable(test_hw main.cpp)
10+
# target_link_libraries(test_hw PRIVATE hw)

src/pybind/rcsss.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,8 @@ PYBIND11_MODULE(_core, m) {
222222

223223
py::class_<rcs::common::Pin, rcs::common::IK,
224224
std::shared_ptr<rcs::common::Pin>>(common, "Pin")
225-
.def(py::init<const std::string &>(), py::arg("urdf_path"));
225+
.def(py::init<const std::string &, const std::string &>(),
226+
py::arg("urdf_path"), py::arg("frame_id") = "fr3_link8");
226227

227228
py::class_<rcs::common::RConfig>(common, "RConfig");
228229
py::class_<rcs::common::RState>(common, "RState");

src/sim/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ target_sources(sim
44
)
55
target_link_libraries(sim PUBLIC glfw common MuJoCo::MuJoCo mujoco_ui_lib)
66

7-
add_executable(test_sim test.cpp sim.cpp)
8-
target_link_libraries(test_sim PRIVATE sim MuJoCo::MuJoCo common glfw)
7+
# add_executable(test_sim test.cpp sim.cpp)
8+
# target_link_libraries(test_sim PRIVATE sim MuJoCo::MuJoCo common glfw pinocchio::pinocchio)

src/sim/test.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
// const std::string mjcf = MODEL_DIR "/mjcf/fr3_modular/scene.xml";
1616
// const std::string urdf = MODEL_DIR "/fr3/urdf/fr3_from_panda.urdf";
1717
const std::string mjcf = "build/_deps/scenes-src/scenes/lab/scene.xml";
18-
const std::string urdf = "build/_deps/scenes-src/scenes/lab/assets/fr3.urdf";
18+
const std::string urdf_path = "build/_deps/scenes-src/scenes/lab/assets/fr3.urdf";
1919
static const Eigen::Matrix<double, 1, 3, Eigen::RowMajor> iso_cube_center(
2020
0.498, 0.0, 0.226);
2121
static const float iso_cube_size = 0.4;
@@ -126,7 +126,7 @@ int test_sim() {
126126
sim->set_config(cfg);
127127
std::string id = "0";
128128

129-
auto ik = std::make_shared<rcs::common::RL>(urdf);
129+
auto ik = std::make_shared<rcs::common::RL>(urdf_path);
130130
auto fr3 = rcs::sim::FR3(sim, id, ik);
131131
auto tcp_offset = rcs::common::Pose(rcs::common::FrankaHandTCPOffset());
132132
rcs::sim::FR3Config fr3_config = *fr3.get_parameters();

0 commit comments

Comments
 (0)