28static constexpr double kHomePose[7] = { 0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708 };
29static constexpr double kTargetPose[7] = { 0.3, 0.5, 2.9, -2.0, 0.3, 1.2, 1.3 };
31static constexpr double kKv = 2.0;
32static constexpr double kMaxVel = 0.6;
33static constexpr double kTol = 0.01;
35int main(
int argc,
char *argv[])
37 bool headless =
false;
38 for (
int i = 1; i < argc; ++i)
39 if (std::string(argv[i]) ==
"--headless") headless =
true;
48 r.
path = mjcf.c_str();
51 mjModel *model =
nullptr;
52 mjData *data =
nullptr;
54 std::cerr <<
"build_scene() failed\n";
60 std::cerr <<
"init_robot_from_mjcf() failed\n";
65 unsigned n =
static_cast<unsigned>(robot.
n_joints);
67 KDL::JntArray q_home(n);
68 for (
unsigned i = 0; i < n; ++i) q_home(i) = kHomePose[i];
78 const double dt = model->opt.timestep;
88 auto ctrl_step = [&]() {
94 for (
unsigned i = 0; i < n; ++i) {
96 max_err = std::max(max_err, std::abs(err));
97 double vel = std::clamp(kKv * err, -kMaxVel, kMaxVel);
101 if (max_err < kTol) {
108 const double timeout = 5.0;
109 while (data->time < timeout && !arrived) {
114 double max_err = 0.0;
115 for (
unsigned i = 0; i < n; ++i)
116 max_err = std::max(max_err, std::abs(kTargetPose[i] - robot.
jnt_pos_msr[i]));
117 std::cout <<
"max joint error: " << std::fixed << std::setprecision(4) << max_err
118 <<
" rad (" << (arrived ?
"converged" :
"timeout") <<
")\n";
122 std::cerr <<
"init_window_sim() failed\n";
128 double prev_sim_time = data->time;
131 prev_sim_time = data->time;
int main(int argc, char *argv[])
void env_add_robot(Env *env, Robot *robot)
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
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)
bool init_window_sim(Viewer *v, Robot *r, const char *title="MuJoCo")
std::string menagerie_model(const fs::path &relative)
std::vector< double > jnt_pos_msr
std::vector< double > jnt_pos_cmd
std::vector< RobotSpec > robots