7#include <gtest/gtest.h>
9#include <kdl/chainfksolverpos_recursive.hpp>
16namespace fs = std::filesystem;
18static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
20static fs::path repo_root() {
return fs::path(__FILE__).parent_path().parent_path(); }
34 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
41 std::string mjcf = (
root_ /
"third_party/menagerie/kinova_gen3/scene.xml").
string();
42 if (!fs::exists(mjcf)) {
43 GTEST_SKIP() << mjcf <<
" not found";
54 ASSERT_GE(
model_->nbody, 9);
60 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.
chain);
63 int key_id = mj_name2id(
model_, mjOBJ_KEY,
"home");
68 for (
unsigned i = 0; i <
n_; ++i) q(i) = kHomePose[i];
88 EXPECT_EQ(model_->nv, 7);
89 EXPECT_GE(model_->nbody, 9);
100 ASSERT_GE(fk_->JntToCart(q_home_, fk_home), 0) <<
"FK failed at home pose";
101 double dist = fk_home.p.Norm();
102 EXPECT_GE(dist, 0.1);
103 EXPECT_LE(dist, 1.1);
118 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
123 const std::string arm_mjcf =
124 (
root_ /
"third_party/menagerie/kinova_gen3/gen3.xml").
string();
125 const std::string grp_mjcf =
126 (
root_ /
"third_party/menagerie/robotiq_2f85/2f85.xml").
string();
127 if (!fs::exists(arm_mjcf)) {
128 GTEST_SKIP() << arm_mjcf <<
" not found";
131 if (!fs::exists(grp_mjcf)) {
132 GTEST_SKIP() << grp_mjcf <<
" not found";
138 .attach_to =
"bracelet_link",
140 .pos = { 0.0, 0.0, -0.061525 },
141 .euler = { 180.0, 0.0, 0.0 },
142 .contact_exclusions = {},
145 rs.
path = arm_mjcf.c_str();
152 ASSERT_GE(
model_->nq, 13);
162 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.
chain);
164 ASSERT_GE(mj_name2id(
model_, mjOBJ_ACTUATOR,
"g_fingers_actuator"), 0)
165 <<
"g_fingers_actuator not found";
179 EXPECT_GE(model_->nq, 13);
180 EXPECT_GE(model_->nu, 8);
190 KDL::JntArray q_home(n_);
191 for (
unsigned i = 0; i < n_; ++i) q_home(i) = kHomePose[i];
193 fk_->JntToCart(q_home, fk_pose);
194 double ee_dist = fk_pose.p.Norm();
195 EXPECT_GE(ee_dist, 0.1);
196 EXPECT_LE(ee_dist, 1.1);
201 int rdriver = mj_name2id(model_, mjOBJ_JOINT,
"g_right_driver_joint");
202 ASSERT_GE(rdriver, 0) <<
"g_right_driver_joint not found";
204 double lo = model_->jnt_range[2 * rdriver];
205 double hi = model_->jnt_range[2 * rdriver + 1];
206 EXPECT_LE(std::abs(hi - 0.8), 0.01);
207 EXPECT_GE(lo, -0.01);
210int main(
int argc,
char *argv[])
212 testing::InitGoogleTest(&argc, argv);
213 return RUN_ALL_TESTS();
std::unique_ptr< KDL::ChainFkSolverPos_recursive > fk_
std::unique_ptr< KDL::ChainFkSolverPos_recursive > fk_
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 set_joint_pos(Robot *r, const KDL::JntArray &q, bool call_forward=true)
bool build_scene(mjModel **out_model, mjData **out_data, const SceneSpec *spec)
void destroy_scene(mjModel *model, mjData *data)
std::vector< AttachmentSpec > attachments
std::vector< int > kdl_to_mj_qpos
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfLoadTest, ModelLoaded)