Mujoco KDL Wrapper  0.2.2
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
test_mjcf_ft_sensor.cpp
Go to the documentation of this file.
1/* test_mjcf_ft_sensor.cpp
2 * Logical FT sensor exposure on the Kinova GEN3 default scene. */
3
5#include "example_paths.hpp"
6
7#include <gtest/gtest.h>
8
9#include <cmath>
10#include <filesystem>
11#include <string>
12
13namespace fs = std::filesystem;
14
15class MjcfFtSensorTest : public testing::Test
16{
17 protected:
18 mjModel *model_ = nullptr;
19 mjData *data_ = nullptr;
20
21 std::string arm_mjcf_;
22 std::string ft_mjcf_;
23 std::string grp_mjcf_;
24
25 void SetUp() override
26 {
27 arm_mjcf_ = mj_kdl_examples::find_menagerie_model("kinova_gen3/gen3.xml");
28 ft_mjcf_ = mj_kdl_examples::find_asset("ft_sensor.xml");
29 grp_mjcf_ = mj_kdl_examples::find_asset("robotiq_2f85/2f85.xml");
30 if (!fs::exists(arm_mjcf_)) GTEST_SKIP() << arm_mjcf_ << " not found";
31 if (!fs::exists(ft_mjcf_)) GTEST_SKIP() << ft_mjcf_ << " not found";
32 if (!fs::exists(grp_mjcf_)) GTEST_SKIP() << grp_mjcf_ << " not found";
33
35 .mjcf_path = ft_mjcf_.c_str(),
36 .attach_to = { mj_kdl::AttachKind::Site, "pinch_site" },
37 .prefix = "",
38 .contact_exclusions = {},
39 };
41 .mjcf_path = grp_mjcf_.c_str(),
42 .attach_to = { mj_kdl::AttachKind::Site, "wrist_ft_site" },
43 .prefix = "g_",
44 .contact_exclusions = {},
45 };
46
48 rs.path = arm_mjcf_.c_str();
49 rs.attachments.push_back(ft);
50 rs.attachments.push_back(gripper);
51
53 sc.timestep = 0.002;
54 sc.add_floor = true;
55 sc.add_skybox = true;
56 sc.robots.push_back(rs);
57
58 ASSERT_TRUE(mj_kdl::build_scene(&model_, &data_, &sc));
59 }
60
62};
63
64TEST_F(MjcfFtSensorTest, ReadsNamedWrench)
65{
66 mj_kdl::ForceTorqueSensorSpec ft{ .name = "wrist_ft", .frame_site = "wrist_ft_site" };
68 .tool_body = "g_base",
69 .tcp_site = "g_pinch",
70 .ft_sensors = { ft },
71 };
72
73 mj_kdl::Robot robot;
74 ASSERT_TRUE(
75 mj_kdl::init_robot_from_mjcf(&robot, model_, data_, "base_link", "bracelet_link", "", &tool)
76 );
77 EXPECT_EQ(robot.ft_sensors.size(), 1u);
78 const mj_kdl::ForceTorqueSensor *sensor = mj_kdl::find_ft_sensor(&robot, "wrist_ft");
79 ASSERT_NE(sensor, nullptr);
80 EXPECT_EQ(sensor->force_sensor, "wrist_ft_force");
81 EXPECT_EQ(sensor->torque_sensor, "wrist_ft_torque");
82 EXPECT_GE(sensor->frame_site_id, 0);
83
84 mj_forward(model_, data_);
85 mj_kdl::update(&robot);
86 sensor = mj_kdl::find_ft_sensor(&robot, "wrist_ft");
87 ASSERT_NE(sensor, nullptr);
88 EXPECT_TRUE(std::isfinite(sensor->wrench.force.x()));
89 EXPECT_TRUE(std::isfinite(sensor->wrench.force.y()));
90 EXPECT_TRUE(std::isfinite(sensor->wrench.force.z()));
91 EXPECT_TRUE(std::isfinite(sensor->wrench.torque.x()));
92 EXPECT_TRUE(std::isfinite(sensor->wrench.torque.y()));
93 EXPECT_TRUE(std::isfinite(sensor->wrench.torque.z()));
94
95 mj_kdl::cleanup(&robot);
96}
97
98TEST_F(MjcfFtSensorTest, RejectsMissingTorqueSensor)
99{
101 .name = "bad_ft",
102 .force_sensor = "wrist_ft_force",
103 .torque_sensor = "missing_torque",
104 };
106 .tool_body = "g_base",
107 .tcp_site = "g_pinch",
108 .ft_sensors = { ft },
109 };
110
111 mj_kdl::Robot robot;
112 EXPECT_FALSE(
113 mj_kdl::init_robot_from_mjcf(&robot, model_, data_, "base_link", "bracelet_link", "", &tool)
114 );
115 mj_kdl::cleanup(&robot);
116}
117
118int main(int argc, char *argv[])
119{
120 testing::InitGoogleTest(&argc, argv);
121 return RUN_ALL_TESTS();
122}
void TearDown() override
void cleanup(Robot *r)
bool init_robot_from_mjcf(Robot *r, mjModel *model, mjData *data, const char *base_body, const char *tip_body, const char *prefix="", const ToolFrameSpec *tool=nullptr)
void update(Robot *r)
const ForceTorqueSensor * find_ft_sensor(const Robot *r, const char *name)
bool build_scene(mjModel **out_model, mjData **out_data, const SceneSpec *spec)
void destroy_scene(mjModel *model, mjData *data)
std::string find_asset(const fs::path &relative)
std::string find_menagerie_model(const fs::path &relative)
std::vector< AttachmentSpec > attachments
std::vector< ForceTorqueSensor > ft_sensors
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfFtSensorTest, ReadsNamedWrench)