Skip to content

Navigation Menu

Sign in
Sign up

Latest commit

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Wheel-Legged Biped Robot — 10-DoF (MuJoCo + ROS 2 URDF)

10-DoF bipedal robot with wheel-drive — MuJoCo MJCF + ROS 2 URDF (RViz2 & Gazebo Ignition)

Author OWODOLU Opeoluwa Emmanuel
Institution Mechatronics Engineering — Afe Babalola University, Nigeria
Contact owodoluope@gmail.com
License Custom — see LICENSE. Contact author for publication or commercial use.
Blog tr.ee/n4UZj4

Screenshots

Screenshot 1 Screenshot 2 Front view Side view


Overview

The Wheel-Legged Biped Robot is a 10-DoF biped with motorised wheels at the feet — combining the dynamic balance of legged robots with the efficiency of wheeled locomotion.

Per-leg joints (5 ×ばつ 2 = 10 DoF):

Index Joint Range Role
0 / 5 hip_pitch ±45° Fore-aft leg angle
1 / 6 hip_roll ±30° Lateral lean
2 / 7 thigh_rotate ±180° Axial thigh rotation
3 / 8 knee_pitch ±120° Knee extension / flexion
4 / 9 wheel_drive continuous Wheel torque / speed

Robot specifications:

Parameter Value
Total mass ≈ 4.3 kg
Standing height 0.55 m
Hip width 90 mm (centre-to-centre)
Wheel radius 81 mm
Max leg torque 50 Nm
Max wheel torque 20 Nm

Repository Structure

wheel-legged-biped-robot/
├── mujoco/
│ └── wheel_legged_biped.xml MuJoCo MJCF model (standalone, no RL code)
├── urdf/
│ └── wheel_legged_biped.urdf ROS 2 URDF (RViz + Gazebo compatible)
├── meshes/
│ └── *.STL 13 STL mesh files (SolidWorks export)
├── launch/
│ ├── display.launch.py RViz2 visualisation with joint sliders
│ └── gazebo.launch.py Gazebo Ignition (gz sim) spawn
├── rviz/
│ └── wheel_legged_biped.rviz Pre-configured RViz2 layout
├── config/
│ └── joint_state_publisher.yaml Default standing pose for sliders
├── media/ Screenshots
├── LICENSE
└── README.md

Quick Start

1 — MuJoCo (standalone, no ROS needed)

# Install MuJoCo Python bindings
pip install mujoco
# Open the interactive viewer
python3 -c "
import mujoco, mujoco.viewer
m = mujoco.MjModel.from_xml_path('mujoco/wheel_legged_biped.xml')
d = mujoco.MjData(m)
mujoco.mj_resetDataKeyframe(m, d, 0) # load 'stand' keyframe
with mujoco.viewer.launch_passive(m, d) as v:
 while v.is_running():
 mujoco.mj_step(m, d)
 v.sync()
"

The robot opens in the standing pose. You can use the MuJoCo GUI to inspect bodies, joints, and sensor values interactively.


2 — RViz2 (ROS 2 Humble)

2.1 — Dependencies

sudo apt update
sudo apt install \
 ros-humble-robot-state-publisher \
 ros-humble-joint-state-publisher-gui \
 ros-humble-rviz2 \
 ros-humble-xacro

2.2 — Build the package

# Clone into your ROS 2 workspace
cd ~/ros2_ws/src
git clone git@github.com:Vesto-Design/wheel-legged-biped-robot.git
# Build
cd ~/ros2_ws
colcon build --packages-select wheel_legged_biped_description
source install/setup.bash

2.3 — Launch RViz2

ros2 launch wheel_legged_biped_description display.launch.py

A Joint State Publisher GUI window opens with sliders for all 10 joints. Move them to pose the robot interactively in RViz2.


3 — Gazebo Ignition (ROS 2 Humble)

3.1 — Install Gazebo Ignition

sudo apt install ros-humble-ros-gz-sim ros-humble-ros-gz-bridge

3.2 — Spawn the robot

ros2 launch wheel_legged_biped_description gazebo.launch.py

Open RViz2 at the same time:

ros2 launch wheel_legged_biped_description gazebo.launch.py launch_rviz:=true

Note: Gazebo provides passive physics (the robot will fall without a balance controller). Implementing a balance controller (LQR or RL) is left to the user. See the ACTUATORS section in mujoco/wheel_legged_biped.xml for torque interface details.


MuJoCo Model Notes

Actuator interface

All 10 actuators are motor (torque) typectrl[i] = torque in Nm:

import mujoco, numpy as np
m = mujoco.MjModel.from_xml_path('mujoco/wheel_legged_biped.xml')
d = mujoco.MjData(m)
mujoco.mj_resetDataKeyframe(m, d, 0)
# Example: hold standing pose with simple PD
LEG_STAND = np.array([-0.285, 0, 0, 0.57, -0.285, 0, 0, 0.57])
LEG_IDX = np.array([0, 1, 2, 3, 5, 6, 7, 8]) # skip wheel joints 4, 9
KP, KD = 150.0, 5.0
for _ in range(1000):
 q = d.qpos[7 + LEG_IDX]
 qd = d.qvel[6 + LEG_IDX]
 d.ctrl[LEG_IDX] = KP * (LEG_STAND - q) - KD * qd
 mujoco.mj_step(m, d)

Sensor layout

sensordata index Content
0 – 9 Joint positions (left 0-4, right 5-9)
10 – 19 Joint velocities (same order)
20 – 23 IMU quaternion (w x y z)
24 – 26 IMU gyroscope (rad/s)
27 – 29 IMU accelerometer (m/s2)
30 – 32 IMU linear velocity (m/s)

Standing keyframe

qpos[0:3] = (0, 0, 0.546) base position
qpos[3:7] = (1, 0, 0, 0) quaternion (upright)
qpos[7:12] = (-0.285, 0, 0, 0.570, 0) left leg
qpos[12:17] = (-0.285, 0, 0, 0.570, 0) right leg

License & Attribution

This work is released under a custom license — please read LICENSE carefully.

  • Personal / educational use: free, with attribution.
  • Social media posts: you must tag the author.
  • Publications or commercial use: contact owodoluope@gmail.com before use.

Tag the author on social media:

Platform Handle
LinkedIn Opeoluwa Emmanuel Owodolu
Instagram vesto_n_
Twitter / X vestodesign

Citation

If you use this model in academic work (after obtaining permission), please cite:

@misc{wl_biped_2025,
 author = {Owodolu, Opeoluwa Emmanuel},
 title = {Wheel-Legged Biped Robot (10-DoF): Design, Simulation and Control},
 year = {2025},
 institution = {Mechatronics Engineering, Afe Babalola University},
 note = {Contact owodoluope@gmail.com for permission prior to citation}
}

AltStyle によって変換されたページ (->オリジナル) /