8#include <gtest/gtest.h>
13static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
15namespace fs = std::filesystem;
16static fs::path repo_root() {
return fs::path(__FILE__).parent_path().parent_path(); }
28 fs::path root = repo_root();
29 std::string mjcf = (root /
"third_party/menagerie/kinova_gen3/gen3.xml").
string();
30 if (!fs::exists(mjcf)) {
31 GTEST_SKIP() << mjcf <<
" not found";
39 <<
"init_robot_from_mjcf() returned false";
51 EXPECT_EQ(s.n_joints, 7) <<
"expected 7 KDL joints, got " << s.n_joints;
56 unsigned n =
static_cast<unsigned>(s.n_joints);
57 KDL::JntArray q_home(n);
58 for (
unsigned i = 0; i < n; ++i) q_home(i) = kHomePose[i];
60 mj_forward(s.model, s.data);
62 const double t0 = s.data->time;
64 ASSERT_TRUE(s.data->time > t0) <<
"simulation time did not advance after 100 steps";
72 unsigned n =
static_cast<unsigned>(s.n_joints);
73 KDL::JntArray q_displaced(n);
74 for (
unsigned i = 0; i < n; ++i) q_displaced(i) = kHomePose[i] + 0.3;
78 double pos_before = s.data->qpos[s.kdl_to_mj_qpos[0]];
86 double pos_after = s.data->qpos[s.kdl_to_mj_qpos[0]];
87 EXPECT_NE(pos_after, pos_before);
93 unsigned n =
static_cast<unsigned>(s.n_joints);
94 for (
unsigned i = 0; i < n; ++i) {
95 s.jnt_pos_cmd[i] = 99.0;
96 s.jnt_trq_cmd[i] = 42.0;
105 for (
unsigned i = 0; i < n; ++i) {
106 double qpos = s.data->qpos[s.kdl_to_mj_qpos[i]];
107 EXPECT_DOUBLE_EQ(s.jnt_pos_cmd[i], qpos)
108 <<
"jnt_pos_cmd[" << i <<
"] not synced to qpos after reset";
109 EXPECT_DOUBLE_EQ(s.jnt_trq_cmd[i], 0.0)
110 <<
"jnt_trq_cmd[" << i <<
"] not zeroed after reset";
126 EXPECT_EQ(call_count, 1) <<
"on_reset was not called by reset()";
150 EXPECT_EQ(ctx->env, &env);
151 EXPECT_EQ(ctx->model, model_);
152 EXPECT_EQ(ctx->data, data_);
155 for (
int i = 0; i < s.n_joints; ++i) {
156 s.jnt_pos_cmd[i] = 99.0;
157 s.jnt_trq_cmd[i] = 42.0;
158 s.data->qfrc_applied[s.kdl_to_mj_dof[i]] = 12.0;
163 EXPECT_EQ(call_count, 1);
164 if (model_->nkey > 0) {
168 for (
int i = 0; i < s.n_joints; ++i) {
169 double qpos = s.data->qpos[s.kdl_to_mj_qpos[i]];
170 EXPECT_DOUBLE_EQ(s.jnt_pos_msr[i], qpos);
171 EXPECT_DOUBLE_EQ(s.jnt_pos_cmd[i], qpos);
172 EXPECT_DOUBLE_EQ(s.jnt_trq_cmd[i], 0.0);
173 EXPECT_DOUBLE_EQ(s.data->qfrc_applied[s.kdl_to_mj_dof[i]], 0.0);
180int main(
int argc,
char *argv[])
182 testing::InitGoogleTest(&argc, argv);
183 return RUN_ALL_TESTS();
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)
void env_add_robot(Env *env, Robot *robot)
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(InitTest, BasicDOF)