{"id":34674676,"url":"https://github.com/ros-controls/mujoco_ros2_control","last_synced_at":"2025-12-24T20:02:32.596Z","repository":{"id":325976664,"uuid":"1100760966","full_name":"ros-controls/mujoco_ros2_control","owner":"ros-controls","description":"Provides a ROS 2 control hardware interface for the MuJoCo physics simulator, including plugins for various sensors, RGB-D cameras, and lidar.","archived":false,"fork":false,"pushed_at":"2025-12-21T18:25:49.000Z","size":291,"stargazers_count":40,"open_issues_count":8,"forks_count":9,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-12-21T20:18:29.122Z","etag":null,"topics":["mujoco","robotics","ros-controls","ros2","simulation"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ros-controls.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-20T18:06:47.000Z","updated_at":"2025-12-21T18:18:13.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ros-controls/mujoco_ros2_control","commit_stats":null,"previous_names":["ros-controls/mujoco_ros2_simulation"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ros-controls/mujoco_ros2_control","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-controls%2Fmujoco_ros2_control","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-controls%2Fmujoco_ros2_control/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-controls%2Fmujoco_ros2_control/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-controls%2Fmujoco_ros2_control/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ros-controls","download_url":"https://codeload.github.com/ros-controls/mujoco_ros2_control/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros-controls%2Fmujoco_ros2_control/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28007460,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-12-24T02:00:07.193Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["mujoco","robotics","ros-controls","ros2","simulation"],"created_at":"2025-12-24T20:01:39.272Z","updated_at":"2025-12-24T20:02:32.580Z","avatar_url":"https://github.com/ros-controls.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MuJoCo ros2_control Simulation\n\nThis package contains a ros2_control system interface for the [MuJoCo Simulator](https://mujoco.readthedocs.io/en/3.4.0/overview.html).\nIt was originally written for simulating robot hardware in NASA Johnson's [iMETRO facility](https://ntrs.nasa.gov/citations/20230015485).\n\nThe system interface wraps MuJoCo's [Simulate App](https://github.com/google-deepmind/mujoco/tree/3.4.0/simulate) to provide included functionality.\nBecause the app is not bundled as a library, we compile it directly from a local install of MuJoCo.\n\nParts of this library are also based on the MoveIt [mujoco_ros2_control](https://github.com/moveit/mujoco_ros2_control) package.\n\n## Installation\n\nThis interface has only been tested against ROS 2 jazzy and MuJoCo `3.4.0`.\nIt should also be compatible with kilted and rolling, but we do not actively maintain those.\nWe assume all required ROS dependencies have been installed either manually or with `rosdep`.\n\nFor configuring MuJoCo, the included [CMakeLists.txt](./CMakeLists.txt) will download and install the tarfile automatically.\nAs long as users have a good network connection there should not be an issue.\n\nHowever, a local install of MuJoCo can be used to build the application by setting the following environment variables,\n\n```bash\n# The tested version\nMUJOCO_VERSION=3.4.0\n\n# Wherever it was installed and extracted on your machine\nMUJOCO_INSTALL_DIR=/opt/mujoco/mujoco-3.4.0\n```\n\nFrom there the library can be compiled with `colcon build ...`, as normal.\n\n## URDF Model Conversion\n\nMujoco does not support the full feature set of xacro/URDFs in the ROS 2 ecosystem.\nAs such, users are required to convert any existing robot description files to an MJCF format.\nThis includes adding actuators, sensors, and cameras as needed to the MJCF XML.\n\nWe have built a *highly experimental tool to automate URDF conversion.\nFor more information refer to the [documentation](./docs/TOOLS.md).\n\n## Hardware Interface Setup\n\n### Plugin\n\nThis application is shipped as a ros2_control hardware interface, and can be configured as such.\nJust specify the plugin and point to a valid MJCF on launch:\n\n```xml\n  \u003cros2_control name=\"MujocoSystem\" type=\"system\"\u003e\n    \u003chardware\u003e\n      \u003cplugin\u003emujoco_ros2_control/MujocoSystemInterface\u003c/plugin\u003e\n      \u003cparam name=\"mujoco_model\"\u003e$(find my_description)/description/scene.xml\u003c/param\u003e\n\n      \u003c!--\n       Optional parameter to load the PIDs that can be used with the actuators loaded with the MuJoCo model.\n       The velocity actuator supports position mode with the PID gains, and the rest of the actuation models\n       support both position and velocity mode provided the corresponding PID gains. The gains should be in ROS\n       parameters format to be loaded by the control_toolbox::PidROS class.\n        --\u003e\n      \u003cparam name=\"pids_config_file\"\u003e$(find my_description)/config/pids.yaml\u003c/param\u003e\n\n      \u003c!--\n       Optional parameter to override the speed scaling parameters from the Simulate App window\n       and just attempt to run at whatever the desired rate is here. This allows users to run the simulation\n       faster than real time. For example, at 500% speed as set here. If this param is omitted or set to\n       a value \u003c0, then the simulation will run using the slowdown requested from the App.\n      --\u003e\n      \u003cparam name=\"sim_speed_factor\"\u003e5.0\u003c/param\u003e\n\n      \u003c!--\n        Optional parameter to use the keyframe from a provided file as the starting configuration. This is mutually exclusive with\n        the initial_value that can be used for state interfaces. This is intended to provide an alternative method to load an entire\n        mujoco model state from a configuration that was saved by clicking 'Copy state' in the simulate window, and pasted into a\n        config file. Expected use cases are to work on a specific part of an application that involves the environment being in a\n        very specific starting configuration. If this parameter is an empty string, it will be ignored.\n      --\u003e\n      \u003cparam name=\"override_start_position_file\"\u003e$(find my_description)/config/start_positions.xml\u003c/param\u003e\n\n      \u003c!--\n        Optional parameter to update the simulated camera's color and depth image publish rates. If no\n        parameter is set then all cameras will publish at 5 hz. Note that all cameras in the sim currently\n        publish at the same intervals.\n      --\u003e\n      \u003cparam name=\"camera_publish_rate\"\u003e6.0\u003c/param\u003e\n\n      \u003c!--\n        Optional parameter to update the simulated lidar sensor's scan message publish rates.\n        All lidar sensors in the simulation will be configured to publish these scan messages at the same rate.\n      --\u003e\n      \u003cparam name=\"lidar_publish_rate\"\u003e10.0\u003c/param\u003e\n\n      \u003c!--\n        The parameter headless can be used to choose whether to launch the MuJoCo simulator in headless mode or not.\n        By default, it is set to false\n      --\u003e\n      \u003cparam name=\"headless\"\u003efalse\u003c/param\u003e\n    \u003c/hardware\u003e\n  ...\n```\n\nDue to compatibility issues, we use a [slightly modified ROS 2 control node](./src/mujoco_ros2_control_node.cpp).\nIt is the same executable and parameters as the upstream, but requires updating the launchfile:\n\n```python\n    control_node = Node(\n        # Specify the control node from this package!\n        package=\"mujoco_ros2_control\",\n        executable=\"ros2_control_node\",\n        output=\"both\",\n        parameters=[\n            {\"use_sim_time\": True},\n            controller_parameters,\n        ],\n    )\n```\n\n\u003e [!NOTE]\n\u003e We can remove the the ROS 2 control node after the next ros2_control upstream release,\n\u003e as the simulation requires [this PR](https://github.com/ros-controls/ros2_control/pull/2654) to run.\n\u003e The hardware interface _should_ then be compatible with `humble`, `jazzy`, and `kilted`.\n\n### Joints\n\nJoints in the ros2_control interface are mapped to actuators defined in the MJCF.\nThe system supports different joint control modes based on the actuator type and available command interfaces.\n\nWe rely on MuJoCo's PD-level ctrl input for direct position, velocity, or effort control.\nFor velocity, motor, or custom actuators, a position or velocity PID is created if specified using ROS parameters to enable accurate control.\nIncompatible actuator-interface combinations trigger an error.\n\nRefer to Mujoco's [actuation model](https://mujoco.readthedocs.io/en/stable/computation/index.html#geactuation) for more information.\n\nOf note, only one type of MuJoCo actuator per-joint can be controllable at a time, and the type CANNOT be switched during runtime (i.e., switching from position to motor actuator is not supported).\nHowever, the active command interface can be switched dynamically, allowing control to shift between position, velocity, or effort as supported by the actuator type.\nUsers are required to manually adjust actuator types and command interfaces to ensure that they are compatible.\n\nFor example a position controlled joint on the mujoco\n\n```xml\n  \u003cactuator\u003e\n    \u003cposition joint=\"joint1\" name=\"joint1\" kp=\"25000\" dampratio=\"1.0\" ctrlrange=\"0.0 2.0\"/\u003e\n  \u003c/actuator\u003e\n```\n\nCould map to the following hardware interface:\n\n```xml\n  \u003cjoint name=\"joint1\"\u003e\n    \u003ccommand_interface name=\"position\"/\u003e\n    \u003c!-- Initial values for state interfaces can be specified, but default to 0 if they are not. --\u003e\n    \u003cstate_interface name=\"position\"\u003e\n      \u003cparam name=\"initial_value\"\u003e0.0\u003c/param\u003e\n    \u003c/state_interface\u003e\n    \u003cstate_interface name=\"velocity\"/\u003e\n    \u003cstate_interface name=\"effort\"/\u003e\n  \u003c/joint\u003e\n```\n\n**Supported modes between MuJoCo actuators and ros2_control command interfaces:**\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth rowspan=\"2\" style=\"border:none;\"\u003e\u003c/th\u003e\n      \u003cth style=\"border:none;\"\u003e\u003c/th\u003e\n      \u003cth colspan=\"3\" style=\"text-align:center;\"\u003eMuJoCo Actuators\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth style=\"border:none;\"\u003e\u003c/th\u003e\n      \u003cth\u003eposition\u003c/th\u003e\n      \u003cth\u003evelocity\u003c/th\u003e\n      \u003cth\u003emotor, general, etc \u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth rowspan=\"3\" style=\"text-align:center;\"\u003eros2 control\u003cbr\u003ecommand\u003cbr\u003einterfaces\u003c/th\u003e\n      \u003cth\u003eposition\u003c/th\u003e\n      \u003ctd style=\"background:#c6efce;\"\u003eNative support\u003c/td\u003e\n      \u003ctd style=\"background:#ffeb9c;\"\u003eSupported using PIDs\u003c/td\u003e\n      \u003ctd style=\"background:#ffeb9c;\"\u003eSupported using PIDs\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003evelocity\u003c/th\u003e\n      \u003ctd style=\"background:#ffc7ce;\"\u003eNot supported\u003c/td\u003e\n      \u003ctd style=\"background:#c6efce;\"\u003eNative support\u003c/td\u003e\n      \u003ctd style=\"background:#ffeb9c;\"\u003eSupported using PIDs\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003eeffort\u003c/th\u003e\n      \u003ctd style=\"background:#ffc7ce;\"\u003eNot supported\u003c/td\u003e\n      \u003ctd style=\"background:#ffc7ce;\"\u003eNot supported\u003c/td\u003e\n      \u003ctd style=\"background:#c6efce;\"\u003eNative support\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n\u003e [!NOTE]\n\u003e The `torque` and `force` command/state interfaces are semantically equivalent to `effort`, and map to the same underlying data in the sim.\n\nSwitching actuator/control types on the fly is an [open issue](#13).\n\n### Sensors\n\nThe hardware interfaces supports force-torque sensors (FTS) and inertial measurement units (IMUs).\nMujoco does not support modeling complete FTS and IMUs out of the box, so we combine supported MJCF constructs to map to a ros2_control sensor.\nThe types and other parameters can be specified in the ros2_control xacro, as noted below.\n\nFor FTS, we model the `force` and `torque` sensors individually in the MJFC.\nFor a sensor named `fts_sensor`, we suffix each entry accordingly as `fts_sensor_force` and `fts_sensor_torque`.\nFor example, in the MJCF,\n\n```xml\n  \u003csensor\u003e\n    \u003cforce name=\"fts_sensor_force\" site=\"ft_frame\"/\u003e\n    \u003ctorque name=\"fts_sensor_torque\" site=\"ft_frame\"/\u003e\n  \u003c/sensor\u003e\n```\n\nIn the corresponding ros2_control xacro, this becomes a single sensor:\n\n```xml\n  \u003csensor name=\"fts_sensor\"\u003e\n    \u003cparam name=\"mujoco_type\"\u003efts\u003c/param\u003e\n    \u003c!-- There is no requirement for the mujoco_sensor_name to match the ros2_control sensor name --\u003e\n    \u003cparam name=\"mujoco_sensor_name\"\u003efts_sensor\u003c/param\u003e\n    \u003c!-- Default value of force_mjcf_suffix is '_force' --\u003e\n    \u003cparam name=\"force_mjcf_suffix\"\u003e_force\u003c/param\u003e\n    \u003c!-- Default value of torque_mjcf_suffix is '_torque' --\u003e\n    \u003cparam name=\"torque_mjcf_suffix\"\u003e_torque\u003c/param\u003e\n    \u003cstate_interface name=\"force.x\"/\u003e\n    \u003cstate_interface name=\"force.y\"/\u003e\n    \u003cstate_interface name=\"force.z\"/\u003e\n    \u003cstate_interface name=\"torque.x\"/\u003e\n    \u003cstate_interface name=\"torque.y\"/\u003e\n    \u003cstate_interface name=\"torque.z\"/\u003e\n  \u003c/sensor\u003e\n```\n\nSimilarly, for an IMU, we simulate a `framequat`, `gyro`, and `accelerometer` as a single IMU.\n\n```xml\n  \u003csensor\u003e\n      \u003cframequat name=\"imu_sensor_quat\" objtype=\"site\" objname=\"imu_sensor\" /\u003e\n      \u003cgyro name=\"imu_sensor_gyro\" site=\"imu_sensor\" /\u003e\n      \u003caccelerometer name=\"imu_sensor_accel\" site=\"imu_sensor\" /\u003e\n  \u003c/sensor\u003e\n```\n\nWhich then map to the corresponding ros2_control sensor:\n\n```xml\n  \u003csensor name=\"imu_sensor\"\u003e\n    \u003cparam name=\"mujoco_type\"\u003eimu\u003c/param\u003e\n    \u003c!-- There is no requirement for the mujoco_sensor_name to match the ros2_control sensor name --\u003e\n    \u003cparam name=\"mujoco_sensor_name\"\u003eimu_sensor\u003c/param\u003e\n    \u003c!-- Default value of orientation_mjcf_suffix is '_quat' --\u003e\n    \u003cparam name=\"orientation_mjcf_suffix\"\u003e_quat\u003c/param\u003e\n    \u003c!-- Default value of angular_velocity_mjcf_suffix is '_gyro' --\u003e\n    \u003cparam name=\"angular_velocity_mjcf_suffix\"\u003e_gyro\u003c/param\u003e\n    \u003c!-- Default value of linear_acceleration_mjcf_suffix is '_accel' --\u003e\n    \u003cparam name=\"linear_acceleration_mjcf_suffix\"\u003e_accel\u003c/param\u003e\n    \u003cstate_interface name=\"orientation.x\"/\u003e\n    \u003cstate_interface name=\"orientation.y\"/\u003e\n    \u003cstate_interface name=\"orientation.z\"/\u003e\n    \u003cstate_interface name=\"orientation.w\"/\u003e\n    \u003cstate_interface name=\"angular_velocity.x\"/\u003e\n    \u003cstate_interface name=\"angular_velocity.y\"/\u003e\n    \u003cstate_interface name=\"angular_velocity.z\"/\u003e\n    \u003cstate_interface name=\"linear_acceleration.x\"/\u003e\n    \u003cstate_interface name=\"linear_acceleration.y\"/\u003e\n    \u003cstate_interface name=\"linear_acceleration.z\"/\u003e\n  \u003c/sensor\u003e\n```\n\nThese sensor state interfaces can then be used out of the box with the standard broadcasters.\n\n### Cameras\n\nAny `camera` included in the MJCF will automatically have its RGB-D images and info published to ROS topics.\nCurrently all images are published at a fixed 5hz rate.\n\nCameras must include a string `\u003cname\u003e`, which sets defaults for the frame and topic names.\nBy default, the ROS 2 wrapper assumes the camera is attached to a frame named `\u003cname\u003e_frame`.\nAdditionally camera_info, color, and depth images will be published to topics called `\u003cname\u003e/camera_info`, `\u003cname\u003e/color`, and `\u003cname\u003e/depth`, respectively.\nAlso note that MuJuCo's conventions for cameras are different than ROS's, and which must be accounted for.\nRefer to the documentation for more information.\n\nFor example,\n\n```xml\n\u003ccamera name=\"wrist_mounted_camera\" fovy=\"58\" mode=\"fixed\" resolution=\"640 480\" pos=\"0 0 0\" quat=\"0 0 0 1\"/\u003e\n```\n\nWill publish the following topics:\n\n```bash\n$ ros2 topic info /wrist_mounted_camera/camera_info\nType: sensor_msgs/msg/CameraInfo\n$ ros2 topic info /wrist_mounted_camera/color\nType: sensor_msgs/msg/Image\n$ ros2 topic info /wrist_mounted_camera/depth\nType: sensor_msgs/msg/Image\n```\n\nThe frame and topic names are also configurable from the ros2_control xacro.\nDefault parameters can be overridden with:\n\n```xml\n  \u003c!-- For cameras, the sensor name _must_ match the camera name in the MJCF --\u003e\n  \u003csensor name=\"wrist_mounted_camera\"\u003e\n    \u003cparam name=\"frame_name\"\u003ewrist_mounted_camera_mujoco_frame\u003c/param\u003e\n    \u003cparam name=\"info_topic\"\u003e/wrist_mounted_camera/color/camera_info\u003c/param\u003e\n    \u003cparam name=\"image_topic\"\u003e/wrist_mounted_camera/color/image_raw\u003c/param\u003e\n    \u003cparam name=\"depth_topic\"\u003e/wrist_mounted_camera/aligned_depth_to_color/image_raw\u003c/param\u003e\n  \u003c/sensor\u003e\n```\n\n### Lidar\n\nMuJoCo does not include native support for lidar sensors.\nHowever, this package offers a ROS 2-like lidar implementation by wrapping sets of [rangefinders](https://mujoco.readthedocs.io/en/stable/XMLreference.html#sensor-rangefinder) together.\n\nMuJoCo rangefinders measure the distance to the nearest surface along the positive `Z` axis of the sensor site.\nThe ROS 2 lidar wrapper uses the standard defined in [LaserScan](https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/LaserScan.msg#L10) messages.\nIn particular, the first rangefinder's `Z` axis (e.g. `rf-00`) must align with the ROS 2 lidar sensor's positive `X` axis.\n\nIn the MJCF, use the `replicate` tag along with a `-` separator to add N sites to attach sensors to.\nFor example, the following will add 12 sites named `rf-00` to `rf-11` each at a 0.025 radian offset from each other:\n\n```xml\n  \u003creplicate count=\"12\" sep=\"-\" offset=\"0 0 0\" euler=\"0 0.025 0\"\u003e\n    \u003csite name=\"rf\" size=\"0.01\" pos=\"0.0 0.0 0.0\" quat=\"0.0 0.0 0.0 1.0\"/\u003e\n  \u003c/replicate\u003e\n```\n\nThen a set of rangefinders can be attached to each site with:\n\n```xml\n  \u003csensor\u003e\n    \u003c!-- We require a sensor name be provided --\u003e\n    \u003crangefinder name=\"lidar\" site=\"rf\" /\u003e\n  \u003c/sensor\u003e\n```\n\nThe lidar sensor is then configurable through ROS 2 control xacro with:\n\n```xml\n    \u003c!-- Lidar sensors are matched to a set of rangefinder sensors in the MJCF, which should be --\u003e\n    \u003c!-- generated with \"replicate\" and will generally be of the form \"\u003csensor_name\u003e-01\". --\u003e\n    \u003c!-- We assume the lidar sensor starts at angle 0, increments by the specified `angle_increment`, and --\u003e\n    \u003c!-- that there are exactly `num_rangefinders` all named from \u003csensor_name\u003e-000 to the max --\u003e\n    \u003c!-- \u003csensor_name\u003e-\u003cnum_rangefinders\u003e --\u003e\n    \u003csensor name=\"lidar\"\u003e\n      \u003cparam name=\"frame_name\"\u003elidar_sensor_frame\u003c/param\u003e\n      \u003cparam name=\"angle_increment\"\u003e0.025\u003c/param\u003e\n      \u003cparam name=\"num_rangefinders\"\u003e12\u003c/param\u003e\n      \u003cparam name=\"range_min\"\u003e0.05\u003c/param\u003e\n      \u003cparam name=\"range_max\"\u003e10\u003c/param\u003e\n      \u003cparam name=\"laserscan_topic\"\u003e/scan\u003c/param\u003e\n    \u003c/sensor\u003e\n  \u003c/ros2_control\u003e\n```\n\n## Test Robot System\n\nWhile examples are limited, we maintain a functional example 2-dof robot system in the [test examples](./test/test_resources/test_robot.urdf) space.\nWe generally recommend looking there for examples and recommended workflows.\n\nFor now, built the drivers with testing enabled, then the test robot system can be launched with:\n\n```bash\n# Brings up the hardware drivers and mujoco interface, along with a single position controller\nros2 launch mujoco_ros2_control test_robot.launch.py\n\n# Or optionally include the PID controller as mentioned above\nros2 launch mujoco_ros2_control test_robot.launch.py use_pid:=true\n\n# Launch an rviz2 window with the provided configuration\nrviz2 -d $(ros2 pkg prefix --share mujoco_ros2_control)/config/test_robot.rviz\n```\n\nFrom there, command joints to move with,\n\n```bash\nros2 topic pub /position_controller/commands std_msgs/msg/Float64MultiArray \"data: [-0.25, 0.75]\" --once\n```\n\n\u003e [!TIP]\n\u003e UI panels can be toggled with `Tab` or `Shift+Tab`.\n\u003e All standard MuJoCo keyboard shortcuts are available.\n\u003e To see a short list, press `F1`.\n\n## Development\n\nMore information is provided in the [developers guide](./docs/DEVELOPMENT.md) document.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros-controls%2Fmujoco_ros2_control","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fros-controls%2Fmujoco_ros2_control","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros-controls%2Fmujoco_ros2_control/lists"}