RepoDaily · 2026-09-01 · Infrastructure / Runtime

microduck_rl:把 800 克双足机器人从 MuJoCo Warp 训练到 ONNX 的开源环境集

#18 Infrastructure / Runtime Python +384 pollen-robotics/microduck_rl 打开仓库

Pollen Robotics 把 Microduck(约 800 克、25 厘米高双足)的完整 sim2real 训练栈开源:18 个 mjlab 任务、BAM 执行器物理、域随机化与 ONNX 导出,采用 Apache-2.0 许可。

项目类型Infrastructure / Runtime
最适合有 CUDA GPU、要用 PPO 为小型双足机器人训练步态与恢复策略、再经 ONNX 部署到实机的机器人工程师
风险等级中等:研究型依赖被严格锁版,目标机型单一,CUDA 依赖对版本敏感
评估时间2–4 小时:用 uv 安装,在 4096 个并行环境训练速度步态(CUDA GPU 上约 1–2 小时),再在查看器中回放

核心问题: mjlab + BAM + ONNX 这套 sim2real 配方能否迁移到你的机器人,还是主要作为 Microduck 级双足的参考?

88/100

RepoDaily 采用评分

RepoDaily 将该项目的采用分评为 88/100(强):分数来自文章来源、安装路径、生产风险、差异化、许可证清晰度以及 AI/Agent 适配度。

基于 RepoDaily 来源和采用说明的方向性评分,不是基准测试。风险: 中
100证据质量

包含 4 个来源、覆盖 4 类来源;如有 RepoDaily 独有模块,会进一步提高证据分。

99可安装/可试用性

检测到 5 个工作流步骤、4 个下一步动作,以及 2 个命令/安装信号。

62维护可信度

趋势热度为 +384 stars;如内容中有 release、issue 或维护信号,会提高维护可信度。

90生产准备度

采纳风险标记为 medium,并包含 4 条安全说明与 4 条跳过条件。

100差异化

3 个机会视角、3 个替代方案,以及 4 个类型化模块支撑差异化判断。

82许可证清晰度

文章中包含许可证来源或许可证表述。

66Agent / AI 适配度

文章正文和元数据中检测到 3 个 AI/Agent 相关信号。

项目概览

microduck_rl 是 Pollen Robotics 双仓库布局中的训练半边:本仓库承载强化学习环境,配套的 pollen-robotics/microduck 仓库承载在实体机器人上执行策略的运行时。机器人本体约 800 克、高约 25 厘米,注册表里的每个任务都围绕这具身体设计:带速度指令与头部姿态指令的行走、从俯卧/仰卧/坐姿起身、前滚翻、踩被动轮滑行,以及让'看不见球'的策略踢动 70 毫米、15 克的球。

技术底座是 mjlab 1.3.0——它通过 Warp(warp-lang 1.12.0)在 CUDA GPU 上运行 MuJoCo,训练算法为 PPO,50 Hz 的控制频率与实机部署一致。让这个仓库区别于普通环境合集的,是 sim2real 配方写得非常明白:BAM 执行器物理(来自 Rhoban better-actuator-models 的 mjlab_frictionloss 分支)、域随机化、齿隙(backlash)仿真,以及蒸馏在 AGENTS.md 里的奖励设计手册。策略导出为 ONNX 后,既可以用 scripts/infer_policy.py 在 CPU 版 MuJoCo 里驱动,也可以交给配套运行时部署到真机。

本周期它以 384 颗星排在趋势榜第 18 位——对一个绑定单一厂商硬件的仓库来说相当显眼。它能跨出 Microduck 用户圈的原因在于:训练循环、执行器建模和导出路径都可以复用,而且没有本地 GPU 时,--hf-jobs 标志能把同一条训练命令提交到 Hugging Face Jobs。

解决什么问题

  • 双足策略训练通常要手工拼装物理引擎、执行器模型、地形随机化和部署桥接——本仓库把这套拼装作为一个锁版整体交付。
  • 理想化执行器会掩盖导致 sim2real 失败的齿轮齿隙;microduck_rl 显式仿真齿隙,而不是指望随机化兜底。
  • 训练代码与部署代码常被锁在公司私有仓库里;这里拆分透明:本仓库训练并导出 ONNX,pollen-robotics/microduck 在硬件上运行。
  • CUDA 环境的摩擦真实存在:首次 `uv sync` 要下载约 2 GB CUDA wheel,在 ARM 设备(DGX Spark / GB10、Jetson)上 uv 默认 30 秒 HTTP 超时可能让下载中途失败。

工作原理

  1. mjlab 通过 Warp 在 CUDA GPU 上并行运行数千个 MuJoCo 环境;README 的默认训练命令使用 4096 个环境。
  2. PPO 以 50 Hz 学习策略——与真机运行时消费动作的频率一致。
  3. BAM(better-actuator-models,导入名 `bam`)提供含摩擦损失的高保真执行器物理;域随机化与齿隙仿真包裹在机器人模型外层。
  4. 检查点通过 Weights & Biases 跟踪;`uv run play ... --wandb-run-path <entity/project/run_id>` 可在查看器中回放某次运行。
  5. `scripts/export.py` 把策略转成 ONNX,之后或由配套仓库的运行时部署到真机,或用 `scripts/infer_policy.py --walking output.onnx` 在 CPU 版 MuJoCo 中以键盘驱动。

架构解读:一个入口点、两个仓库、三处锁版

包名为 mjlab-microduck(版本 0.1.0),通过 `mjlab.tasks` 入口点注册到 `mjlab_microduck.tasks`——与 mjlab 自身使用的插件机制相同,因此这是对框架的扩展而非分叉。`train` 命令行脚本刻意遮蔽了 mjlab 自己的入口点:行为一致,额外提供把任务提交到 Hugging Face Jobs 的 `--hf-jobs` 标志(实现位于 train_cli.py)。

三个版本决定定义了整套栈:mjlab==1.3.0、warp-lang==1.12.0、Python >=3.12,<3.13。Python 上界来自 bam(better-actuator-models)对 requires-python <3.13 的锁定——曾经因为上界浮动,Hugging Face Jobs 选到了 3.13.14。其余依赖包括 onnxruntime>=1.24.4、rustypot>=1.4.2、huggingface_hub>=0.27.0、matplotlib>=3.10.9 与 scipy>=1.16。

命令面:从克隆到 ONNX 的完整 CLI 闭环

  • `uv run list-envs`——打印实时任务注册表,不用猜任务 id。
  • `uv run train Mjlab-Velocity-Flat-MicroDuck --env.scene.num-envs 4096`——训练主行走任务;4096 环境下约 1–2 小时得到可用步态。
  • `uv run play Mjlab-Velocity-Flat-MicroDuck --wandb-run-path <entity/project/run_id>`——在查看器中观看训练好的策略。
  • `uv run scripts/export.py Mjlab-Velocity-Flat-MicroDuck --wandb-run-path <...>`——导出部署用 ONNX。
  • `uv run scripts/infer_policy.py --walking output.onnx`——在 CPU 版 MuJoCo 中用键盘驱动导出的策略,无需 GPU。
  • 断点续训:追加 `--agent.run-name resume --agent.load-checkpoint model_29999.pt --agent.resume True`。
  • 任意训练命令可加 `--hf-jobs` 提交到 Hugging Face Jobs,细节见 scripts/hf/README.md。
  • ARM 设备首次同步前先导出 `UV_HTTP_TIMEOUT=600`,否则约 2 GB 的 CUDA wheel 下载可能撞上 uv 默认 30 秒超时。

维护风险:四处依赖覆盖说明了问题

  • 这里声明 scipy>=1.16,是因为 mjlab 1.3.0 在 terrains/heightfield_terrains.py 里导入 scipy 却未声明——全新 `uv sync` 之后连包都导入不了(2026-07-21 发现)。
  • protobuf 被覆盖为 >=4.0,<7.0:bam 把 protobuf 锁在 <4,级联把 onnx 压到 1.17.0——该版本没有 wheel、源码构建会失败。
  • PyPI 存根包 `zmq==0.0.0`(bam 的依赖)的预编译 wheel 无效(缺少 .dist-info);由于只用 bam.model/bam.actuator,通过永假标记将其剔除。
  • mujoco 绝不能覆盖:mujoco-warp 锁定 mujoco 3.10.x,此前的覆盖曾强制降到 3.4.0,因缺少 mjDSBL_MULTICCD 导致导入崩溃。
  • 版本号 0.1.0、修复注释日期 2026-07-21,说明依赖图年轻且仍在调整,锁版集合大概率会继续变动。

上手路径:第一次会话长什么样

在 CUDA 机器上,整条闭环一个下午就能走完:克隆仓库、`uv sync`(DGX Spark / GB10 或 Jetson 先设 `UV_HTTP_TIMEOUT=600`)、以 4096 环境训练速度任务一到两小时、在查看器回放、导出 ONNX,最后用键盘在 CPU 版 MuJoCo 里验证策略——全程不需要硬件。没有 CUDA GPU 时,加 `--hf-jobs` 就能在 Hugging Face Jobs 上跑同一套流程,试跑成本为零,但训练运行会进入你的 Hugging Face 账号。

谁适合关注

适合关注

  • Microduck 硬件用户,想要参考训练管线而不只是运行时。
  • 要把步态或跌倒恢复策略移植到相近体量(约 800 克、25 厘米)小型双足上的机器人工程师。
  • 研究执行器保真度的研究者:BAM 摩擦损失建模对比理想力矩执行器。
  • 想先看 mjlab 插件系统(`mjlab.tasks` 入口点)实际样例、再动手自建环境的人。

可以先跳过

  • 面向四足、机械臂或无人机的项目——这里每个任务 id 都围绕 Microduck 双足的形态构建。
  • 锁在 Python 3.13+ 的环境:bam 强制 requires-python <3.13。
  • 不愿引入 Weights & Biases 做运行跟踪或 Hugging Face Jobs 做远程训练的场景——两者都织入默认流程。
  • 期待稳定 API 的生产服务:包还在 0.1.0,覆盖注释里记录着上游持续破损。

风险与注意事项

中

Apache-2.0 且锁版可复现,但依赖图以文档化方式呈现脆弱性,任务集只针对一款机器人。

  • Python 被 bam 锁在 3.13 以下,与更新的 CUDA 栈存在冲突风险。
  • 需要四条 override-dependencies 才能让 `uv sync` 成功,每条都在修上游破损:mjlab 缺声明 scipy、protobuf/onnx 级联、zmq wheel 无效、mujoco-warp 锁版。
  • 部署依赖配套 pollen-robotics/microduck 运行时;本仓库本身只产出 ONNX 文件。
  • 包版本 0.1.0、修复日期 2026-07-21,说明锁版集合仍在变动。
  • Apache-2.0,含第 3 条专利授权,商业使用与分叉没有歧义。
  • 训练默认在本地 GPU 进行;`--hf-jobs` 会把运行送到 Hugging Face Jobs,检查点回放需要 Weights & Biases 的 run path——两条路径都会把数据带到第三方账号。
  • 包内不含对外网络服务:本体是训练库加 CLI 脚本。
  • 首次安装从 PyPI 镜像下载约 2 GB CUDA wheel;ARM 超时规避(`UV_HTTP_TIMEOUT=600`)已写入 README。

替代方案比较

方案适用场景代价
NVIDIA Isaac Lab
需要厂商维护、覆盖多种机器人与传感器的 GPU RL 框架,而不只是一款双足。免费、开源
legged_gym
沿用 leggedrobotics/ETH 的四足运动管线,并与近年多数论文的环境写法对齐。免费、开源
MuJoCo Playground
更偏向 Google DeepMind 基于 MJX/JAX 的训练环境,而非基于 Warp 的 mjlab 栈。免费、开源

这个趋势说明了什么

不分叉训练器就注册第二款机器人

任务经 `mjlab.tasks` 入口点(`mjlab_microduck.tasks`)插入,另一款小型双足可以通过发布自己的包加入注册表,而不必给本仓库打补丁。

为你的 MJCF 模型复制一份 Mjlab-Velocity-Flat-MicroDuck,确认新 id 出现在 `uv run list-envs` 输出中。

在 Microduck 之外复用 BAM 执行器物理

better-actuator-models 锁定自 Rhoban 的 mjlab_frictionloss 分支,这里只导入 bam.model/bam.actuator——同一套模型可以提升任何 mjlab 环境的执行器保真度。

在裸 mjlab 环境中导入 bam.model,对比单个关节与理想执行器的力矩曲线。

把策略迭代搬到 Hugging Face Jobs

遮蔽版 `train` 入口点上的 `--hf-jobs` 标志能在远端执行相同命令,把笔记本变成 4096 环境 PPO 任务的提交客户端。

用 `--hf-jobs` 提交一个短时 Mjlab-Spin-Flat-MicroDuck 任务,对比本地 GPU 的排队到检查点耗时。

下一步建议

用一个下午跑通训练到 ONNX 的完整闭环

README 的快速开始足够短,在 CUDA 机器上可以从头到尾一次完成,并覆盖除硬件部署外的每个 sim2real 阶段。

  1. 克隆仓库并执行 `uv sync`;在 DGX Spark / GB10 或 Jetson 上先设置 `UV_HTTP_TIMEOUT=600`,否则约 2 GB 的 CUDA wheel 下载会撞上 uv 默认 30 秒超时。
  2. 训练主行走任务:`uv run train Mjlab-Velocity-Flat-MicroDuck --env.scene.num-envs 4096`,得到可用步态大约需要 1–2 小时。
  3. 用 `uv run play Mjlab-Velocity-Flat-MicroDuck --wandb-run-path <entity/project/run_id>` 在查看器中回放该次训练。
  4. 运行 `uv run scripts/export.py Mjlab-Velocity-Flat-MicroDuck --wandb-run-path <...>` 导出 ONNX,再用 `uv run scripts/infer_policy.py --walking output.onnx` 在 CPU 版 MuJoCo 中验证,全程无需硬件。

RepoDaily 判断

microduck_rl 不是通用 RL 框架,而是一条针对一台 800 克双足的完整、有主见的 sim2real 管线——它的价值恰恰在这份完整:BAM 执行器物理、域随机化、齿隙仿真、18 个任务 id、ONNX 导出,外加远程算力出口,全部以 Apache-2.0 发布。如果你做小型双足,或想要一份最终落到真机上、最易读的 MuJoCo Warp 训练公开范例,值得采用;同时要把锁版依赖图(Python <3.13、四处覆盖)当作这份易读性的代价,先确认你的目标 Python 与 CUDA 栈能否装进去。

信息来源