7#include <mujoco/mujoco.h>
8#include <kdl/chain.hpp>
9#include <kdl/frames.hpp>
10#include <kdl/jntarray.hpp>
48#define MJ_FILENAME_ (::strrchr(__FILE__, '/') ? ::strrchr(__FILE__, '/') + 1 : __FILE__)
50#define MJ_LOG_(lvl_enum, color, label, expr) \
52 if (::mj_kdl::LogLevel::lvl_enum >= ::mj_kdl::g_log_level) { \
53 std::ostringstream _mj_oss; \
57 color "[mj_kdl " label "] %s:%d (%s): %s\033[0m\n", \
61 _mj_oss.str().c_str() \
66#define MJ_LOG_INFO(expr) MJ_LOG_(INFO, "", "INFO ", expr)
67#define MJ_LOG_WARN(expr) MJ_LOG_(WARN, "\033[33m", "WARN ", expr)
68#define MJ_LOG_ERROR(expr) MJ_LOG_(ERROR, "\033[31m", "ERROR", expr)
81 explicit operator bool()
const {
return error.empty(); }
143 double pos[3] = { 0, 0, 0 };
144 double quat[4] = { 0, 0, 0, 1 };
183 double pos[3] = { 0, 0, 0 };
184 double quat[4] = { 0, 0, 0, 1 };
256 double size[3] = { NAN, NAN, NAN };
257 double pos[3] = { 0.0, 0.0, 0.0 };
258 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
259 float rgba[4] = { NAN, NAN, NAN, NAN };
280 double pos[3] = { 0.0, 0.0, 0.0 };
281 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
297 double pos[3] = { NAN, NAN, NAN };
298 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
401struct RobotInternals;
429 std::unique_ptr<RobotInternals>
_impl;
443 std::chrono::steady_clock::time_point
_tick_t{};
623 std::function<std::pair<mjModel *, mjData *>(mjModel *, mjData *)>
adopt;
630 std::unique_ptr<EnvInternals>
_impl;
661 const char *base_body,
662 const char *tip_body,
663 const char *prefix =
"",
686 const std::vector<std::string> &joint_names,
687 const char *prefix =
"",
779 const float rgba[4] =
nullptr
801 const float rgba[4] =
nullptr
833 const char *out_path,
854 const char *out_path,
1054 const char *body_name,
1055 const double pos[3],
1056 const double *quat =
nullptr
1105 const std::array<double, 3> &lookat
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
void set_body_pose(Env *env, const char *body_name, const double pos[3], const double *quat=nullptr)
Status init_env(Env *env, const SceneSpec *spec)
void set_log_level(LogLevel level)
Status init_offscreen(VideoRecorder *vr, mjModel *model, int width, int height)
Status init_video_recorder(VideoRecorder *vr, mjModel *model, const char *out_path, int width=1280, int height=720, int fps=60)
bool record_frame(VideoRecorder *vr, Env *env)
bool render_rgb(VideoRecorder *vr, Env *env, std::uint8_t *out)
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)
std::vector< double > joint_force_limits(const Robot *r, double fallback=1e6)
void set_joint_pos(Robot *r, const KDL::JntArray &q)
Status init_robot_from_chain(Robot *r, Env *env, const KDL::Chain &chain, const std::vector< std::string > &joint_names, const char *prefix="", const ToolFrameSpec *tool=nullptr)
bool get_body_frame(Env *env, const char *body_name, KDL::Frame *out)
Status build_scene(mjModel **out_model, mjData **out_data, const SceneSpec *spec)
Status scene_remove_object(Env *env, const std::string &name)
SceneWrenchSlot * bind_scene_wrench(SceneState *s, const char *body_name)
bool get_site_frame(Env *env, const char *site_name, KDL::Frame *out)
void destroy_scene(mjModel *model, mjData *data)
SceneActuatorSlot * bind_scene_actuator(SceneState *s, const char *name)
Status scene_add_object(Env *env, const SceneObject &obj)
SceneFreeBodySlot * bind_scene_free_body(SceneState *s, const char *body_name)
Status save_model_xml(const mjModel *model, const char *path)
SceneJointSlot * bind_scene_joint(SceneState *s, const char *joint_name)
Status open_viewer(Env *env, const char *title="MuJoCo")
void capture_key(Viewer *v, int glfw_key, bool capture=true)
bool use_camera(Viewer *v, const mjModel *model, const char *name)
void pace_realtime(Env *env)
void add_overlay_arrow(Viewer *v, const KDL::Vector &from, const KDL::Vector &dir, double length, const float rgba[4]=nullptr)
void clear_trace(Viewer *v)
bool key_pressed(const Viewer *v, int glfw_key)
void add_trace_segment(Viewer *v, const KDL::Vector &a, const KDL::Vector &b, const float rgba[4]=nullptr)
void set_free_camera(Viewer *v, double distance, double azimuth, double elevation, const std::array< double, 3 > &lookat)
bool is_running(const Viewer *v)
std::function< void(ResetContext *)> ResetHook
std::vector< CtrlModeSpec > modes
std::vector< std::pair< std::string, std::string > > contact_exclusions
std::vector< std::string > joints
std::function< std::pair< mjModel *, mjData * >(mjModel *, mjData *)> adopt
std::unique_ptr< EnvInternals > _impl
std::vector< Robot * > robots
Env & operator=(const Env &)=delete
std::string torque_sensor
std::string torque_sensor
const ResetOptions * options
std::vector< double > jnt_vel_cmd
std::vector< double > jnt_trq_msr
std::vector< double > jnt_pos_cmd
std::vector< double > jnt_vel_msr
std::vector< double > jnt_pos_msr
std::vector< uint8_t > jnt_saturated
std::vector< double > jnt_trq_cmd
std::vector< AttachmentSpec > attachments
std::vector< CtrlModeSpec > modes
std::vector< ForceTorqueSensor > ft_sensors
Robot & operator=(const Robot &)=delete
std::unique_ptr< RobotInternals > _impl
std::vector< std::pair< double, double > > joint_limits
std::vector< std::string > joint_names
Robot(const Robot &)=delete
std::vector< RobotSpec > robots
std::vector< SceneObject > objects
std::vector< SiteSpec > sites
std::vector< CameraSpec > cameras
std::deque< SceneJointSlot > joints
std::deque< SceneWrenchSlot > wrenches
std::deque< SceneFreeBodySlot > free_bodies
std::deque< SceneActuatorSlot > actuators
std::chrono::steady_clock::time_point _tick_t