YouDuck.ai

训练与部署

最后更新

Microduck 的动作策略不在机器人仓库里训练,而在隔壁的 microduck_rl——MuJoCo Warp 加 PPO,训练完导出 ONNX,由机器人上的运行时加载。

这一栏覆盖从仿真到真机的整条链路。

整条链路长什么样

Microduck 训练到部署链路 策略在 GPU 上以 50 Hz 用 MuJoCo Warp 与 PPO 训练,导出为 ONNX,由机器人上的 robotd 以同样的 50 Hz 加载运行。 你的机器 · CUDA GPU MuJoCo Warp + PPO export.py 导出

域随机化:电压 · 电压跌落 · 延迟 · 摩擦 执行器:BAM M6(XL330)· 齿隙 ±1°

.onnx 61 维观测 机器人 · Rockchip RK3566 robotd robotd.toml 里 [policy] 指向它

15 个舵机 · 热切换 walk / recover / trick 加载失败 → robotctl health 报 unhealthy

两端都是 50 Hz
训练频率和机上控制循环频率都是 50 Hz——这不是巧合,而是让仿真里学到的时序在真机上成立的前提。

有一个细节值得注意:训练频率和机上控制循环频率都是 50 Hz。这不是巧合,而是让仿真里学到的时序在真机上成立的前提。

最短路径

有 CUDA GPU 的话,四条命令就能走完一遍:

git clone https://github.com/pollen-robotics/microduck_rl && cd microduck_rl

# 训练(4096 个并行环境下约 1–2 小时能得到可用步态)
uv run train Mjlab-Velocity-Flat-MicroDuck --env.scene.num-envs 4096

# 导出
uv run scripts/export.py Mjlab-Velocity-Flat-MicroDuck --wandb-run-path <...>

# 不用机器人,先在 CPU 版 MuJoCo 里用键盘驱动它
uv run scripts/infer_policy.py --walking output.onnx

没有 GPU:给任意 train 命令加 --hf-jobs,训练跑在 Hugging Face Jobs 上。

详细步骤见搭起训练环境

上机不需要发布版本

这是一个容易被高估难度的环节。把自己的 .onnx 放到板子上,在 /etc/robot/robotd.toml 里指过去就行:

[policy]
walk = "/home/radxa/my_walking.onnx"
sudo systemctl restart robotd

这些路径能挺过系统更新——发布版替换的是它自带的二进制和策略文件,不是这个指向别处的配置。删掉这几行就回到官方策略。

加载失败会报 unhealthy,robotctl healthrobotctl monitor 底部边框都会说明原因。

sim2real 真正卡住的地方

仿真里走得好、上机就摔,是这类项目最常见的失败。microduck_rl 把整套配方编码进了仓库本身,核心是四件事:

  1. 执行器物理不能理想化 —— 用 BAM M6 模型建模 Dynamixel XL330:电压控制律、反电动势、库仑/Stribeck/负载相关摩擦。把舵机当理想力矩源,学到的步态几乎必然失效。
  2. 随机化的是物理参数,不是观测噪声 —— 电池电压、负载下的电压跌落、指令延迟、摩擦大小。这和往观测里加高斯噪声是两回事。
  3. 齿隙必须建模在正确的一侧 —— 真机编码器装在齿隙的输出侧,所以仿真的观测也必须透过齿隙读取。建模在输入侧的话,策略会以为自己精确知道关节位置,这个误差在换向时集中爆发。
  4. 多个策略共享一份 61 维观测契约 —— 行走/恢复/特技可以在任意时刻热切换接管机器人。

展开见 sim2real 配方

有哪些任务可以训

主任务是 Mjlab-Velocity-Flat-MicroDuck(速度指令行走)。此外还有跌倒恢复、站起、坐下、低头捡、踢球、前滚翻,以及一整套轮滑任务(脚下装被动轮)。

每个主任务还有一个 Backlash 双胞胎,在带 ±1° 齿轮间隙的模型上训练。

完整清单见训练任务清单

本栏目录