8#include <gtest/gtest.h>
10#include <kdl/chainfksolverpos_recursive.hpp>
17namespace fs = std::filesystem;
19static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
33 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
40 if (!fs::exists(mjcf)) {
41 GTEST_SKIP() << mjcf <<
" not found";
55 ASSERT_GE(
model_->nbody, 9);
58 n_ =
s_.chain.getNrOfJoints();
61 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.chain);
64 int key_id = mj_name2id(
model_, mjOBJ_KEY,
"home");
69 for (
unsigned i = 0; i <
n_; ++i) q(i) = kHomePose[i];
75 for (
int i = 0; i <
s_.n_joints; ++i)
q_home_(i) =
s_.data->qpos[
s_.kdl_to_mj_qpos[i]];
89 EXPECT_EQ(model_->nv, 7);
90 EXPECT_GE(model_->nbody, 9);
101 ASSERT_GE(fk_->JntToCart(q_home_, fk_home), 0) <<
"FK failed at home pose";
102 double dist = fk_home.p.Norm();
103 EXPECT_GE(dist, 0.1);
104 EXPECT_LE(dist, 1.1);
119 std::unique_ptr<KDL::ChainFkSolverPos_recursive>
fk_;
123 const std::string arm_mjcf =
125 const std::string grp_mjcf =
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";
137 .mjcf_path = grp_mjcf.c_str(),
140 .contact_exclusions = {},
143 rs.
path = arm_mjcf.c_str();
153 ASSERT_GE(
model_->nq, 13);
160 n_ =
s_.chain.getNrOfJoints();
163 fk_ = std::make_unique<KDL::ChainFkSolverPos_recursive>(
s_.chain);
165 ASSERT_GE(mj_name2id(
model_, mjOBJ_ACTUATOR,
"g_fingers_actuator"), 0)
166 <<
"g_fingers_actuator not found";
180 EXPECT_GE(model_->nq, 13);
181 EXPECT_GE(model_->nu, 8);
191 KDL::JntArray q_home(n_);
192 for (
unsigned i = 0; i < n_; ++i) q_home(i) = kHomePose[i];
194 fk_->JntToCart(q_home, fk_pose);
195 double ee_dist = fk_pose.p.Norm();
196 EXPECT_GE(ee_dist, 0.1);
197 EXPECT_LE(ee_dist, 1.1);
202 int rdriver = mj_name2id(model_, mjOBJ_JOINT,
"g_right_driver_joint");
203 ASSERT_GE(rdriver, 0) <<
"g_right_driver_joint not found";
205 double lo = model_->jnt_range[2 * rdriver];
206 double hi = model_->jnt_range[2 * rdriver + 1];
207 EXPECT_LE(std::abs(hi - 0.8), 0.01);
208 EXPECT_GE(lo, -0.01);
213 int rdriver = mj_name2id(model_, mjOBJ_JOINT,
"g_right_driver_joint");
214 ASSERT_GE(rdriver, 0) <<
"g_right_driver_joint not found";
216 int ldriver = mj_name2id(model_, mjOBJ_JOINT,
"g_left_driver_joint");
217 ASSERT_GE(ldriver, 0) <<
"g_left_driver_joint not found";
218 data_->qpos[model_->jnt_qposadr[rdriver]] = 0.42;
219 data_->qpos[model_->jnt_qposadr[ldriver]] = 0.42;
221 double measured = 0.0;
223 EXPECT_NEAR(measured, 0.42, 1e-9);
228 EXPECT_NEAR(measured, 0.42, 1e-9);
233int main(
int argc,
char *argv[])
235 testing::InitGoogleTest(&argc, argv);
236 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)
bool get_joint_position(const mjModel *model, mjData *data, const char *name, double *out)
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< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfLoadTest, ModelLoaded)