Back to behaviors
Hardware claimedagility tricksv1.0.0Apache-2.0

Standing 6-DOF Body Pose Controller

Fine-grained torso orientation and height controller while standing, continuously mapping roll, pitch, yaw, and squat commands to compliant leg and neck adjustments.

By Tommy Zihao @TommyZihao

About this behavior

Developed for the community microduck_runtime port. Utilizes the full 6-dim body_pose command vector (tx, ty, tz, roll, pitch, yaw) in the standard 61-dim observation contract. Allows interactive puppeteering of the duck's stance height, torso tilt, and look-around angles without shifting foot contact locations.

Runtime contract

61-dimension input · 14 joint targets · 50 Hz

Show details
50 Hz / 4×slot: stand
Observation vector61 dimensions · normalizer baked in
Proprioception48D

Positions, velocities, previous actions, gravity, and gyro.

Twist command3D

Forward, lateral, and yaw velocity intent.

Head pose4D

Neck and head orientation targets.

Body pose6D

Six-axis torso offset command.

Action targetsscale: 1×
Left leg5 joints

hip yaw · hip roll · hip pitch · knee · ankle

Neck & head4 joints

neck pitch · head pitch · yaw · roll

Right leg5 joints

hip yaw · hip roll · hip pitch · knee · ankle

Actuator model: Dynamixel XL330 (BAM M6 voltage control law). The beak motor is separate from this fixed locomotion action space.

Verification

Status
Hardware claimed
Evidence
Reported running on Raspberry Pi microduck_runtime port controlling Dynamixel XL330 bus directly.
Target hardware
MicroDuck Raspberry Pi SBC / Dynamixel XL330
Simulation
mjlab (MuJoCo Warp) at 50 Hz
Note
Community policy. Tested on custom Raspberry Pi controller stack.

Compatibility

Robot model
microduck-standard
MJCF model
robot_allcollisions.xml
Terrain
flat
Required accessories
None — standard duck setup

Run it on your duck

Use the canonical model and this policy slot to try the behavior locally.

slot: stand
Try the simulation first. Hardware testing assumes a matching Microduck, clear space, and a safe surface. uDuck does not guarantee that a community policy is safe to run.
Deployment stepsShow instructions
1 Download the ONNX model standing_body_control.onnx
curl -L "https://raw.githubusercontent.com/TommyZihao/microduck_runtime/main/policies/standing_body_control.onnx" -o "/opt/robot/policies/standing_body_control.onnx"
2 Add the policy to robotd
[policy]
stand = "/opt/robot/policies/standing_body_control.onnx"
3 Restart the control loop
sudo systemctl restart robotd
robotctl health
Try it in simulation
uv run scripts/infer_policy.py --standing standing_body_control.onnx --new-cmd-obs

Sources