Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stillonearth/bevy_mujoco
Render MuJoCo scenes in bevy
https://github.com/stillonearth/bevy_mujoco
bevy mujoco
Last synced: about 1 month ago
JSON representation
Render MuJoCo scenes in bevy
- Host: GitHub
- URL: https://github.com/stillonearth/bevy_mujoco
- Owner: stillonearth
- License: other
- Created: 2022-11-02T11:47:49.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-08-26T09:01:47.000Z (4 months ago)
- Last Synced: 2024-10-06T12:02:25.241Z (3 months ago)
- Topics: bevy, mujoco
- Language: Rust
- Homepage:
- Size: 278 KB
- Stars: 15
- Watchers: 2
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Bevy MuJoCo
[![Crates.io](https://img.shields.io/crates/v/bevy_mujoco.svg)](https://crates.io/crates/bevy_mujoco)
[![MIT/Apache 2.0](https://img.shields.io/badge/license-MIT%2FApache-blue.svg)](https://github.com/bevyengine/bevy#license)
[![Crates.io](https://img.shields.io/crates/d/bevy_mujoco.svg)](https://crates.io/crates/bevy_mujoco)
[![Rust](https://github.com/stillonearth/bevy_mujoco/workflows/CI/badge.svg)](https://github.com/stillonearth/bevy_mujoco/actions)https://user-images.githubusercontent.com/97428129/210613348-82a5e59d-96af-42a9-a94a-c47093eb8297.mp4
Import MJCF files into Bevy and run simulations with MuJoCo.
## Implementation Notes
MuJoCo has 2 modes with different coordinate systems for bodies
1. `paused` mode where all translations and rotations are extracted from `mj_Model` in `MuJoCo-Rust` as `body.pos`, `body.quat` in parent's body coordinate system. To make them work nice with bevy the body structure from mujoco has to be transformed to a tree structure with `body_tree()` call. Then `body_tree` is spawned into the bevy world recursively — a nice contraption to do it in `setup_mujoco`.
2. `simulation` mode where translations are extracted from `sim.xpos()` and `sim.xquat()` — and this time they are in global frame. Since bodies are spawned hierarchically translations and rotations need to be converted to a parent coordinate system — it happens in `simulate_physics`.
## Getting Started
### MuJoCo Dependency
- `MuJoCo` 2.3.5 installed in `~/.local/mujoco` for Linux or `C:/Program Files/Mujoco` for Windows
- _nightly_ Rust. Compile with `cargo +nightly build`### Usage
```rust
// 1. Import bevy_mujoco
use bevy_mujoco::*;
// 2. Setup bevy_mujoco Plugin. MuJoCo Plugin would spawn entities to the world
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.insert_resource(MuJoCoPluginSettings {
model_xml_path: "assets/unitree_a1/scene.xml".to_string(),
pause_simulation: false,
target_fps: 600.0, // this is not actual fps (bug in bevy_mujoco),
// the bigger the value, the slower the simulation
})
.add_plugins(MuJoCoPlugin)
.add_systems(Startup, setup)
.add_systems(Update, robot_control_loop)
.run();
}
// 3. You can control your robots here
fn robot_control_loop(mut mujoco_resources: ResMut) {
// prepare simulation data for the NN
let qpos = mujoco_resources.state.qpos.clone();
let qvel = mujoco_resources.state.qvel.clone();
let cfrc_ext = mujoco_resources.state.cfrc_ext.clone();// Compute input -> control values here and fill control
// ...
let mut control: Vec = Vec::new();mujoco_resources.control.data = input_vec;
}
```**copy build.rs to root of your project to use in with Windows environments. it will copy mujoco.dll to a build dir of your application**
To run tests and example initialize [`mujoco_menagerie`](https://github.com/deepmind/mujoco_menagerie) submobule with
```bash
cd bevy_mujoco
git submodule init
git submodule update
```See [example](https://github.com/stillonearth/bevy_quadruped_neural_control) for simulating Unitree A1 robot.