Active Spine Technology for Robotic Agility — an open-source 9.5 kg quadruped robot with a 3-DoF active spine, built as a B.Sc. thesis at TU München. Designed to be reproducible by hobbyists and labs for around €1 500, with full mechanical CAD, embedded firmware, and ROS 2 control stack.
The 2020s have seen quadrupeds like Unitree's Go2 (~€2 800) and Boston Dynamics' Spot (~€75 000) move from labs into the consumer/industrial market. But almost every commercial platform has a rigid torso. Biology disagrees: cheetahs, dogs and horses use their spine to extend stride, store elastic energy and rotate the body in flight.
ASTRA is a research platform built specifically to study active spines, with a parallel three-DoF spine that can be locked rigid (to baseline against rigid-torso behaviour) or driven actively. The full stack — CAD, firmware, ROS 2 nodes, MuJoCo sim — is released so anyone with a printer, a soldering iron and a ~€1.5k budget can rebuild it and run new control algorithms.
Biological inspiration: spine flexion/extension in a running cheetah.
| ASTRA | MIT Mini Cheetah | ANYmal | Spot | |
|---|---|---|---|---|
| Mass | 9.5 kg | 9.0 kg | 50 kg | 32.7 kg |
| Dimensions (l × w × h) | 565 × 287 × 435 mm | 480 × 270 × 300 | 930 × 530 × 890 | 1100 × 500 × 700 |
| Max speed | 4 cm/s¹ | 3.9 m/s | 1.3 m/s | 1.6 m/s |
| Autonomy | ~25 min | 30–120 min | 90 min | 90 min |
| Active-spine DoF | 3 | 0 | 0 | 0 |
| Total DoF | 15 (3 × 4 legs + 3 spine) | 12 | 12 | 12 |
| Estimated build cost | ~€1.5 k | — | — | — |
¹ With the current hard-coded open-loop trot. The mechanical platform is designed for >1 m/s once a proper MPC / learned controller is added.
The spine actively rotates so that either the front or the rear body stays horizontal on a slope — selected by a single flag in the controller.
Front body kept horizontal:
Rear body kept horizontal:
The trot controller running in the MuJoCo physics simulation. Every algorithm is validated here before being deployed to the physical robot.
Full-resolution MP4 versions of all three clips are also in
media/(and as downloadable assets on thedemos-v1release).
Hard-coded closed-loop quintic foot trajectory, diagonal pairs in phase, ~4 cm/s on the physical robot.
| Joint | Motor | Qty | Reduction |
|---|---|---|---|
| Hip & waist (per leg) | Damiao DM6006 | 8 | direct (1:1) |
| Knee (per leg) | Damiao DM6006 | 1 + belt | 1.5:1 belt → QDD |
| Spine (3 DoF) | Damiao DM4010 | 6 | direct |
15 motors total. All Damiao motors integrate the BLDC driver on-board and expose a CAN-FD interface accepting MIT-mode torque control (θ, ω, Kp, Kd, τff). No external ESCs.
┌─────────────────────────────┐
│ Raspberry Pi 5 (brain) │
│ ROS 2 Jazzy, Ubuntu │
└──────┬───────────────┬──────┘
USB │ │ USB
┌────────────▼───┐ ┌─────▼──────────┐
│ Front STM32H7 │ │ Rear STM32H7 │
│ (CAN bridge) │ │ (CAN bridge) │
└───┬────────┬───┘ └──┬───┬────┬────┘
FDCAN1│ FDCAN2│ FDCAN1│ 2 │ 3
┌───▼─┐ ┌──▼─┐ ┌──▼┐ │ │
│FR M │ │FL M│ │RR M│ │ └─ spine
└─────┘ └────┘ └────┘ └─ RL M
- Pi 5 acts as the brain — runs all ROS 2 nodes (non-real-time).
- 2 × STM32H723VG boards handle the real-time CAN-FD bus (one per body half). Pi → STM32 over USB, STM32 → motors over CAN-FD at 1 Mbit/s arbitration + 5 Mbit/s data.
- RoboMaster PDU distributes 24 V from a 6S LiPo battery to the motors; the Pi runs off a separate power bank so a kill-switch can cut motor power without shutting down the controller.
This split lets you swap the Pi for any other host with a USB port — the motor stack stays intact.
Left: full body. Right: parallel 3-DoF spine mechanism (pitch, roll, yaw via 2 actuators + universal joint).
- CFRP (carbon-fibre) frame and leg links — light, stiff, cheap to laser-cut.
- Tough PLA for the brackets and covers — printable on any consumer FDM printer.
- Steel link rods + universal joint for the spine.
- 1.5:1 toothed belt at the knee for the QDD reduction.
| Subsystem | Mass [kg] | % of total |
|---|---|---|
| Actuators (15 motors) | 4.95 | 52 % |
| Front body structure | 1.04 | 11 % |
| Rear body structure | 0.94 | 10 % |
| Electronics (Pi, STM32, PDU, battery, wiring) | 0.86 | 9 % |
| Spine assembly | 0.67 | 7 % |
| Legs (4 ×) | 1.12 | 12 % |
| Total | 9.5 | 100 % |
| Node | Role |
|---|---|
leg_command/ |
Low-level motor command publisher. Accepts "leg,joint,command" strings and produces the 14-byte USB → CAN-FD frames for any single Damiao motor. Lets you fire one motor at a time from ros2 topic pub — invaluable for hardware bring-up. |
mujoco_interface/ |
Bridges ROS 2 ↔ MuJoCo. Subscribes to actuator_goal_rad (15-vector of joint targets) and drives the simulated robot. Publishes a simulated imu_data topic. Supports both position and torque (PD) control modes. |
hardware_check/ |
Boot-time calibration helper. On startup zeroes every motor in MIT mode, then walks through the 5 legs (FR, FL, RR, RL, S) at 5-second intervals so you can hand-position each one at its mechanical zero. |
trot/ |
Hard-coded trot gait. Computes per-leg foot trajectories from a quintic smoothing function with configurable stride period, duty factor, swing height and phase offsets. Runs IK on each foot target to produce joint goals at 100 Hz, then publishes MIT commands at 33 Hz with a smooth gain ramp. |
spine_roll_inclined_plane/ |
Inclined-plane balance controller. Reads IMU pitch, then drives the spine and rear legs so that either the front or rear body stays horizontal — selected by a single flag. |
Live rqt_graph of the running system.
Two STM32CubeIDE projects (front_stm32/, rear_stm32/) for the STM32H723VG:
- 2–3 FDCAN peripherals per board, each connected to one motor bus.
- USB CDC for Pi communication. Every 14-byte USB packet is unpacked into a CAN frame and forwarded.
- Receive interrupt callback re-packages CAN replies (e.g. motor position/velocity feedback) into USB packets for the Pi.
The full MuJoCo simulation is shipped in the repo at ros2_ws/src/mujoco_interface/model/:
model.xml— main MuJoCo model of the whole robot (bodies, joints, actuators, sensors, IMU).quadruped_UJ_activated.xml— variant with the universal-joint spine activated, used for spine-control experiments.meshes/— 24 STL meshes for every body half, leg link (FR/FL/RR/RL × hip/femur/tibia) and spine part, exported directly from the Fusion 360 CAD so the visual + collision geometry matches the real hardware.
The mujoco_interface node runs the physics in-process, exposes the same ROS 2 topics as the real hardware (actuator_goal_rad for commands, imu_data for the simulated IMU), and lets you bring up any new controller against the simulator first.
Legs are indexed 1 = FR, 2 = FL, 3 = RR, 4 = RL, joints 1 = waist, 2 = hip, 3 = knee. Spine joints are 1 = front actuator, 2 = rear-left actuator, 3 = rear-right actuator (treated as "leg 5" in the codebase for uniformity).
The full mechanical assembly is shared on Fusion 360:
Live Fusion 360 model: https://a360.co/3KbGvEp
A neutral cad/ASTRA_quadruped.step (~20 MB) is included for any CAD tool. STL exports for the 3D-printed parts can be generated directly from the STEP/Fusion model.
Rough order of operations to reproduce ASTRA:
- Order the motors — 9 × Damiao DM6006 + 6 × Damiao DM4010 (the bulk of the budget).
- Cut the CFRP frame and leg parts from the STEP file. A local laser-cutting service is fine.
- 3D-print the Tough PLA brackets (see
99_3DPrintin the thesis appendix for print settings — Bambu Lab P1S / Prusa MK4 both tested). - Wire the electronics: 1 × Raspberry Pi 5, 2 × STM32H723VG dev boards, 2 × RoboMaster M3508 PDU, 1 × 6S LiPo (~5000 mAh), 1 × IMU.
- Flash the firmware: open
firmware/front_stm32/andfirmware/rear_stm32/in STM32CubeIDE and flash each board (set the appropriate STM32 in the IDE — STM32H723VG). - Set up the Pi: install ROS 2 Jazzy on Ubuntu 24.04,
colcon buildthe workspace inros2_ws/. - Bring-up: launch
hardware_checkto zero every joint, thenmujoco_interfaceto verify the model, thentrotto walk.
Detailed step-by-step is in Chapter 5 of the thesis.
spinal-quadruped/
├── README.md
├── LICENSE
├── .gitignore
├── docs/
│ ├── thesis_ASTRA_quadruped.pdf # Full B.Sc. thesis (62 pages + appendix)
│ └── images/ # Figures used in this README
├── cad/
│ └── ASTRA_quadruped.step # Neutral CAD export (20 MB)
├── firmware/
│ ├── front_stm32/ # STM32CubeIDE project, front body
│ └── rear_stm32/ # STM32CubeIDE project, rear body
├── ros2_ws/
│ └── src/
│ ├── leg_command/ # Low-level USB→CAN motor publisher
│ ├── mujoco_interface/ # ROS 2 ↔ MuJoCo bridge
│ ├── hardware_check/ # Boot-time joint zero / hold helper
│ ├── trot/ # Hard-coded trot gait + IK
│ └── spine_roll_inclined_plane/ # Inclined-plane balance controller
└── media/ # Real-hardware demo videos
Federico Cominelli — B.Sc. Mechanical Engineering, TU München, 2025.
Reach out via GitHub.
Supervised by Mr. Lingchong Gao (Chair of Materials Handling, Material Flow, Logistics — fml) and Mr. Liangyu Dong (Chair of Robotics, AI and Real-time Systems), under Prof. Dr.-Ing. Johannes Fottner, TU München School of Engineering and Design.
Submitted September 2025.
Released under the MIT License — see LICENSE. The Damiao motor headers and ST CubeMX-generated HAL drivers retain their original licenses. The MuJoCo headers bundled in ros2_ws/src/mujoco_interface/include/mujoco/ are © Google / DeepMind under the Apache 2.0 license.









