Crates.io | bevy_mujoco |
lib.rs | bevy_mujoco |
version | 0.14.0 |
source | src |
created_at | 2022-12-26 13:50:13.849807 |
updated_at | 2024-07-05 22:14:48.589262 |
description | Use MuJoCo physics and MCJF / URDF scenes in bevy |
homepage | |
repository | https://github.com/stillonearth/bevy_mujoco |
max_upload_size | |
id | 745776 |
size | 147,270 |
Import MJCF files into Bevy and run simulations with MuJoCo.
MuJoCo has 2 modes with different coordinate systems for bodies
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
.
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
.
MuJoCo
2.3.5 installed in ~/.local/mujoco
for Linux or C:/Program Files/Mujoco
for Windowscargo +nightly build
// 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<MuJoCoResources>) {
// 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<f32> = 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
submobule with
cd bevy_mujoco
git submodule init
git submodule update
See example for simulating Unitree A1 robot.