8#include <gtest/gtest.h>
10#include <kdl/chainfksolverpos_recursive.hpp>
19namespace fs = std::filesystem;
21static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
23static fs::path repo_root() {
return fs::path(__FILE__).parent_path().parent_path(); }
37 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
43 if (!fs::exists(
root_ /
"third_party/menagerie")) {
44 GTEST_SKIP() <<
"third_party/menagerie/ not found";
49 std::string mjcf = (
root_ /
"third_party/menagerie/kinova_gen3/scene.xml").
string();
53 r.
path = mjcf.c_str();
60 ASSERT_GE(
model_->nbody, 9);
70 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.
chain);
73 int key_id = mj_name2id(
model_, mjOBJ_KEY,
"home");
78 for (
unsigned i = 0; i <
n_; ++i) q(i) = kHomePose[i];
98 EXPECT_EQ(model_->nv, 7);
99 EXPECT_GE(model_->nbody, 9);
104 TEST_INFO(
"arm KDL chain: " << n_ <<
" joints");
111 ASSERT_GE(fk_->JntToCart(q_home_, fk_home), 0) <<
"FK failed at home pose";
112 double dist = fk_home.p.Norm();
114 "EE at home: [" << std::fixed << std::setprecision(4) << fk_home.p.x() <<
", "
115 << fk_home.p.y() <<
", " << fk_home.p.z() <<
"] dist=" << dist <<
" m"
117 EXPECT_GE(dist, 0.1);
118 EXPECT_LE(dist, 1.1);
133 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
138 if (!fs::exists(
root_ /
"third_party/menagerie")) {
139 GTEST_SKIP() <<
"third_party/menagerie/ not found";
143 const std::string arm_mjcf =
144 (
root_ /
"third_party/menagerie/kinova_gen3/gen3.xml").
string();
145 const std::string grp_mjcf =
146 (
root_ /
"third_party/menagerie/robotiq_2f85/2f85.xml").
string();
152 gs.
pos[2] = -0.061525;
156 rs.
path = arm_mjcf.c_str();
167 ASSERT_GE(
model_->nq, 13);
174 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.
chain);
176 ASSERT_GE(mj_name2id(
model_, mjOBJ_ACTUATOR,
"g_fingers_actuator"), 0)
177 <<
"g_fingers_actuator not found";
191 EXPECT_GE(model_->nq, 13);
192 EXPECT_GE(model_->nu, 8);
197 TEST_INFO(
"arm KDL chain: " << n_ <<
" joints");
203 KDL::JntArray q_home(n_);
204 for (
unsigned i = 0; i < n_; ++i) q_home(i) = kHomePose[i];
206 fk_->JntToCart(q_home, fk_pose);
207 double ee_dist = fk_pose.p.Norm();
209 "EE distance at home: " << std::fixed << std::setprecision(3) << ee_dist * 1000.0 <<
" mm"
211 EXPECT_GE(ee_dist, 0.1);
212 EXPECT_LE(ee_dist, 1.1);
217 int rdriver = mj_name2id(model_, mjOBJ_JOINT,
"g_right_driver_joint");
218 ASSERT_GE(rdriver, 0) <<
"g_right_driver_joint not found";
220 double lo = model_->jnt_range[2 * rdriver];
221 double hi = model_->jnt_range[2 * rdriver + 1];
223 "gripper right_driver_joint range: [" << std::fixed << std::setprecision(4) << lo <<
", "
226 EXPECT_LE(std::abs(hi - 0.8), 0.01);
227 EXPECT_GE(lo, -0.01);
230int main(
int argc,
char *argv[])
232 testing::InitGoogleTest(&argc, argv);
233 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 char *tool_body=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)