7#include <mujoco/mujoco.h>
9#include <kdl/chain.hpp>
10#include <kdl/frames.hpp>
11#include <kdl/jntarray.hpp>
55#define MJ_FILENAME_ (::strrchr(__FILE__, '/') ? ::strrchr(__FILE__, '/') + 1 : __FILE__)
57#define MJ_LOG_(lvl_enum, color, label, expr) \
59 if (::mj_kdl::g_log_level >= ::mj_kdl::LogLevel::lvl_enum) { \
60 std::ostringstream _mj_oss; \
64 color "[mj_kdl " label "] %s:%d (%s): %s\033[0m\n", \
68 _mj_oss.str().c_str() \
73#define LOG_INFO(expr) MJ_LOG_(INFO, "", "INFO ", expr)
74#define LOG_WARN(expr) MJ_LOG_(WARN, "\033[33m", "WARN ", expr)
75#define LOG_ERROR(expr) MJ_LOG_(ERROR, "\033[31m", "ERROR", expr)
98 const char *
name =
nullptr;
114 double pos[3] = { 0, 0, 0 };
115 double quat[4] = { 0, 0, 0, 1 };
144 double pos[3] = { 0, 0, 0 };
145 double quat[4] = { 0, 0, 0, 1 };
204 double pos[3] = { 0.0, 0.0, 0.0 };
205 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
226 double pos[3] = { 0.0, 0.0, 0.0 };
227 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
244 double quat[4] = { 0.0, 0.0, 0.0, 1.0 };
296 KDL::Wrench
wrench = KDL::Wrench::Zero();
384 std::chrono::steady_clock::time_point
_tick_t{};
506 const char *base_body,
507 const char *tip_body,
508 const char *prefix =
"",
531 const KDL::Chain &chain,
532 const std::vector<std::string> &joint_names,
533 const char *prefix =
"",
632 const char *title =
"MuJoCo",
690 const KDL::Vector &a,
691 const KDL::Vector &b,
692 const float rgba[4] =
nullptr
711 const KDL::Vector &from,
712 const KDL::Vector &dir,
714 const float rgba[4] =
nullptr
756 const char *out_path,
777 const char *out_path,
1011 const char *body_name,
1012 const double pos[3],
1013 const double *quat =
nullptr
1089bool get_site_frame(
const mjModel *model, mjData *data,
const char *site_name, KDL::Frame *out);
1096bool get_body_frame(
const mjModel *model, mjData *data,
const char *body_name, KDL::Frame *out);
1138 const std::array<double, 3> &lookat
void add_skybox_to_spec(mjSpec *spec)
bool compile_and_make_data(mjSpec *spec, mjModel **out_model, mjData **out_data)
void add_objects_to_spec(mjSpec *spec, const std::vector< SceneObject > &objects)
void ensure_plugins_loaded()
void add_floor_to_spec(mjSpec *spec, double floor_z=0.0)
void env_add_robot(Env *env, Robot *robot)
ResetInfo reset(Env *env, const ResetOptions *options=nullptr)
bool init_env(Env *env, const SceneSpec *spec)
void set_log_level(LogLevel level)
bool render_rgb(VideoRecorder *vr, mjModel *model, mjData *data, std::uint8_t *out)
bool 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, mjModel *model, mjData *data)
bool init_offscreen(VideoRecorder *vr, mjModel *model, int width, int height)
void set_body_pose(mjModel *model, mjData *data, const char *body_name, const double pos[3], const double *quat=nullptr)
bool step_n(Robot *s, int n)
std::vector< double > joint_force_limits(const Robot *r, double fallback=1e6)
bool init_robot_from_chain(Robot *r, mjModel *model, mjData *data, const KDL::Chain &chain, const std::vector< std::string > &joint_names, const char *prefix="", const ToolFrameSpec *tool=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)
const ForceTorqueSensor * find_ft_sensor(const Robot *r, const char *name)
bool get_site_frame(const mjModel *model, mjData *data, const char *site_name, KDL::Frame *out)
bool get_body_frame(const mjModel *model, mjData *data, const char *body_name, KDL::Frame *out)
bool build_scene(mjModel **out_model, mjData **out_data, const SceneSpec *spec)
bool attach_to_spec(mjSpec *robot_spec, const AttachmentSpec *a)
bool scene_add_object(mjModel **model, mjData **data, SceneSpec *spec, const SceneObject &obj)
bool get_joint_position(const mjModel *model, mjData *data, const char *name, double *out)
bool scene_remove_object(mjModel **model, mjData **data, SceneSpec *spec, const std::string &name)
void destroy_scene(mjModel *model, mjData *data)
std::vector< std::string > get_camera_names(const mjModel *model)
bool save_model_xml(const mjModel *model, const char *path)
bool get_joint_velocity(const mjModel *model, mjData *data, const char *name, double *out)
void mark_kinematics_forgotten(const mjData *data)
std::string scene_object_site_name(const SceneObject &obj, const char *site_name)
void mark_kinematics_fresh(const mjData *data)
bool init_window_sim(Viewer *v, Robot *r, const char *title="MuJoCo")
void pace_realtime(Viewer *v, const mjModel *m)
void capture_key(Viewer *v, int glfw_key, bool capture=true)
bool use_camera(Viewer *v, const mjModel *model, const char *name)
double realtime_factor_of(const Viewer *v)
bool init_window(Viewer *v, Robot *r, const char *title="MuJoCo", int width=1280, int height=720)
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 render(Viewer *v, const Robot *r)
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)
bool is_running(const Viewer *v)
void mark_kinematics_stale()
std::function< void(ResetContext *)> ResetHook
void set_free_camera(Viewer *v, double distance, double azimuth, double elevation, const std::array< double, 3 > &lookat)
std::vector< std::pair< std::string, std::string > > contact_exclusions
std::vector< Robot * > robots
const char * force_sensor
const char * torque_sensor
std::string torque_sensor
const ResetOptions * options
std::vector< AttachmentSpec > attachments
std::vector< ForceTorqueSensor > ft_sensors
std::vector< int > kdl_to_mj_ctrl
std::vector< int > kdl_to_mj_qpos
std::vector< int > kdl_to_mj_dof
std::vector< double > jnt_pos_msr
std::vector< double > jnt_pos_cmd
std::vector< std::pair< double, double > > joint_limits
std::vector< double > jnt_vel_msr
std::vector< double > jnt_trq_cmd
std::vector< double > jnt_trq_msr
std::vector< std::string > joint_names
std::vector< RobotSpec > robots
std::vector< SceneObject > objects
std::vector< SiteSpec > sites
std::vector< CameraSpec > cameras
std::chrono::steady_clock::time_point _tick_t