dora-mujoco
A MuJoCo physics simulation node for the Dora dataflow framework. This node provides real-time physics simulation with support for a wide range of robots from the robot_descriptions package, as well as custom robot models. Designed for modular robotics control architectures.
Features
- Wide Robot Support: Built-in support for 50+ robot models including quadrupeds, humanoids, arms, drones, and more
- Flexible Model Loading: Load robots by name (via robot_descriptions) or direct XML file paths
- Real-time Simulation: Continuous physics simulation with configurable tick rates
- Live Visualization: Optional MuJoCo viewer for real-time 3D visualization
- Generic Control Interface: Accepts control commands for any robot type
- Rich Data Output: Joint positions, velocities, accelerations, and sensor data
Supported Robot Categories
| Category | Examples |
|---|---|
| Quadrupeds | Unitree Go1/Go2/A1, ANYmal B/C, Boston Dynamics Spot |
| Humanoids | Unitree G1/H1, Apptronik Apollo, TALOS, JVRC-1 |
| Arms | Franka Panda, KUKA iiwa14, Universal Robots UR5e/UR10e |
| Dual Arms | Aloha 2, Baxter, YuMi |
| End Effectors | Allegro Hand, Shadow Hand, Robotiq 2F-85 |
| Drones | Crazyflie 2.0, Skydio X2 |
| Educational | Double Pendulum |
Getting Started
Quick Start
- Run a simple simulation:
dora build demo.yml
# Start with Unitree Go2 quadruped
dora run demo.yml
- Use different robots:
# In main.py, modify the model name (line ~95)
model_path_or_name = "franka_panda" # Change this line
# Examples: "go2", "franka_panda", "g1", "spot", etc.
- Use custom robot models:
# In main.py, use file path instead of model name
model_path_or_name = "/path/to/my_robot/scene.xml"
Usage Examples
TODO
Available Robot Models
The simulator supports all models from the robot_descriptions package. Common names include:
- Quadrupeds:
go1,go2,a1,aliengo,anymal_b,anymal_c,spot - Humanoids:
g1,h1,apollo,talos,jvrc,cassie - Arms:
panda,ur5e,ur10e,iiwa14,gen3,sawyer - Hands:
allegro_hand,shadow_hand,leap_hand,robotiq_2f85
See robot_models.json for the complete list.
Architecture
The dora-mujoco node is designed to be robot-agnostic and work with robot-specific controllers:
┌─────────────────┐
│ Command Node │ target_pose/cmd_vel
│ (Gamepad, etc) │─────────────┐
└─────────────────┘ │
▼
┌─────────────────┐ control_input ┌─────────────────┐
│ Robot Controller│───────────────────▶│ dora-mujoco │
│ (Franka, Husky) │ │ │
└─────────────────┘ │ ┌─────────────┐ │ joint_positions
▲ │ │ Simulator │ │──────────────────▶
│ joint_positions │ │ │ │ joint_velocities
└───────────────────────────│ │ ┌────────┐ │ │──────────────────▶
│ │ │Renderer│ │ │ actuator_controls
│ │ └────────┘ │ │──────────────────▶
│ │ │ │ sensor_data
│ └─────────────┘ │──────────────────▶
└─────────────────┘
the control nodes are optional (the robot will still spawn without them)
YAML Specification
Node Configuration
nodes:
- id: mujoco_sim
build: pip install -e .
path: dora-mujoco
env:
MODEL_NAME: "go2" # Robot model name or file path
inputs:
TICK: dora/timer/millis/2 # Simulation tick rate (500Hz)
outputs:
- joint_positions # Joint position array
- joint_velocities # Joint velocity array
- sensor_data # Sensor readings array
Input Specification
| Input | Type | Description |
|---|---|---|
tick |
Timer | Triggers simulation steps and data output |
control_input |
pa.array(float64) |
Control commands for actuators |
Control Input Format:
- Manipulator Arms: Joint position commands
[q1, q2, ..., q7, gripper] - Mobile Robots: Wheel velocity commands
[wheel1, wheel2, wheel3, wheel4] - Quadrupeds: Joint position commands
[hip1, thigh1, calf1, ...]
Output Specification
| Output | Type | Description | Metadata |
|---|---|---|---|
joint_positions |
pa.array(float64) |
Joint positions (qpos) | timestamp |
joint_velocities |
pa.array(float64) |
Joint velocities (qvel) | timestamp |
actuator_controls |
pa.array(float64) |
Current actuator commands | timestamp |
sensor_data |
pa.array(float64) |
Sensor readings (if available) | timestamp |
Configuration Options
Environment Variables
MODEL_NAME: Robot model name or XML file path (default: "go2")
Custom Robot Models
# Use direct XML file path
env:
MODEL_NAME: "/path/to/my_robot/scene.xml"
Simulation Parameters
- Physics Timestep: Fixed at MuJoCo default (0.002s = 500Hz)
- Output Rate: Controlled by
tickinput frequency - Control Rate: Determined by
control_inputfrequency
Development
Code Quality
# Format code
uv run ruff check . --fix
# Lint code
uv run ruff check .
# Run tests
uv pip install pytest
uv run pytest .
Adding New Models
To add support for new robot models:
- Add the model mapping to
robot_models.json:
{
"category_name": {
"my_robot": "my_robot_mj_description"
}
}
- Ensure the model is available in
robot_descriptionsor provide the XML file path directly.
Creating Robot Controllers
Robot-specific controllers should:
- Subscribe to
joint_positionsfrom the simulation - Implement robot-specific control logic (IK, dynamics, etc.)
- Publish
control_inputcommands to the simulation
Troubleshooting
Common Issues
-
Model not found:
ERROR: Model file not found for my_robot- Check if the model name exists in
robot_models.json - Verify
robot_descriptionshas the model installed - Use absolute file path for custom models
- Check if the model name exists in
-
Scene variant missing:
WARNING: Failed to load scene variant- Normal behavior - falls back to robot-only model
- Scene variants include ground plane and lighting
-
Control dimension mismatch:
WARNING: Control input size doesn't match actuators- Check that control commands match the robot's actuator count
- Use
print(model.nu)to see expected control dimensions
-
Viewer issues:
- Ensure proper OpenGL/graphics drivers
- Use headless mode for server environments
Examples
Complete working examples are available in:
dora/examples/mujoco-sim/- Target pose control with Cartesian space control
- Gamepad control with real-time interaction
License
This project is released under the MIT License. See the LICENSE file for details.
Contributing
Contributions are welcome! Please:
- Follow the existing code style (ruff formatting)
- Add tests for new features
- Update documentation as needed
- Submit pull requests with clear descriptions
Related Projects
- Dora-rs - The dataflow framework
- MuJoCo - Physics simulation engine
- robot_descriptions - Robot model collection
Metadata
Release files for dora-mujoco 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| dora_mujoco-0.1.0.tar.gz | 7.3 kB | Without provenance | Details for dora_mujoco-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| dora_mujoco-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for dora_mujoco-0.1.0-py3-none-any.whl |
Total release size: 14.8 kB
Release files / dora_mujoco-0.1.0.tar.gz
| Download URL | dora_mujoco-0.1.0.tar.gz |
|---|---|
| Size | 7.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
53a26e70a095966c877808555c640ff2ba74b82c610a900fd36c8c5fcc614c94
|
|
BLAKE2b-256 checksum How to use checksums |
a4538feda00708640bb89a26b5799974e7352b75acc14372a8e0fdf9478dea2c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.17
|
Release files / dora_mujoco-0.1.0-py3-none-any.whl
| Download URL | dora_mujoco-0.1.0-py3-none-any.whl |
|---|---|
| Size | 7.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
45b7dbcea6584a87b59c6ebfe46c9a3e68fb06eb0b5a236fc8b3154aea06c7bc
|
|
BLAKE2b-256 checksum How to use checksums |
eeb8c6c71f828765c5227720f494a55bd412054c8fc1f258460508da843c5e9d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.17
|
Security for dora-mujoco 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.