9#include <gtest/gtest.h>
16static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
18namespace fs = std::filesystem;
20TEST(ExamplePaths, StaleMenagerieEnvFallsBackToCache)
22 const auto tmp = fs::temp_directory_path() /
"mj_kdl_wrapper_paths_test";
24 fs::create_directories(tmp /
"cache" /
"mj_kdl_wrapper" /
"menagerie" /
"kinova_gen3");
26 const auto model = tmp /
"cache" /
"mj_kdl_wrapper" /
"menagerie" /
"kinova_gen3" /
"gen3.xml";
27 std::ofstream(model) <<
"<mujoco/>";
29 const char *old_xdg = std::getenv(
"XDG_CACHE_HOME");
30 const char *old_menagerie = std::getenv(
"MJ_KDL_MENAGERIE");
31 const std::string saved_xdg = old_xdg ? old_xdg :
"";
32 const std::string saved_menagerie = old_menagerie ? old_menagerie :
"";
34 setenv(
"XDG_CACHE_HOME", (tmp /
"cache").c_str(), 1);
35 setenv(
"MJ_KDL_MENAGERIE", (tmp /
"missing").c_str(), 1);
39 old_xdg ? setenv(
"XDG_CACHE_HOME", saved_xdg.c_str(), 1) : unsetenv(
"XDG_CACHE_HOME");
40 old_menagerie ? setenv(
"MJ_KDL_MENAGERIE", saved_menagerie.c_str(), 1)
41 : unsetenv(
"MJ_KDL_MENAGERIE");
56 if (!fs::exists(mjcf)) {
57 GTEST_SKIP() << mjcf <<
" not found";
63 sc_.add_skybox =
true;
68 <<
"init_robot_from_mjcf() returned false";
80 EXPECT_EQ(s.n_joints, 7) <<
"expected 7 KDL joints, got " << s.n_joints;
85 unsigned n =
static_cast<unsigned>(s.n_joints);
86 KDL::JntArray q_home(n);
87 for (
unsigned i = 0; i < n; ++i) q_home(i) = kHomePose[i];
89 mj_forward(s.model, s.data);
91 const double t0 = s.data->time;
93 ASSERT_TRUE(s.data->time > t0) <<
"simulation time did not advance after 100 steps";
101 unsigned n =
static_cast<unsigned>(s.n_joints);
102 KDL::JntArray q_displaced(n);
103 for (
unsigned i = 0; i < n; ++i) q_displaced(i) = kHomePose[i] + 0.3;
107 double pos_before = s.data->qpos[s.kdl_to_mj_qpos[0]];
115 double pos_after = s.data->qpos[s.kdl_to_mj_qpos[0]];
116 EXPECT_NE(pos_after, pos_before);
122 unsigned n =
static_cast<unsigned>(s.n_joints);
123 for (
unsigned i = 0; i < n; ++i) {
124 s.jnt_pos_cmd[i] = 99.0;
125 s.jnt_trq_cmd[i] = 42.0;
134 for (
unsigned i = 0; i < n; ++i) {
135 double qpos = s.data->qpos[s.kdl_to_mj_qpos[i]];
136 EXPECT_DOUBLE_EQ(s.jnt_pos_cmd[i], qpos)
137 <<
"jnt_pos_cmd[" << i <<
"] not synced to qpos after reset";
138 EXPECT_DOUBLE_EQ(s.jnt_trq_cmd[i], 0.0)
139 <<
"jnt_trq_cmd[" << i <<
"] not zeroed after reset";
155 EXPECT_EQ(call_count, 1) <<
"on_reset was not called by reset()";
179 EXPECT_EQ(ctx->env, &env);
180 EXPECT_EQ(ctx->model, model_);
181 EXPECT_EQ(ctx->data, data_);
184 for (
int i = 0; i < s.n_joints; ++i) {
185 s.jnt_pos_cmd[i] = 99.0;
186 s.jnt_trq_cmd[i] = 42.0;
187 s.data->qfrc_applied[s.kdl_to_mj_dof[i]] = 12.0;
192 EXPECT_EQ(call_count, 1);
193 if (model_->nkey > 0) {
197 for (
int i = 0; i < s.n_joints; ++i) {
198 double qpos = s.data->qpos[s.kdl_to_mj_qpos[i]];
199 EXPECT_DOUBLE_EQ(s.jnt_pos_msr[i], qpos);
200 EXPECT_DOUBLE_EQ(s.jnt_pos_cmd[i], qpos);
201 EXPECT_DOUBLE_EQ(s.jnt_trq_cmd[i], 0.0);
202 EXPECT_DOUBLE_EQ(s.data->qfrc_applied[s.kdl_to_mj_dof[i]], 0.0);
209int main(
int argc,
char *argv[])
211 testing::InitGoogleTest(&argc, argv);
212 return RUN_ALL_TESTS();
void env_add_robot(Env *env, Robot *robot)
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
bool step_n(Robot *s, int n)
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::string find_menagerie_model(const fs::path &relative)
TEST(ExamplePaths, StaleMenagerieEnvFallsBackToCache)
int main(int argc, char *argv[])
TEST_F(InitTest, BasicDOF)