28static constexpr double kTargetPose[7] = { 0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3 };
29static constexpr double kMotionDuration = 2.0;
30static constexpr double kHoldTime = 1.0;
31static constexpr double kMaxErr = 0.01;
32static constexpr double kVelGain = 500.0;
33static constexpr double kKv = 2.0;
34static constexpr double kMaxVel = 0.6;
35static constexpr double kTol = 0.01;
36static constexpr double kTimeout = 5.0;
40int main(
int argc,
char *argv[])
61 for (
unsigned i = 0; i < n; ++i) robot.
jnt_pos_cmd[i] = q_home(i);
67 constexpr double kNotReached = std::numeric_limits<double>::infinity();
70 double pos_err = kNotReached;
71 double vel_err = kNotReached;
72 double vel_time = 0.0;
78 t_start = env.
data->time;
79 pos_err = vel_err = kNotReached;
82 const double t = env.
data->time - t_start;
85 const double alpha =
ex::clamp01(t / kMotionDuration);
86 for (
unsigned i = 0; i < n; ++i) {
87 robot.
jnt_pos_cmd[i] = q_home(i) + alpha * (kTargetPose[i] - q_home(i));
88 max_err = std::max(max_err, std::abs(kTargetPose[i] - robot.
jnt_pos_msr[i]));
90 if (t >= kMotionDuration + kHoldTime) {
94 t_start = env.
data->time;
98 for (
unsigned i = 0; i < n; ++i) {
99 const double err = q_home(i) - robot.
jnt_pos_msr[i];
100 max_err = std::max(max_err, std::abs(err));
103 if (max_err < kTol || t >= kTimeout) {
113 const bool pos_ok = pos_err <= kMaxErr;
114 const bool vel_ok = vel_err < kTol;
115 std::cout << std::fixed << std::setprecision(4) <<
"POSITION: max joint error at the target "
116 << pos_err <<
" rad (limit " << kMaxErr <<
" rad)\nVELOCITY: max joint error at home "
117 << vel_err <<
" rad (" << (vel_ok ?
"converged" :
"not converged")
118 <<
" at t = " << std::setprecision(2) << vel_time <<
" s, timeout " << kTimeout
121 return headless ?
ex::verdict(pos_ok && vel_ok,
"both motions reached their goal") : 0;
unsigned int getNrOfJoints() const
int main(int argc, char *argv[])
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
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)
Status open_viewer(Env *env, const char *title="MuJoCo")
void pace_realtime(Env *env)
std::string asset(const fs::path &relative)
double clamp_abs(double v, double limit)
int verdict(bool ok, const std::string &goal)
mj_kdl::SceneSpec scene_spec()
KDL::JntArray home_q(unsigned n)
Args parse_args(int argc, char **argv, const std::string &default_record_path="")
std::vector< double > jnt_vel_cmd
std::vector< double > jnt_pos_cmd
std::vector< double > jnt_pos_msr
std::vector< CtrlModeSpec > modes
std::vector< RobotSpec > robots