feat: add Microduck robot and integrate it into humanoid walk task - #18
Merged
Conversation
Port the Pollen Robotics Microduck 14-DoF biped MJCF and meshes from microduck_rl (Apache-2.0 code, CC BY-SA-NC meshes) with STAND/SIT/FOLD key poses plus a trunk termination capsule, and register microduck-walk-flat/rough presets on the shared velocity-tracking env with scale-tuned gait rewards, task configs, posters, and env docs. Measure the shared foot-orientation penalty against the default-pose foot gravity so robots with non-world-aligned ankle frames (onshape- to-robot exports like Microduck) are not rewarded for tilting soles.
There was a problem hiding this comment.
🟡 Changes recommended
The Microduck preset parameters in code (command limits and swing height) don’t match the stated PR/issue acceptance criteria, so behavior will differ from what’s documented and expected.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
This PR adds the Pollen Robotics Microduck humanoid robot (MJCF + mesh assets) to MotrixLab and integrates it into the existing robot-agnostic humanoid velocity-tracking walk task family, including a shared fix to the foot-orientation penalty so non-world-aligned ankle frames are handled correctly.
Changes:
- Add
Microduckrobot config, MJCF, and mesh assets (plus asset README and registry wiring). - Add
microduck-walk-flat/microduck-walk-roughpresets onHumanoidVelocityTrackingEnvand new Hydra task configs. - Update shared humanoid walk reward foot-orientation penalty and extend tests/docs to cover the new robot and presets.
File summaries
| File | Description |
|---|---|
| motrix_envs/tests/test_robot_cfg.py | Adds Microduck registration and model/asset smoke tests. |
| motrix_envs/tests/test_humanoid_walk.py | Extends humanoid-walk preset tests to include Microduck and its camera setup. |
| motrix_envs/src/motrix_envs/robot/microduck.py | Introduces the Microduck robot configuration and key poses. |
| motrix_envs/src/motrix_envs/robot/assets/microduck/README.md | Documents upstream source and local MJCF modifications (termination geom). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/microduck.xml | Adds the Microduck MJCF model, including trunk_collision termination capsule. |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/yaw2roll.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/yaw_roll_motion.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/xl330.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/upper_leg_rigidity_plate.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/upper_leg_right.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/upper_leg_left.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/trunk_base.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/top_head_shell.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/speaker.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/sole_right.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/sole_left.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/soft_mouth_top.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/seeed_bearing__configuration_default.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/seeed_bearing__configuration__22x16x4.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/right_shell.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/power_support.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/pcb__raspberry_pi_zero_2_w.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/np_f970.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/noenoeil.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/neck.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/neck_pitch.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/motor_support.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/m12_lens_holder.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/lens.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/leg.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/left_shell.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/jaw.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/jaw_soft.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/hip_l.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/foot_right.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/foot_left.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/face_part.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/elec_rpi_robot_hat_pcb.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/bottom_head_shell.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/bearing_roll.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/banana_pcb_locker.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/ankle_right.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/assets/microduck/assets/ankle_left.stl | Microduck mesh asset (Git LFS pointer). |
| motrix_envs/src/motrix_envs/robot/init.py | Registers microduck robotcfg and re-exports Microduck. |
| motrix_envs/src/motrix_envs/locomotion/humanoid/walk_np.py | Fixes shared foot-orientation penalty to use default-pose foot gravity reference. |
| motrix_envs/src/motrix_envs/locomotion/humanoid/microduck.py | Adds Microduck walk presets and registers env IDs. |
| motrix_envs/src/motrix_envs/locomotion/humanoid/init.py | Ensures Microduck humanoid presets are imported for registration. |
| docs/source/zh_CN/user_guide/robots.md | Adds Microduck to generated robot table (zh_CN). |
| docs/source/zh_CN/user_guide/envs/index.md | Adds Microduck walk tasks to env index (zh_CN). |
| docs/source/en/user_guide/robots.md | Adds Microduck to generated robot table (en). |
| docs/source/en/user_guide/envs/index.md | Adds Microduck walk tasks to env index (en). |
| docs/source/_static/images/robots/microduck.png | Adds Microduck robot screenshot (Git LFS pointer). |
| docs/source/_static/images/poster/microduck-walk-rough.jpg | Adds Microduck rough-walk poster (Git LFS pointer). |
| docs/source/_static/images/poster/microduck-walk-flat.jpg | Adds Microduck flat-walk poster (Git LFS pointer). |
| docs/scripts/generate_robot_docs.py | Adds doc-generation camera framing defaults for Microduck. |
| configs/task/microduck-walk-rough/motrix.fastsac.yaml | Adds training recipe config for microduck-walk-rough. |
| configs/task/microduck-walk-flat/motrix.fastsac.yaml | Adds training recipe config for microduck-walk-flat. |
Review details
- Files reviewed: 57/57 changed files
- Comments generated: 3
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
krai33
approved these changes
Sep 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
trunk_collisioncapsule ontrunk_basefor fall termination (sole geoms must touch the ground, so they can't be used for termination)microduck(motrix_envs/robot/microduck.py) andmicroduck-walk-flat/microduck-walk-roughpresets on the sharedHumanoidVelocityTrackingEnv, with scale-tuned initial hyperparameters for the ~25 cm biped:period=0.5,swing_height=0.04(legs are ~8 cm; default 0.09 is too large)vel_limitrestates the shared default (lin_vel ±1.0 m/s,ang_vel ±1.0 rad/s)configs/task/microduck-walk-{flat,rough}/motrix.fastsac.yaml), posters, bilingual env/robot docs, and test coverageDoes not modify
HumanoidVelocityTrackingEnvotherwise; no Microduck-specific reward terms or observations.Closes #17
Verification