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 |
Screenshot 1 Screenshot 2 Front view Side view
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 |
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
# 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.
sudo apt update sudo apt install \ ros-humble-robot-state-publisher \ ros-humble-joint-state-publisher-gui \ ros-humble-rviz2 \ ros-humble-xacro
# 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
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.
sudo apt install ros-humble-ros-gz-sim ros-humble-ros-gz-bridge
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
ACTUATORSsection inmujoco/wheel_legged_biped.xmlfor torque interface details.
All 10 actuators are motor (torque) type — ctrl[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)
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) |
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
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 |
|---|---|
| Opeoluwa Emmanuel Owodolu | |
| vesto_n_ | |
| Twitter / X | vestodesign |
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} }