MicroDuck强化学习入门实验
小型机器人通常是学习大型机器人概念的最佳方式。
MicroDuck是一个特别有趣的例子,因为它汇集了通常分开教授的多个领域:
- 物理仿真
- 强化学习
- 运动控制
- 机器人控制
- 仿真到真实世界的迁移
- 神经网络推理
- 嵌入式部署
我不想把MicroDuck仅仅当作一个在仿真器中走来走去的东西来观看,而是想理解其行为背后的工程流程。
因此,我围绕一个简单的工作流程构建了一个实用的MicroDuck强化学习入门实验:
目标不是构建一个新的机器人框架。
目标是为那些想要了解强化学习策略如何从物理仿真器走向能够真正控制机器人的工程师,创建一条最短的有用路径。
本文将详细介绍该工作流程。
1、什么是MicroDuck?
MicroDuck是由Pollen Robotics开发的小型双足机器人。
该机器人高约25厘米,重约800克,其运动由强化学习策略驱动。当前的开源MicroDuck软件栈将物理机器人运行时与强化学习训练环境分离。
这种分离很重要。
从概念上讲,架构如下:
MICRODUCK RL PIPELINE
官方的microduck_rl仓库使用mjlab / MuJoCo Warp与PPO一起,在50 Hz下训练策略,并提供将策略导出为ONNX的工具。
这使得MicroDuck成为端到端机器人强化学习系统的一个异常易用的示例。
2、在训练之前:使用浏览器仿真器
最简单的入口点之一是Hugging Face上的官方MicroDuck沙盒。
它比最初看起来更有用。
仿真器使用编译为WebAssembly的MuJoCo在浏览器中直接运行物理,而学习到的神经网络策略通过ONNX Runtime Web运行。基本的游乐场不需要推理后端。
这意味着您实际上是在查看机器学习生命周期的最后部分:
控制周期以50 Hz运行。
这已经是一个重要的工程课程。
强化学习模型不仅仅是被问到:
"机器人应该走向哪里?"
相反,策略参与了一个连续的反馈循环。
每个控制步骤大致遵循:
状态 → 观测 → 神经网络 → 动作 → 物理 → 新状态
然后再次重复。
3、使用现有策略
在接触训练代码之前,我建议花一些时间控制现有的MicroDuck。
浏览器仿真器目前提供多种行为,包括行走、坐/站、滚动和踢腿,以及基于滚轮的运动变体。
典型的键盘控制包括:
WASD / 方向键 运动
M 切换腿/滚轮
Q / E 踢
R 滚动或下蹲
空格 重置
C 追踪相机
为什么在训练之前要花时间在这里?
因为它让您直观地了解策略实际做什么。
前进。
快速转弯。
反向。
重置机器人。
触发另一种行为。
尝试将机器人置于异常状态。
您开始提出更有用的问题:
- 策略观察到什么信息?
- 它产生什么动作?
- 它如何从干扰中恢复?
- 为什么步态保持稳定?
- 什么决定了转弯行为?
- 当状态超出正常训练条件时会发生什么?
这些比简单地问使用了哪种强化学习算法要好得多。
4、我想要的入门实验
我的目标是将项目简化为五个可理解的阶段:
阶段1 — 运行仿真器
阶段2 — 理解环境
阶段3 — 训练PPO策略
阶段4 — 评估策略
阶段5 — 导出为ONNX
这给我们提供了一个更实用的心理模型:
物理
↓
环境
↓
强化学习
↓
训练好的策略
↓
可移植模型
每一层都引入了不同的工程问题。
5、阶段1:让强化学习仓库运行起来
训练端位于开源的microduck_rl项目中。
最小设置从以下开始:
git clone https://github.com/pollen-robotics/microduck_rl
cd microduck_rl
该项目使用uv进行Python环境和依赖管理。
环境安装后,我要做的第一件事是检查可用的任务,而不是立即启动大规模的训练任务。
例如:
uv run list-envs
这是一个小步骤,但它引入了一个重要的机器人强化学习概念:
我们不训练"机器人"。
我们为特定的任务/环境定义训练策略。
行走是一项任务。
恢复可能是另一项。
站立可以是另一项。
滚轮运动可以是另一项。
官方项目包含用于不同运动和行为模式的多个MicroDuck环境。
6、阶段2:理解强化学习环境
在PPO有意义之前,我们需要了解强化学习环境实际提供什么。
在最简单的层面:
观测_t
↓
策略
↓
动作_t
↓
环境
↓
奖励_t + 观测_t+1
因此,环境至少定义了四个关键内容:
6.1 观测
神经网络接收什么信息?
对于运动系统,这可能包括来自以下领域的信号:
关节位置
关节速度
机器人方向
角速度
指令速度
先前动作
确切的观测契约极其重要,因为训练后的网络只能对其接收到的信息做出反应。
6.2 动作
神经网络控制什么?
对于机器人,输出最终需要影响执行器。
概念上:
策略输出
↓
关节目标
↓
伺服/控制器
↓
机器人运动
这与强化学习演示中动作可能只是"向左移动"或"向右移动"非常不同。
在这里,动作空间对应于物理运动。
6.3 奖励
这是真正的强化学习工程发生的地方。
行走策略在概念上可能因以下内容获得正奖励:
跟踪指令速度
保持有用的姿势
稳定的运动
节能的运动
并对不良行为进行惩罚,例如:
跌倒
不稳定的运动
过度的关节运动
差的指令跟踪
不需要的碰撞
确切的设计极其重要。
设计不良的奖励不一定产生完全无用的策略。
有时它会产生更糟糕的东西:
一个优化您要求的而不是您意图的策略。
这是机器人强化学习如此有趣的原因之一。
奖励工程变成了规范工程。
7、阶段3:使用PPO进行训练
MicroDuck使用近端策略优化 — PPO进行策略学习。
您不需要在实验系统之前从数学上推导PPO,但您应该从高层次理解它在做什么。
策略开始时基本上没有经验。
它与模拟机器人交互。
那些机器人生成轨迹:
状态
动作
奖励
状态
动作
奖励
...
然后训练过程问:
哪些动作与更好的结果相关?
策略参数逐渐更新,以增加有用行为的可能性。
重复此过程足够多次,协调的运动开始出现。
官方项目中的简化训练命令是:
uv run train Mjlab-Velocity-Flat-MicroDuck \
--env.scene.num-envs 4096
有趣的部分不仅仅是PPO。
它是:
--env.scene.num-envs 4096
不是一次使用一个机器人模拟进行训练,而是可以并行运行数千个模拟环境。
概念上:
鸭子1 ─┐
鸭子2 │
鸭子3 │
鸭子4 │
... ├──→ 经验 → PPO更新
鸭子4094 │
鸭子4095 │
鸭子4096 ─┘
并行仿真是现代机器人强化学习能够比物理机器人更快地生成大量经验的原因之一。
项目文档表明,在合适的GPU硬件上,使用4,096个环境大约1-2小时可以获得可用的行走步态,尽管实际训练时间自然取决于硬件和配置。
7.1 为什么PPO是一个好的学习点
有趣的教训不仅仅是:
"MicroDuck使用PPO。"
重要的是理解以下之间的分离:
训练
和:
推理
在训练期间,您需要:
仿真
奖励计算
轨迹收集
优化
梯度更新
检查点
指标
仿真
奖励计算
轨迹收集
优化
梯度更新
检查点
指标
但当策略最终运行时,大部分都会消失。
部署主要需要:
观测
↓
神经网络
↓
动作
这直接引向ONNX。
8、阶段4:在导出前进行评估
训练奖励上升并不自动意味着机器人学会了您想要的东西。
因此,我将策略评估视为一个单独的阶段。
官方工作流程让您播放训练好的策略:
uv run play Mjlab-Velocity-Flat-MicroDuck \
--wandb-run-path <entity/project/run_id>
现在观察行为,而不仅仅是学习曲线。
我会测试:
向前运动
向后运动
左/右转弯
快速命令变化
停止
恢复
异常初始位置
不同速度
这种区别很重要。
高奖励回答:
"策略是否优化了定义的目标?"
评估问:
"结果的行为实际上有意义吗?"
这些问题并不相同。
9、阶段5:将策略导出为ONNX
一旦策略表现合理,我们就达到了实验最重要的部分之一。
导出它。
项目提供类似以下的ONNX导出工作流程:
uv run scripts/export.py \
Mjlab-Velocity-Flat-MicroDuck \
--wandb-run-path <entity/project/run_id>
结果是一个可以独立于原始PPO训练过程使用的ONNX模型。
架构现在已经发生了巨大变化。
在训练期间:
┌──────────────┐
│ MuJoCo │
└──────┬───────┘
↓
┌──────────────┐
│ 轨迹数据 │
└──────┬───────┘
↓
┌──────────────┐
│ PPO │
│ 优化 │
└──────┬───────┘
↓
神经策略
导出后:
观测
↓
┌─────────────┐
│ ONNX策略 │
└──────┬──────┘
↓
动作
这更接近可部署的系统。
9.1 为什么ONNX很重要
ONNX — 开放神经网络交换格式 — 为训练模型提供了可移植的表示。
对于这个项目,它创建了一个非常有用的架构边界:
强化学习研究栈
│
│ 导出
▼
model.onnx
│
▼
机器人运行时
运行时不需要执行PPO优化。
它不需要训练轨迹。
它不需要奖励函数。
它需要高效地执行训练好的策略。
主要的MicroDuck机器人软件大部分是围绕基于Rust的运行时架构编写的,真正的机器人在其控制系统内执行导出的神经策略。
这使得ONNX不仅仅是一个文件格式。
它成为了机器学习研究和生产机器人控制之间的接口。
10、在仿真中运行导出的策略
在考虑物理硬件之前,我们可以再次测试导出的模型。
项目提供CPU MuJoCo推理工具:
uv run scripts/infer_policy.py \
--walking output.onnx
这是我最喜欢的工作流程阶段之一,因为它迫使我们将两个概念分开:
训练策略
从
执行策略
您不再要求PPO改进任何东西。
您只是在运行:
观测
↓
ONNX Runtime
↓
动作
↓
MuJoCo
一遍又一遍。
这与实际的运行时架构更加相似。
11、困难部分:仿真到真实世界
在MuJoCo中行走美丽的策略并不能保证它在真实硬件上也会行走美丽。
这就是著名的仿真到真实世界的差距。
仿真包含近似。
现实世界包含:
电机不准确
齿轮间隙
摩擦变化
传感器噪声
延迟
制造公差
接触不确定性
电池差异
表面差异
学会依赖不切实际的完美仿真行为的策略在部署时可能会立即失败。
因此,MicroDuck训练仓库包含了面向仿真到真实世界的技术,包括执行器物理、域随机化和间隙仿真。
从工程角度来看,这可能是项目最有价值的部分。
12、域随机化
假设模拟机器人总是具有完全相同的:
摩擦
质量
电机行为
时间
接触属性
策略可能会过拟合到那个确切的宇宙。
相反,训练可以将策略暴露给许多略有不同的宇宙。
概念上:
环境1:
摩擦 = 0.90
质量 = 0.79 kg
环境2:
摩擦 = 1.04
质量 = 0.82 kg
环境3:
摩擦 = 0.96
质量 = 0.77 kg
现在策略不能依赖于单个完全确定性的模型。
它需要学习在变化中保持有用的行为。
这是域随机化背后的核心直觉。
13、间隙不仅仅是物理细节
MicroDuck强化学习仓库更进一步,包含了模拟机器人伺服系统中齿轮间隙的间隙变体。
这说明了一个强大的原则:
微小的物理不准确性可能成为大型机器学习问题。
想象仿真器认为:
指令关节位置
≈
实际关节位置
但物理机制引入了机械间隙。
那么策略可能会学习在转移到机器人时系统性错误的假设。
解决方案并不总是:
"训练更大的神经网络。"
有时正确的解决方案是:
改进仿真器。
这是一个极其重要的机器人课程。
14、我从构建入门实验中学到的
这个项目的主要价值不是生成一个.onnx文件。
而是看到几个工程学科如何连接。
教训1:机器人强化学习是一个系统,而不是一个算法
很容易认为:
PPO = 机器人智能
真实的架构更接近:
物理模型
+
观测设计
+
动作设计
+
奖励设计
+
执行器模型
+
随机化
+
PPO
+
评估
+
运行时
PPO是一个组件。
教训2:观测契约实际上是一个API
神经网络期望特定结构的观测。
如果训练使用一个定义而部署使用另一个,即使完美训练的策略也可能变得无用。
这与软件API兼容性非常相似。
神经策略接口值得与生产API相同的工程规范:
维度
排序
单位
归一化
语义
版本
必须保持一致。
教训3:奖励函数是数学编写的产品需求
奖励告诉代理什么是"好的"。
如果您的奖励不能很好地代表预期行为,优化将忠实地利用错误。
这将强化学习与普通的需求工程惊人地联系起来。
您仍然需要定义:
期望结果
约束
失败条件
权衡
成功指标
只是现在其中一些需求是用数字编码的。
教训4:仿真成为数据生成引擎
随着数千个环境并行运行,仿真实际上正在以巨大规模产生训练经验。
不是收集静态数据集:
数据集 → 模型
机器人强化学习生成其自身不断发展的数据集:
策略
↓
仿真
↓
经验
↓
策略更新
↓
更好的策略
↓
新经验
这个反馈循环是根本性的。
教训5:部署要求应该影响训练
ONNX导出不应该是在最后一刻才考虑的事情。
面向生产的工作流程会尽早考虑最终执行环境:
将存在哪些观测?
需要什么推理速率?
网络可以有多大?
什么延迟是可以接受的?
策略将如何版本化?
失败将如何处理?
运行时能否精确重现训练预处理?
这就是强化学习实验变成机器人工程的地方。
15、实用的学习路径
如果我重新开始MicroDuck,我会使用这个进阶:
级别1 — 探索
运行浏览器仿真器。
了解现有行为能做什么。
级别2 — 检查
克隆microduck_rl。
探索:
任务
观测
动作
奖励
环境配置
还不要改变任何东西。
级别3 — 训练
运行标准的行走环境。
观察:
训练奖励
片段行为
策略演变
级别4 — 评估
用不同的命令测试训练好的策略。
寻找不稳定或病态行为。
级别5 — 导出
将学习到的策略转换为ONNX。
级别6 — 推理
通过独立的推理工作流程运行ONNX模型。
确认导出的模型行为与训练检查点相同。
级别7 — 实验
现在修改一件事。
例如:
奖励权重
速度目标
随机化
终止条件
观测
然后重新训练。
一次改变一个内容使得更容易理解因果关系。
16、一个有用的实验:改变一个奖励
一个好的入门实验不是重新设计整个机器人。
改变一个奖励系数。
假设您增加一个假设的稳定性奖励。
您的实验变成:
基线
↓
训练
↓
评估
修改后的奖励
↓
训练
↓
评估
比较
测量:
行走速度
跟踪质量
稳定性
能源使用
跌倒
恢复行为
现在您正在进行实际的强化学习实验,而不仅仅是运行别人的仓库。
17、一个更好的实验:鲁棒性
一旦基本训练有效,测试鲁棒性。
创建一个矩阵:
这开始教授仿真到真实世界背后的真正问题。
目标不是:
创建最高奖励的模拟鸭子。
目标是:
创建一个在世界不完全像仿真器时行为仍然有用的策略。
18、MicroDuck变得特别有趣的地方
有成千上万的强化学习教程。
很多在这里终止:
model.learn()
model.learn()
MicroDuck更进一步。
您可以沿着工件向下跟踪:
训练环境
↓
PPO
↓
检查点
↓
ONNX
↓
运行时推理
↓
机器人控制循环
而且,在另一个方向,您可以研究使仿真类似于真实硬件所需的内容:
真实机器人
↓
物理差异
↓
更好的执行器模型
↓
域随机化
↓
更好的仿真
↓
更可转移的策略
这种双向关系是使该项目成为良好学习环境的原因。
19、MicroDuck作为作品集项目
对于对机器人、机器学习基础设施或强化学习感兴趣的工程师,简单地说:
"我运行了MicroDuck仿真器。"
并不是特别有趣。
一个更强大的项目是:
构建了一个可重复的MicroDuck强化学习实验,涵盖仿真、PPO训练、策略评估、仿真到真实世界考虑、ONNX导出和独立策略推理。
甚至更强:
在奖励设计和域随机化上运行了受控实验,并比较了跨仿真条件的策略鲁棒性。
这展示了对多个层次的理解:
机器学习
机器人
仿真
部署
实验
系统工程
20、良好的仓库结构
如果您将实验转变为公共工程项目,我会将其结构化如下:
microduck-rl-starter-lab/
│
├── README.md
│
├── 01_simulator/
│ └── simulator_notes.md
│
├── 02_rl_environment/
│ ├── observations.md
│ ├── actions.md
│ └── rewards.md
│
├── 03_ppo_training/
│ ├── training_guide.md
│ └── experiments.md
│
├── 04_evaluation/
│ └── evaluation_checklist.md
│
├── 05_sim2real/
│ ├── domain_randomization.md
│ └── failure_modes.md
│
├── 06_onnx/
│ ├── export_guide.md
│ └── inference_guide.md
│
├── results/
│
└── lessons_learned.md
然后项目不仅仅是代码。
它成为了一个有文档记录的工程研究。
21、完整的心理模型
完成实验后,这是我希望初学者记住的架构:
训练
如果您理解了那个图表,您已经比仅仅执行强化学习笔记本的人理解得多得多了。
22、最后的想法
MicroDuck很有趣,因为它看起来平易近人。
一个小小的鸭子形状的机器人行走、滚动、踢腿和恢复。
但在那个玩乐的外表之下,是一个涉及以下内容的严肃机器人技术栈:
- MuJoCo物理
- 并行仿真
- 强化学习
- PPO
- 奖励工程
- 执行器建模
- 域随机化
- 仿真到真实世界的迁移
- ONNX
- 运行时推理
- 实时机器人控制
官方项目将该机器人描述为大约25厘米、800克的双足机器人,其策略在配套的强化学习仓库中训练,然后通过MicroDuck运行时部署。
这使得它对于想要超越玩具强化学习练习的工程师来说是一个特别好的项目。
我的实用入门实验将经验简化为一条管道:
仿真器 → PPO → ONNX
但该管道中的每个箭头都打开了更深入的工程主题。
仿真器教授物理和环境设计。
PPO教授策略优化。
奖励设计教授规范。
域随机化教授鲁棒性。
ONNX教授训练和部署之间的边界。
机器人本身提醒我们为什么所有这些抽象最终都很重要:
模型必须在物理世界中工作。
对我来说,这就是MicroDuck值得探索的原因 — 不仅仅是一个可爱的机器人演示,而是现代强化学习工程的紧凑介绍。
原文链接:From Simulation to a Deployable Robot Policy: A Practical MicroDuck RL Starter Lab
汇智网翻译整理,转载请标明出处