Part 6: AI Meets Robotics · New paradigms
Chapter 16
强化学习 - 让机器人“自己学会走路”
你小时候学骑自行车,没有人给你写过一本“骑车动力学手册”。你就是骑上去,摔了,爬起来,再骑,再摔,慢慢找到那个微妙的平衡感。没人教你具体怎么分配左右手的力量、身体该往哪边倾斜几度 - 你的大脑通过无数次试错自己学会了。
强化学习(Reinforcement Learning,RL)就是这个过程的数学版本。一个 agent 在环境里不断尝试动作,环境给它反馈(奖励或惩罚),它根据反馈调整策略,直到越做越好。
对做 AI 的人来说,RL 的基本概念不陌生 - 你可能在 Atari 游戏或者 AlphaGo 的语境下已经见过它。但把 RL 搬到真实的机器人身上,事情会变得完全不同。游戏里一个 episode 几秒钟就跑完了,死了重来没有任何代价;而一台机器人摔一次,可能电机就烧了,关节就歪了,几万块钱就没了。这一章聊的就是:RL 在机器人上到底怎么玩,为什么这么难,以及行业目前真正在用的工作流是什么样的。
RL 基础:30 秒复习
如果你对 RL 已经很熟,这一节可以快速跳过。不熟的话,核心框架就五个要素:
- Agent - 学习者,也就是你的机器人(或者仿真里的虚拟机器人)
- Environment - 机器人所处的世界,包括地面、重力、障碍物、一切物理规则
- State(状态) - 当前时刻的所有相关信息。对一条机器狗来说,state 包括每个关节的角度、角速度、身体的姿态(pitch/roll/yaw)、足底是否接触地面等
- Action(动作) - agent 能做的操作。对步态控制来说,就是每个关节电机的目标扭矩或目标角度
- Reward(奖励) - 环境在每一步给 agent 的打分。这个设计非常关键,后面会细讲
整个循环是:agent 观察 state → 选择 action → 环境更新 → 返回新 state 和 reward → agent 学习 → 重复。训练目标是找到一个 policy(策略) - 一个从 state 到 action 的映射函数 - 使得长期累积奖励最大化。
在深度强化学习里,这个 policy 通常是一个神经网络。输入是 state 向量,输出是 action 向量。训练的过程就是不断更新这个网络的权重。
为什么 RL 在机器人上特别难
RL 在游戏和仿真环境里已经取得了惊人的成果 - DeepMind 的 AlphaGo、OpenAI Five 打 Dota2 - 但如果你觉得“RL 已经很成熟了”,把它往真机上搬一搬就知道了。
真实世界没有 reset 按钮。 这是最根本的区别。在仿真里,一个 episode 失败了,env.reset() 一行代码回到初始状态,毫秒级完成。在真机上呢?机器狗摔倒了,你得走过去把它扶起来、摆正姿势、检查有没有零件松动、确认传感器数据正常,然后才能开始下一次尝试。这个过程可能要几分钟。RL 训练动辄需要几百万个 episode,如果每个 episode 之间都要人工介入,你算算得多久。
硬件会磨损。 电机有寿命,齿轮会磨损,线缆会松动。RL 训练过程中 agent 会做出大量“愚蠢”的动作(特别是训练早期),这些动作对硬件的冲击是累积的。我见过有团队直接在真机上训练行走策略,两周之后关节减速器就磨损到需要更换。
数据效率极低。 RL 是出了名的 sample-inefficient。训练一个 Atari 游戏可能需要几千万帧,对仿真来说无所谓 - GPU 几小时就跑完了。但在真机上,每一帧都对应真实的物理时间。假设控制频率 50Hz,收集 1000 万帧需要大约 55 小时的不间断运行。这还是在一切顺利、不需要人工干预的情况下。
安全约束。 游戏里的 agent 可以随便作死来探索边界行为。真机上不行 - 你的机器人如果在探索过程中全速撞墙,不仅机器人坏了,可能还会伤到旁边的人。所以真机 RL 需要加很多安全约束(比如关节扭矩上限、速度限制、跌倒检测立刻停止),这些约束又会限制探索效率。
这几个问题加在一起,导致了一个现实:几乎没有人直接在真机上从头训练 RL policy。 行业的标准做法是先在仿真里训练,然后迁移到真机 - 也就是 Sim-to-Real。
奖励函数:RL 中最“玄学”的部分
在讲 Sim-to-Real 之前,必须先聊奖励函数。因为不管你在哪里训练,奖励函数设计不好,一切白搭。
表面上看,定义“走得好”好像很简单 - 向前走就给正奖励呗。但如果你只给“前进速度”这一个奖励,你训出来的机器狗可能会以一种极其扭曲的姿势向前蹭 - 它找到了一个 reward hacking 的捷径:倒在地上用身体滑行,速度确实不为零。
所以实际的奖励函数是一个精心设计的加权组合,通常包含:
- 前进速度奖励 - 核心目标,向前走
- 能量消耗惩罚 - 不要用太大的扭矩,鼓励高效步态
- 身体姿态惩罚 - 身体的 roll 和 pitch 不要偏离水平太多
- 足底接触奖励 - 鼓励某种步态模式(比如对角步态)
- 关节速度惩罚 - 不要疯狂抖动
- 存活奖励 - 每活一个 timestep 就给一点奖励,鼓励不摔倒
- 地面冲击惩罚 - 落脚太猛要扣分,保护硬件
每一项都有一个权重系数,这些系数的调整 - 说实话 - 更像炼丹而不是工程。两个看起来差不多的权重组合可能训出完全不同的步态。很多团队的做法是先用一组“经验值”开始训练,观察结果,然后反复调整。
一个真实的踩坑案例:某团队在训练四足机器人跳跃时,奖励函数里有“最高点高度”和“落地稳定性”两项。结果训出来的 policy 是机器人先蹲得很低(为了蓄力跳更高得到更多奖励),然后以一个极其奇怪的角度起跳,落地时四条腿张得很开来保持稳定。虽然“奖励数值”很高,但这个动作在真机上完全不可行 - 减速器承受不了那个蓄力阶段的极端关节角度。后来加了关节角度范围限制和关节扭矩变化率惩罚才解决。
这揭示了 RL 的一个深层挑战:你优化的是奖励函数,不是你真正想要的行为。 如果奖励函数和你的真实意图之间有缝隙,agent 一定会找到并钻进去。
Sim-to-Real:标准工作流
既然真机训练不现实,行业的做法是在仿真里训练,然后部署到真机。这个工作流大致是这样的:
Step 1:在仿真平台里搭建训练环境。 主流选择是 NVIDIA 的 Isaac Lab(前身是 Isaac Gym,基于 Isaac Sim)和 DeepMind 的 MuJoCo。两者的定位不太一样:
- Isaac Lab - NVIDIA 的 GPU 加速 RL 训练平台。它的核心卖点是并行度:可以在一块 GPU 上同时跑几千个机器人实例,物理仿真和 policy 推理全在 GPU 上完成,数据不需要在 CPU 和 GPU 之间搬运。这使得训练速度比传统方案快几十倍。目前宇树、Agility 等公司的步态训练很多都跑在 Isaac 上
- MuJoCo - 最初由 Eman Todorov 开发(后来被 DeepMind 收购并开源)。物理仿真精度极高,特别是接触力学建模。相比 Isaac Lab 的 GPU 并行路线,MuJoCo 走的是 CPU 端高精度路线,适合需要精确接触仿真的场景(比如灵巧手操作)。Google DeepMind 的很多机器人 RL 工作都基于 MuJoCo
Step 2:大规模并行训练。 这是仿真的核心优势。以 Isaac Lab 为例,你可以同时跑 4096 个机器人实例,每个实例独立运行不同的 episode。一个训练 batch 里一次就收集 4096 条轨迹数据。在一块 RTX 4090 上,训练一个四足步态 policy 通常只需要几十分钟到几个小时。
Step 3:Domain Randomization。 这一步是 Sim-to-Real 成功的关键。上一章讲 Isaac Sim 时提到了 Sim-to-Real Gap - 仿真和真实世界之间的差距。Domain Randomization 的思路是:既然没法把仿真做得和真实世界一模一样,那就在仿真里故意引入大量随机变化,逼迫 policy 学会应对各种不确定性。
具体来说,训练时会随机化:
- 地面摩擦系数(每次 episode 不同)
- 机器人的质量和惯量(模拟制造公差)
- 电机的响应延迟和增益
- 传感器噪声的幅度
- 地形的坡度和粗糙度
- 外力扰动(随机推机器人一下)
如果你的 policy 在所有这些随机条件下都能走好,那它在真实世界的特定条件下也大概率能 work。这个思路听起来简单粗暴,但实际效果非常好 - 宇树机器狗能在沙地、草地、碎石路上都稳定行走,很大程度上就是 domain randomization 的功劳。
Step 4:部署到真机。 训练好的 policy 就是一个神经网络,导出成 ONNX 或 TensorRT 格式,加载到机器人的计算平台上(通常是 Jetson)。推理频率需要匹配控制频率 - 一般是 50-500Hz。这个推理速度对现代硬件来说不是瓶颈,一个几层 MLP 的推理在 Jetson 上微秒级就能完成。
案例:宇树机器狗的步态控制
宇树(Unitree)的 Go2、B2 等四足机器人是 RL 落地最成功的案例之一。它们的步态控制 policy 就是在仿真里用 RL 训练出来的,然后直接部署到真机上。
传统的四足步态控制是怎么做的?手工设计步态模式(比如 trot 步态 - 对角线的两条腿同时摆动),然后用模型预测控制(MPC)或者中心模式发生器(CPG)来生成关节轨迹。这种方法在平坦地面上 work,但遇到复杂地形就很费劲 - 你得为每种地形写特殊逻辑。
RL 的做法完全不同:不告诉机器人“该怎么走”,只告诉它“我想要什么效果”(奖励函数),让它自己探索出最优步态。结果是,RL 训出来的步态往往比手工设计的更自然、更鲁棒。机器人能自动适应不同地形,被踢一脚也能快速恢复平衡 - 这些行为没有人显式编程过,全是训练过程中“涌现”出来的。
PPO vs SAC:怎么选
RL 算法有很多,但在机器人领域,实际用得最多的就那么几个。
PPO(Proximal Policy Optimization) 是目前机器人 RL 的默认选择。原因很实际:
- 稳定。PPO 通过 clipping 机制限制每次策略更新的幅度,不容易训崩。这对机器人来说很重要 - 你不希望训练到一半突然 policy 退化,然后机器人在仿真里开始做各种危险动作
- 并行友好。PPO 是 on-policy 算法,天然适合大规模并行数据收集。Isaac Lab 的并行架构和 PPO 简直是绝配
- 实现简单,调参相对容易。超参数不太敏感,默认值往往就能用
宇树、Agility Robotics、ETH Zurich 的 ANYmal 团队 - 目前公开的四足/双足步态 RL 工作基本都用 PPO。
SAC(Soft Actor-Critic) 是另一个常用选择,特别是在操作任务(manipulation)上。它的特点是:
- 数据效率更高。SAC 是 off-policy 算法,可以重用历史数据(经验回放),不需要每次都收集新数据。在真机微调或者仿真迭代较慢的场景下,这个优势明显
- 自带探索。SAC 优化的目标里包含一个 entropy 项,鼓励 policy 保持随机性,天然有探索能力
- 但调参更敏感。learning rate、temperature parameter 等对训练结果影响很大
简单的选择经验:locomotion(行走/跑步)用 PPO,manipulation(抓取/操作)考虑 SAC。 这不是绝对的规则,但是一个合理的起点。
还有一些其他值得关注的算法:
- DDPG / TD3 - SAC 的前身,偶尔还会在一些老项目里见到
- DreamerV3 - Model-based RL,学一个世界模型然后在“想象”中做规划,数据效率更高但实现复杂度也更高。Danijar Hafner 的工作,在一些操作任务上展示了不错的效果
开发者实际在调什么
如果你要上手一个机器人 RL 项目,以下是最常碰到的实际问题:
奖励函数调参永远是最耗时的。 前面已经说了,这里补充一点:很多团队会用“课程学习”(curriculum learning)来缓解 - 先在简单任务上训(平地行走),然后逐渐增加难度(加坡度、加扰动、加障碍物)。这比直接在最难的设置上训要稳定得多。
Observation space 的选择很关键。 你喂给 policy 的 state 信息决定了它能学到什么。喂太少,信息不够做决策;喂太多,增加学习难度还可能引入噪声。一个常见的坑是:在仿真里用了一些真机上拿不到的信息(比如精确的接触力、地形高度图),导致迁移到真机后性能暴跌。经验法则是 - 训练时的 observation 必须是真机上传感器能直接提供的。
Action space 的设计。 是输出关节扭矩(torque control)还是目标关节角度(position control)?前者更灵活但更难训练,后者更稳定但上限可能低一些。目前大多数步态控制工作用的是目标关节角度 + PD 控制器的组合 - policy 输出目标角度,底层 PD 控制器负责跟踪。
训练完之后,真机上第一次跑的那个瞬间永远是提心吊胆的。 哪怕仿真里跑了几百万个 episode 都完美,真机第一步还是可能摔倒。有经验的团队会先用吊绳挂着机器人测试 - 让它在半悬空状态下跑 policy,确认腿部动作基本合理之后再放到地上。
RL 和传统控制不是对立的
最后一个要澄清的认知:RL 不是要取代传统控制,而是在特定场景下比传统方法更好用。
很多实际部署的系统是混合架构 - 高层用 RL 做决策(比如步态选择、地形适应),底层用传统 PD 控制做关节伺服。或者用 RL 训出一个 policy 作为“参考轨迹生成器”,然后用 MPC 做轨迹跟踪和安全约束。
RL 最擅长的场景是:环境复杂到无法用规则穷举,但可以在仿真里大量试错。四足步态是典型 - 在各种地形上保持平衡涉及太多变量的耦合,手写规则不现实;但在仿真里跑几个小时就能训出一个鲁棒的 policy。
RL 不太适合的场景:需要精确到毫米级的工业操作(传统控制更可靠),或者安全要求极高不容许任何“探索性”行为的场合。
下一章会讲模仿学习 - 另一种让机器人“学会”技能的方式。如果 RL 是“自己探索着学”,模仿学习就是“看别人做一遍然后学”。两者各有所长,很多时候会结合使用。