#rapier #urdf #bevy #robotics

bevy_urdf

Import robots from URDF files and run simulation with rapier

4 releases

0.0.4 Mar 23, 2025
0.0.3 Mar 22, 2025
0.0.2 Mar 22, 2025
0.0.1 Mar 21, 2025

#451 in Game dev

Download history 326/week @ 2025-03-19

326 downloads per month

MIT/Apache

7.5MB
456 lines

bevy_urdf

Import robots from URDF files and run simulation with rapier.

API

  1. Add Urdf and Stl plugins to bevy app
UrdfPlugin,
StlPlugin,
  1. Load robot in your startup systems

fn setup(mut ew_load_robot: EventWriter<LoadRobot>,) {
...
ew_load_robot.send(LoadRobot {
    urdf_path: "robots/flamingo_edu/urdf/Edu_v4.urdf".to_string(),
    mesh_dir: "assets/robots/flamingo_edu/urdf".to_string(),
});
...
}
  1. Subscribe to loaded event and emit spawn event
fn start_simulation(
    mut er_robot_loaded: EventReader<RobotLoaded>,
    mut ew_spawn_robot: EventWriter<SpawnRobot>,
    mut state: ResMut<NextState<AppState>>,
) {
    for event in er_robot_loaded.read() {
        ew_spawn_robot.send(SpawnRobot {
            handle: event.handle.clone(),
            mesh_dir: event.mesh_dir.clone(),
        });
        state.set(AppState::Simulation);
    }
}

Events

Read sensors and control motors through events:


#[derive(Event)]
pub struct SensorsRead {
    pub handle: Handle<UrdfAsset>,
    pub transforms: Vec<Transform>,
    pub joint_angles: Vec<f32>,
}

#[derive(Event)]
pub struct ControlMotors {
    pub handle: Handle<UrdfAsset>,
    pub velocities: Vec<f32>,
}

Limitations

You may need to hand-inspect urdf files to ensure mesh links are relative to urdf file. package:// and links and gazebo nodes are not supported.

Dependencies

~64–100MB
~2M SLoC