13#include <gtest/gtest.h>
20static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
21static constexpr double kTargetPose[7] = { 0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3 };
22static constexpr double kMotionDuration = 1.5;
23static constexpr double kSettleTime = 0.5;
24static constexpr double kErrTol = 0.05;
26namespace fs = std::filesystem;
39 if (!fs::exists(arm_mjcf)) {
40 GTEST_SKIP() << arm_mjcf <<
" not found";
53 n_ =
static_cast<unsigned>(
s_.n_joints);
55 KDL::JntArray q_home(
n_);
56 for (
unsigned i = 0; i <
n_; ++i) q_home(i) = kHomePose[i];
61 for (
unsigned i = 0; i <
n_; ++i) {
s_.jnt_pos_cmd[i] = kHomePose[i]; }
76 const double t_start = data_->time;
77 const double t_end = t_start + kMotionDuration + kSettleTime;
79 while (data_->time < t_end) {
81 double alpha = std::clamp((data_->time - t_start) / kMotionDuration, 0.0, 1.0);
82 for (
unsigned i = 0; i < n_; ++i)
83 s_.jnt_pos_cmd[i] = kHomePose[i] + alpha * (kTargetPose[i] - kHomePose[i]);
88 for (
unsigned i = 0; i < n_; ++i)
89 max_err = std::max(max_err, std::abs(kTargetPose[i] - s_.jnt_pos_msr[i]));
91 EXPECT_LE(max_err, kErrTol);
98 for (
unsigned i = 0; i < n_; ++i) s_.jnt_pos_cmd[i] = 1e9;
101 for (
unsigned i = 0; i < n_; ++i) {
102 const int ci = s_.kdl_to_mj_ctrl[i];
103 if (ci < 0)
continue;
104 if (!model_->actuator_ctrllimited[ci])
continue;
105 double lo = model_->actuator_ctrlrange[2 * ci];
106 double hi = model_->actuator_ctrlrange[2 * ci + 1];
107 EXPECT_LE(data_->ctrl[ci], hi + 1e-12)
108 <<
"ctrl[" << ci <<
"] exceeds ctrlrange upper bound";
109 EXPECT_GE(data_->ctrl[ci], lo - 1e-12)
110 <<
"ctrl[" << ci <<
"] below ctrlrange lower bound";
118 const int dof0 = s_.kdl_to_mj_dof[0];
119 data_->qfrc_applied[dof0] = 5.0;
121 EXPECT_DOUBLE_EQ(data_->qfrc_applied[dof0], 5.0)
122 <<
"update() clobbered qfrc_applied in POSITION mode";
125int main(
int argc,
char *argv[])
127 testing::InitGoogleTest(&argc, argv);
128 return RUN_ALL_TESTS();
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)
std::vector< RobotSpec > robots
int main(int argc, char *argv[])
TEST_F(MjcfPosCtrlTest, TrajectoryTracking)