Microduck 的轮式模式:穿上轮滑鞋的鸭子怎么学会滑冰
做过双足机器人的人通常只关心一件事:走路。但 Microduck 有个不太寻常的能力——它能在脚底装上被动轮,从双足行走切换成轮滑。这不是换个步态那么简单,是完全不同的动力学。走路是离散接触:脚抬起来、落下去、再抬起来。轮滑是连续接触:两个轮子始终着地,重心控制逻辑完全反过来。今天拆开看这套轮式模式到底怎么回事。
硬件变化:被动轮,不是主动轮
先说清楚,Microduck 的轮子不是电机驱动的。它是被动轮——装在脚底,没有自己的动力。所有动力仍然来自那 14 个 XL330 舵机。轮子改变的不是驱动力,是接触模型。脚底从一个面变成一条线,摩擦系数大幅降低,机器人从”踩地面”变成”滑地面”。
这意味着 Microduck 的轮滑更接近真人的轮滑:靠重心转移和腿部推送来滑行,不是靠轮子自己转。舵机提供的是姿态控制,不是推进力。推进靠的是重心前倾后利用轮子低摩擦产生的滑动。
专用仿真模型:robot_groundcontact_rollers.xml
Microduck 的 RL 训练仓库里有四套 MJCF 模型,轮式任务用的是 robot_groundcontact_rollers.xml。这套模型跟行走用的 robot_walk.xml 有本质区别。
行走模型把脚底碰撞设成面接触,因为步态需要落地冲击和摩擦力来产生推进。轮式模型则用滚动接触——轮子有半径、有摩擦系数、有转动自由度,MuJoCo 的物理引擎会计算轮子在地面上滚动时的力学。
如果直接用行走模型加轮子会怎样?步态策略学到的落脚动作在轮子上完全没有意义——你没法”踩”一个会滑的东西。训练会发散,或者策略学到一些奇怪的抖动行为来勉强前进。所以必须用专门的轮式模型从头训练。
六个轮滑策略:从直线滑行到原地旋转
Microduck 的训练仓库注册了六个轮滑任务,每个对应一种轮滑行为:
Mjlab-Velocity-Flat-MicroDuck-Rollers 是基础直线滑行。给定速度指令,鸭子在轮子上前后左右移动。这看起来简单,但轮滑的横向移动比走路难得多——走路靠交叉步,轮滑靠重心偏移和轮子角度。
Mjlab-Velocity-Swizzle-MicroDuck 是对称滑行。Swizzle 是花样滑冰里的基本动作:两脚同时向外推再收回来,画一个椭圆形。这个动作要求严格的左右对称性,训练时用了 symmetry.py 里的 61 维镜像表来约束策略。这是 Microduck 所有任务里少数开启对称损失的训练。
Mjlab-RollerCrouch-Flat-MicroDuck 是蹲式滑行。鸭子在滑行过程中蹲下去再站起来。这个任务 tricky 的地方在于蹲下会改变重心高度,轮子上的平衡点跟着变。策略必须在蹲下的同时调整姿态补偿,不然就摔。
Mjlab-RollerSlope-Flat-MicroDuck 是坡道滑行。鸭子在斜坡上靠轮子滑下去。坡度改变了重力分量的方向,策略需要学会利用重力而不是对抗它。这跟走路下坡完全不同——走坡靠的是落脚位置控制下降速度,滑坡靠的是姿态角度控制滑行方向。
Mjlab-RollerStandUp-Flat-MicroDuck 是轮滑起立。鸭子在轮子上从地面站起来。站立起立本身已经够难了——在轮子上起立意味着站起来的过程中重心在移动,轮子也在滑。策略必须同时管理起立动作和轮子滑动,这大概是六个轮滑任务里最难的一个。
Mjlab-Spin-Flat-MicroDuck 是原地旋转。鸭子在轮子上快速转圈。旋转产生的离心力会试图把鸭子甩出去,策略需要向内倾斜来对抗离心力。这个动作在真机上的表现特别有意思——你会看到一只鸭子一边滑一边转,像花样滑冰的旋转动作。
跟行走策略的关键区别
轮滑策略和行走策略在观察空间上共享同一个 61 维契约——48 维本体感知加 13 维指令块。这意味着轮滑策略也可以跟行走策略热切换,运行时不需要改观察维度。
但训练逻辑完全不同。走路的核心奖励是前进速度和朝向跟踪。轮滑的核心奖励也是速度跟踪,但惩罚项不一样。走路要惩罚脚底拖地和膝盖过度弯曲,因为这两者在离散步态里是浪费能量。轮滑里脚不抬起来,拖地惩罚没意义;膝盖弯曲反而有用,因为蹲下能降低重心提高稳定性。
另一个区别是接触处理。行走模型用 robot_walk.xml,剥离了躯干和头部的碰撞——摔了就摔了,不用算碰撞。轮滑模型用 robot_groundcontact_rollers.xml,保留了地面接触碰撞,因为轮滑摔倒时身体部位会接触地面,策略需要知道这些接触来学习避免摔倒。
运行时切换:policy.mode = “roller”
Microduck 的运行时通过一个参数切换行走和轮滑模式:policy.mode = "roller"。这不是切换单个策略,是切换整个策略集。行走模式加载 walk、standup、sitstand 等策略;轮滑模式加载 rollers、swizzle、spin 等策略。
切换不是瞬时的。robotd 需要先卸载当前策略集,加载新的 ONNX 文件,然后才能响应指令。这个过程中机器人需要保持静止——你不能在走路的过程中突然切换到轮滑模式。实际上,换轮子本身就需要物理操作(装上或拆下被动轮),所以模式切换发生在换轮子的时候。
61 维观察契约的扩展性
轮滑策略族的存在证明了 61 维观察契约的设计价值。当 Pollen Robotics 要加轮滑功能时,不需要改观察维度,不需要改运行时代码,只需要训练新的策略并导出 ONNX。运行时根据 policy.mode 加载对应的策略集,每个策略都走相同的观察→推理→动作管线。
这个设计让 Microduck 的能力扩展变成”训练新策略”而不是”改系统代码”。从走路到轮滑,从轮滑到踢球,从踢球到翻滚——每次扩展都是一个新的 ONNX 文件,运行时代码一行不改。
实际意义:为什么一只鸭子要会轮滑
从工程角度看,轮滑模式验证了一个重要假设:同一个硬件平台可以支持多种运动模态,只要观察契约不变。这对机器人产品的意义是——硬件出厂后,软件可以持续扩展新能力。用户买了 Microduck,后续可以通过策略更新获得轮滑功能,不需要换硬件。
从研究角度看,轮滑是一个有趣的中间态。它比走路快但比走路难控制,接触模型比走路简单(连续 vs 离散)但动力学比走路复杂(滑动 vs 锁定)。Microduck 的轮滑策略为连续接触机器人的控制研究提供了一个可复现的基准。
Microduck 的六种轮滑行为,从直线滑行到原地旋转,覆盖了轮滑运动的主要技能树。每个策略都用 BAM 执行器模型训练,经过域随机化,导出为 ONNX 部署到真机。这只 800 克的鸭子穿上轮滑鞋之后,就是一台最小的轮式双足机器人。
来源:GitHub pollen-robotics/microduck_rl 仓库任务注册表、pollen-robotics/microduck 架构文档
