9#include <gtest/gtest.h>
17namespace fs = std::filesystem;
19static constexpr double kTargetPose[7] = { 0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3 };
20static constexpr double kMotionDuration = 1.5;
21static constexpr double kSettleTime = 0.5;
22static constexpr double kErrTol = 0.01;
33 if (!fs::exists(arm)) GTEST_SKIP() << arm <<
" not found";
51 const int jid = mj_name2id(
env_.model, mjOBJ_JOINT,
s_.joint_names[i].c_str());
52 for (
int a = 0; a <
env_.model->nu; ++a) {
53 if (
env_.model->actuator_trnid[2 * a] == jid &&
env_.model->actuator_group[a] == 1)
62 const double t_start = env_.data->time;
63 while (env_.data->time < t_start + kMotionDuration + kSettleTime) {
65 const double alpha =
ex::clamp01((env_.data->time - t_start) / kMotionDuration);
66 for (
int i = 0; i < 7; ++i)
73 for (
int i = 0; i < 7; ++i)
74 max_err = std::max(max_err, std::abs(kTargetPose[i] - s_.jnt_pos_msr[i]));
75 EXPECT_LE(max_err, kErrTol);
80 for (
int i = 0; i < 7; ++i) s_.jnt_pos_cmd[i] = 1e9;
84 for (
int i = 0; i < 7; ++i) {
85 const int a = servo(i);
86 ASSERT_GE(a, 0) << s_.joint_names[i];
87 if (!env_.model->actuator_ctrllimited[a])
continue;
89 EXPECT_EQ(s_.jnt_saturated[i], 1) <<
"joint " << i;
90 EXPECT_EQ(env_.data->ctrl[a], env_.model->actuator_ctrlrange[2 * a + 1]) <<
"joint " << i;
92 EXPECT_EQ(limited, 3) <<
"Gen3 joints 2, 4 and 6 have a ctrlrange";
95int main(
int argc,
char *argv[])
97 testing::InitGoogleTest(&argc, argv);
98 return RUN_ALL_TESTS();
Status init_env(Env *env, const SceneSpec *spec)
Status set_control_mode(Robot *r, CtrlMode mode)
Status init_robot_from_mjcf(Robot *r, Env *env, 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)
std::string find_asset(const fs::path &relative)
constexpr double kHomePose[7]
KDL::JntArray home_q(unsigned n)
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfPosCtrlTest, TrajectoryTracking)