---json
{"name": "RViz simulation"}
---
====== RViz simulation ======
{{indexmenu_n>30}}
Run a simulated Marty V2 in ROS 2 and display it in RViz. Joint sliders or ROS topic commands set the pose; MuJoCo computes the joint feedback and floating base position. No physical Marty connection is needed.
===== Build =====
Use Ubuntu 24.04, ROS 2 Jazzy, Python 3.12 and Bash. Complete the **Install and build** and **Machine configuration** sections of [[:martyv2:ros2:getting_started|Install and connect]]. Robot connection configuration and driver launch are not needed for this simulation.
From the repository root:
source scripts/setup_env.sh
python -m pip install -r requirements-simulation.txt
rosdep install --from-paths src --ignore-src -r -y
python "$(command -v colcon)" build --base-paths src --symlink-install
source scripts/setup_env.sh
''marty2_description'' contains the URDF and meshes; ''marty_simulation'' contains the MuJoCo bridge and RViz setup. Avoid a second package named ''marty2_description'' in the same workspace.
===== Open RViz and joint controls =====
ros2 launch marty_simulation simulation.launch.py
RViz opens with Marty and a ground grid. Move the sliders in **Joint State Publisher** to change the simulated pose. Nine independent joints drive eleven mimic joints, including the opposite eyebrow and the arm gears.
The launch starts only the simulation, joint controls, robot-state publisher and RViz. It does not start the physical driver. Ctrl+C in the launch terminal closes them.
===== Send a pose from the console =====
Stop the previous launch with Ctrl+C, then restart with the sliders disabled so they do not replace console commands:
ros2 launch marty_simulation simulation.launch.py gui:=false
In another terminal, from the repository root:
source scripts/setup_env.sh
ros2 topic pub --once /marty_sim/joint_commands sensor_msgs/msg/JointState \
'{name: [eye_left_joint, arm_servo_gear_left_joint, arm_servo_gear_right_joint], position: [-0.5, 0.7, 0.7]}'
ros2 topic echo /marty_sim/joint_states --once
The command changes the eyebrows and both arms. Positions are radians. Partial commands retain the other targets. Unknown joints, duplicate names, non-finite values and targets outside the actuator limits are rejected.
===== ROS graph =====
joint controls / console
|
v
/marty_sim/joint_commands
|
v
/marty_sim/marty_simulation (MuJoCo)
| |
v v
/marty_sim/joint_states floating-base TF
| |
v |
/marty_sim/robot_state_publisher |
| |
+----------> /tf <--------+
|
v
RViz
^ Topic ^ Type ^ Purpose ^
| ''/marty_sim/joint_commands'' | ''sensor_msgs/msg/JointState'' | Target positions for the nine independent joints. |
| ''/marty_sim/joint_states'' | ''sensor_msgs/msg/JointState'' | Simulated positions and velocities, published at approximately 50 Hz. |
| ''/marty_sim/robot_description'' | ''std_msgs/msg/String'' | URDF geometry used by RViz and joint controls. |
| ''/tf'' and ''/tf_static'' | ''tf2_msgs/msg/TFMessage'' | Link transforms and the floating base pose. |
Inspect the running setup with:
ros2 node list
ros2 node info /marty_sim/marty_simulation
ros2 topic list -t
===== Simulation modes =====
The default ''mode:=stabilized'' uses height/tilt assistance and estimated joint damping to keep the model stable. ''mode:=free'' removes those aids:
ros2 launch marty_simulation simulation.launch.py mode:=free
The URDF, meshes and generated MuJoCo model come from the Marty URDF simulator. Contact, actuator and mass calibration is incomplete; physical motion accuracy and free walking are not validated. This setup accepts joint targets, rather than the physical driver's firmware ''Motion'' action.
For a headless run, add ''gui:=false rviz:=false''. [[https://github.com/robotical/marty-ros2/blob/main/docs/simulation.md|Simulation reference]] includes model provenance and timing details.