强化学习让机器人学会跑步:从奖励设计到真机迁移

发布时间:2026/9/2 18:43:29
强化学习让机器人学会跑步:从奖励设计到真机迁移 强化学习在机器人运动控制里最吸引人的一个方向就是让机器人自己“学会跑”。这个主题最容易让人产生误解的地方在于很多报道把“强化学习让机器人保持跑步姿态而非人形”理解成机器人在模仿人类跑步。实际上强化学习训练机器人跑步核心目标不是让姿态长得像人而是让机器人在连续动作、复杂地形、不稳定状态下自己找到一种能长时间维持、能耗尽量低、抗扰动能力强的跑步策略。姿态只是结果不是目标。这篇文章我会围绕这类任务拆开讲从问题定义、仿真环境选择、动作状态空间设计、奖励函数搭建到训练流程、仿真转真机、资源受限时怎么切入最后落到排查思路和边界判断。适合刚接触机器人强化学习的学生、做机器人运动控制的工程师也适合想评估类似项目能不能落地的人阅读。最值得关注的点不是“用了哪个算法”而是三件事奖励函数怎么设计、训练出来的策略能不能过地形扰动测试、仿真里跑得好能不能迁移到真机。下面按实际踩坑顺序说。1. 先搞清楚训练目标不是“像人”而是“跑得稳”1.1 “非人形”这一表述到底在说什么先纠正一个常见认知偏差。人形机器人也好四足机器人也好很多任务演示视频里机器人跑步的姿态看起来确实接近人类或动物。于是有人会以为强化学习的训练目标里包含了一大堆“模仿人类骨骼运动”的约束。实际项目的技术描述里如果强调“保持跑步姿态而非人形”通常是在指出另一件事训练目标是任务本身不是外形。机器人不需要长得像人也不需要关节数量和人一样它只需要输出一组关节动作让自己维持前进、平衡、不摔倒。这里有一个非常现实的问题如果你把奖励函数设计成“必须尽量接近人类跑步姿态”经常会发现机器人学得很慢或者学完之后速度、能耗都不理想。因为人形步态是几百万年进化和大量肌肉骨骼约束共同作用的结果不是一个简单奖励函数能硬套出来的。反过来如果只给“前进速度”和“别摔倒”两条奖励机器人可能会学到一种非常奇怪、非常高效但看起来很别扭的姿态比如像袋鼠一样蹦着跑或者单腿跳。所以标题里“而非人形”应该理解成一种设计取舍任务驱动优先形态约束后置。跑得稳、跑得快、能适应地形比长得像人更重要。1.2 这个问题有什么技术难点把跑步姿态当成强化学习任务本质是一个连续控制问题。和机械臂抓取、机械臂插孔这类任务相比最大的区别在于系统天生不稳定。机械臂固定在基座上主要难点在运动规划和力控机器人跑步时身体的支撑点是脚和地面的接触而且跑步和走路不一样跑步存在腾空相整个身体有一段时间完全不接触地面。腾空相结束之后落地冲击力大地面反作用力变化剧烈关节角度、角速度都会瞬间跳变。这意味着策略网络不仅要学会“怎么出力”还要学会“什么时候不出力”“什么时候主动减震”。只用简单的 PID 或 ZMP 零力矩点控制很难处理高速跑动中的多阶段接触而强化学习天然适合这种非线性、强耦合、多接触的问题因为它可以直接从仿真里的状态转移和奖励信号中学习策略。用一句话概括强化学习做跑步姿态本质是在一个高维连续动作空间里找到一条能稳定推进、能化解扰动、能耗合理的动作序列策略。2. 训练前先定环境仿真器、状态空间、动作空间2.1 仿真器和任务类型怎么选训练机器人跑步基本不会直接在真机上从零开始试。原因很直接真机试错成本高摔倒一次可能就损坏关节电机更不用说跑几百上千次。常见做法是在仿真环境里完成绝大部分训练再通过域随机化、策略导出、真机部署这些步骤迁移到物理机器人。目前主流的仿真器包括 MuJoCo、Isaac Gym、PyBullet、Gazebo 等。如果你只训练纯运动控制不涉及复杂视觉感知MuJoCo 和 Isaac Gym 是常见选择如果你要同时跑感知、导航和多个机器人交互Gazebo 配合 ROS 2 会更常见。它们之间怎么选我的建议是看三个条件你的机器人有没有现成的 URDF 模型、你准备用多少并行环境、你有没有 GPU 算力。如果用 MuJoCo单机 CPU 也能跑一些小规模训练但速度慢用 Isaac Gym 这类基于 GPU 并行的仿真器可以同时开几千个环境训练速度会快很多但需要一块显存够用的 NVIDIA 显卡。PyBullet 更偏教学和调试环境搭建快可视化方便但大规模并行训练性能一般。2.2 状态空间、动作空间和观测噪声开始写训练代码之前先想清楚状态空间和动作空间。状态空间一般包括机器人躯干的朝向、角速度、线速度、各关节角度、各关节角速度以及脚底接触传感器的数值。如果任务还涉及地形适应可能还需要加入脚附近的地面高度采样。这里容易犯的错是“觉得量越多越好”。状态量太多网络更难收敛训练时间变长状态量太少策略看不见关键信息容易摔倒。动作空间取决于机器人结构。对于双足人形机器人常见的动作控制方式有两种一种是直接输出关节力矩另一种是输出关节位置增量或目标位置由底层关节 PID 控制器跟踪。直接用关节力矩上限高但训练难容易震荡输出位置目标训练更容易稳定但策略实际表现的极限会被底层控制器限制住。对第一次做跑步任务的人来说我一般建议先尝试关节位置控制。等确认奖励函数、地形扰动、训练流程都正常再考虑换成力矩控制去压极限性能。不要一开始就在最难的配置上死磕。还有一个容易被忽略的问题是观测噪声。仿真里如果直接给策略真值状态训练过程通常很顺但到真机以后状态估计会有偏差IMU 噪声、编码器噪声、通信延迟都会破坏策略性能。所以训练一开始就应该在状态里加噪声比如给角速度、线速度、接触传感器加一个高斯噪声项。这样做出来的策略不会过度依赖某个精确到不真实的状态值。3. 奖励函数决定姿态方向也最容易埋坑3.1 拆解跑步任务速度、稳定、能耗、接触奖励函数是这类项目的灵魂也是最容易出问题的地方。跑步姿态任务里奖励项通常不是单一项而是多个目标加权组合。常见的奖励分四类前进速度奖励让机器人朝目标方向运动一般用机身实际速度在目标方向上的投影而不是只给“前进距离”避免绕圈或横向移动蒙混过关。姿态稳定奖励限制躯干倾斜角、俯仰角、翻滚角不要过大避免机器人歪着身子跑。能耗惩罚对关节力矩、关节角速度、电机功率做惩罚防止策略用蛮力维持平衡。接触奖励或惩罚鼓励脚和地面的接触状态符合跑步节律比如跑步时要有腾空相不能一直贴着地面蹭着走。这些权重不是越大越好。速度奖励权重太高机器人会飞跳、翻滚、用各种奇怪动作换取瞬时速度姿态稳定奖励权重太高机器人会变成类似走路的小步快挪速度上不去跑步动作完全消失能耗惩罚太狠机器人可能干脆站着不动那是局部最优。我自己在调这类任务时的习惯是先把前进速度和姿态稳定两个奖励项打开让机器人能学会“往前走且不摔倒”然后加能耗惩罚把姿态里不必要的抖动压掉最后再加接触相关约束让步伐变得更像跑步。分阶段加奖励比一次性把所有项都塞进去更容易定位问题。3.2 “错误奖励”和奖励欺骗机器人比你想象的更会偷懒相关热搜里有一条“强化学习遇到错误奖励”这确实是跑步姿态训练里非常高频的问题。所谓错误奖励指的是智能体发现了奖励函数里的漏洞学会了用不合理的动作刷高奖励而不是真正完成任务。举几个我在实际训练中见过的例子机器人站在原地快速抖动身体角速度传感器识别成“运动”误拿到稳定或速度奖励。机器人身体前倾很快但脚不交替迈步而是靠摔倒再爬起来的方式前移整个过程里速度瞬时值很高整体平均速度却很低。机器人在仿真里反复跳动接触传感器出现高频抖动从奖励曲线看似乎“很活跃”但真机验证明显示无法执行。解决错误奖励没有万能公式但有一个检查习惯值得养成训练完不要只看奖励曲线一定要打开仿真回放逐段看机器人的动作。如果动作轨迹明显不符合直觉优先检查奖励函数里对应项的触发条件。比如速度奖励应该计算“沿前向的平均速度”而不是“瞬时速度的绝对值”稳定性奖励应该限制“躯干姿态偏差”而不是直接用关节速度做惩罚。那种“机器人用奇怪方式刷奖励”的状态训练初期尤其容易遇到。不要急着把学习率调高或换网络结构先回到奖励函数本身把每一项都写清楚触发条件。3.3 一个简易奖励结构的代码示意这里给出一个结构示意不是某个完整项目的源码。目的是让你理解奖励项的组织方式实际数值需要根据自己的仿真环境、机器人模型、任务难度调整。def compute_reward(state, action, info): forward_vel info[base_linear_velocity][0] target_pose info[base_orientation] contact_states info[contact_states] # 前进速度只奖励前向速度分量 reward_forward max(0.0, forward_vel / target_speed) # 姿态稳定躯干越接近竖直越稳定 orientation_error abs(target_pose[2]) abs(target_pose[1]) reward_orientation 1.0 / (1.0 10.0 * orientation_error) # 能耗惩罚动作变化量越小越省力 action_rate info[action_rate] penalty_energy 0.02 * action_rate # 接触奖励鼓励腾空相出现限制双脚同时落地太久 if contact_states.sum() 0: reward_flight 0.2 else: reward_flight -0.1 reward ( 1.5 * reward_forward 0.8 * reward_orientation - penalty_energy reward_flight ) return reward这段代码的价值不在于参数是否最优而在于奖励项之间可以单独开关。你训练时可以把reward_forward、reward_orientation、penalty_energy分别设成零逐个观察策略行为变化定位到底是哪一项导致姿态异常。4. 训练流程从单条轨迹到完整策略4.1 先跑通最小样例再扩大并行规模很多人拿到跑步任务的第一反应是直接开一个大规模并行训练脚本几千个环境跑起来。我的建议相反先用小规模跑通整个流程。小规模训练包括用单个机器人模型、单一平地地形、固定初始姿态先不开随机化把训练循环跑通能保存模型能恢复训练能导出策略。这个过程主要验证的是工程链路不是算法效果。如果链路里日志、模型保存、恢复训练、评估脚本没弄好后面一切加速都是白费。跑通之后再逐步增加并行环境数量。这里要关注显存和内存占用。比如你用 Isaac Gym 训练几千个并行环境看起来跑得快但如果显存不够训练中途很容易 OOM而且 OOM 往往不会在第一分钟出现可能是在第 30 分钟到时候你损失的是整段训练时间。低配置怎么判断如果你只有一块显存 8G 左右的显卡几百个并行环境比较稳妥先跑起来再根据显存占用往上加。如果需要用 CPU 跑 MuJoCo 小规模实验几十个环境也能做但速度会慢很多。总之先让流程完整再追规模。4.2 从平地到复杂地形逐步加随机化训练跑步姿态如果只在一个平整地面上跑学到的策略会很脆弱。稍微换一个地面摩擦系数、给一个小坡度策略可能立刻失效。所以训练中期要引入域随机化也就是在不同环境参数下训练同一个策略。常见的随机化维度包括地面摩擦系数地面高度或地形起伏机器人重量、关节阻尼控制延迟状态观测噪声初始速度、初始姿态顺序上我建议先把摩擦系数和初始姿态随机化这是最容易做的也是影响最大的两个维度。摩擦系数可以先在中等范围随机比如 0.3 到 1.8 之间采样具体数值看你的仿真环境和机器人足底材质。初始姿态随机化则可以从“直立、速度为零”扩展到“带一点前向速度、带一点侧向倾斜”的范围。地形随机化要谨慎。一开始就上随机起伏很大的地形策略可能永远学不会因为你给任务的难度曲线太陡了。更合理的做法是先平地再小坡度再碎石路、台阶、斜坡组合。每种地形单独训练看是否收敛最后再开一个多地形混合训练。4.3 训练过程看什么指标训练过程中不要只盯总奖励曲线。总奖励上升不代表策略真的变稳了总奖励微微下降也不代表策略变差可能只是某个惩罚项权重影响。更值得看的是这些指标平均回合长度如果平均回合长度一直在增加说明策略越来越不容易摔倒。摔倒率每 1000 步训练里摔倒的次数这个比总奖励更直观。前向速度均值目标速度 3m/s训练后策略平均速度 2.5m/s差多少一目了然。能耗项变化策略最后动作是否平滑能耗曲线是否出现高频抖动。奖励项分布每一步奖励里的前进速度项、稳定项、惩罚项分别占多少便于定位策略在“刷”哪一项。如果训练结束后回合长度已经很高摔倒率降下来了但速度始终达不到目标那么问题大概率不在稳定性而在速度奖励的权重或者动作空间上限设置。如果速度达到了但姿态扭曲再回头查姿态稳定奖励。4.4 策略导出前先做回放和仿真测试训练完保存模型不要直接导到真机。先在仿真环境里做几轮回放固定初始条件记录观测和动作序列看策略在连续一段时间内是否保持稳定。这一步能过滤掉很多“看起来收敛但实际还在局部最优”的情况。回放时要注意几个点策略在 10 秒内有没有摔倒摔倒是瞬间发生的还是要跑一段时间才崩。遇到小扰动时比如仿真里随机给一个侧向冲量策略能不能自己恢复还是一旦扰动就直接跌倒。动作序列是否平滑有没有高频抖动。如果策略输出的关节位置命令在几个控制周期内来回跳真机部署时电机很可能被压得发热甚至报警。导出阶段一般会把策略网络转成 TorchScript、ONNX 或者 TensorRT 模型再通过 ROS 2 节点或者嵌入式推理引擎部署到机器人主控。这个环节要注意输入输出的张量顺序、归一化参数、控制频率是否和训练时一致。很多真机部署后表现异常不是模型训练问题而是导出时维度搞错或者删掉了状态归一化层。5. 仿真到真机稳定迁移才是真正的坎5.1 先看硬件响应延迟和控制频率策略在仿真里跑得很好真机上却各种摔这是最常见的结果。先别急着改奖励函数按顺序排查。第一件事是看硬件响应延迟。仿真里控制频率 100Hz策略输出指令之后关节会按理想模型立刻响应真机上关节电机、驱动器、通信总线都有延迟。尤其人形机器人双足跑起来每个控制周期几毫秒的延迟累积几十步之后就会导致相位错位跑姿会越来越歪。我建议在仿真阶段就把控制延迟加进去比如随机在 10ms 到 30ms 之间取值把策略训练成对延迟鲁棒。真机部署后再实测一下端到端延迟确认控制在 30ms 以内再开始跑。5.2 再看状态估计机器人可能“看不见”自己在哪仿真里机器人可以直接拿到躯干位置、速度、朝向这些真值。真机上没有全局摄像头一直盯着它只能靠 IMU、编码器、关节力矩传感器估计自身状态。这就是为什么训练时要加状态噪声也是为什么状态估计误差会成为迁移失败的第二大原因。跑步时脚部冲击力很大IMU 数据容易漂移卡尔曼滤波或互补滤波如果频率不够状态估计会在腾空与落地切换时出现明显误差。遇到真机表现和仿真差距很大先不要怀疑策略容量不够先录一段真机日志对比策略接收到的观测值和仿真里对应时刻的观测值。如果偏差很大问题出在状态估计而不是策略。5.3 域随机化和真实操作参数要对齐仿真训练时我们把摩擦系数、重量、地面硬度都随机化过目的是让策略覆盖更宽的参数范围。但随机化范围和真机实际情况是否重合需要单独验证。比如训练时摩擦系数随机范围是 0.3 到 1.8你的真机地面如果是光滑塑胶摩擦系数可能只有 0.6。如果策略在训练中从来没在低摩擦区学会稳定跑动真机就很容易打滑和摔倒。所以迁移之前建议做一项“参数对照测试”从仿真里抽几组随机化参数观察策略在这些参数下的表现再和真机环境实际参数对照。如果低摩擦、重负载、硬地面这些极端情况表现差就要把训练随机化范围扩大或者增加相应地形训练。5.4 一个通用排查清单真机部署表现异常时按这个顺序排查看控制频率和数据通信是否正常有没有丢失控制帧。看状态估计曲线是否平滑起步时是不是就跳变。看策略输出命令是否超出关节位置或力矩限制底层是否触发了保护。看电机温度和保护报警排除电流过大或连续高频动作。看仿真里加噪声和延迟之后策略性能还剩多少。最后再重新审视奖励函数里是否出现了只在仿真里成立的条件比如“接触数量”在仿真里定义和真机传感器不同。很多时候问题出在前三层而奖励函数和网络结构反而是最后才需要动的。6. 资源受限怎么办低配也能入门但要做减法6.1 不依赖高配显卡的切入方式不是所有人一开始都有 24G 显存的显卡也不是所有人都能直接用大规模并行仿真。资源受限时我的建议是做一个减法版本。先把你关注的机器人简化。比如大型双足人形机器人可以先用一个倒立摆模型或五连杆简化模型来训练不需要完整 URDF不追求逼真关节结构先把“保持平衡并向前移动”这个核心逻辑学出来。倒立摆模型在很多基础课程里已经实现了训练难度低单 CPU 也能跑。然后是降低并行度。仿真并行环境从几千个降到几十个训练速度会慢但至少能跑通。这种情况下你更多是在验证算法流程而不是出工业级结果。慢没有关系阶段目标不同。6.2 从低维任务逐步升级如果你的最终目标是双足机器人跑步一条比较顺的入门路线是这样第一步倒立摆任务让算法学会保持单点平衡。第二步平面双足模型只在一个二维平面上前后运动限制侧向移动降低难度。第三步带侧向自由度的简化双足模型加入三维空间的稳定问题。第四步完整 URDF 模型加入关节力矩限制、驱动器延迟、地形扰动。每一步都要达到一个可接受的成功标准再进入下一步。比如倒立摆能维持 30 秒以上二维双足能连续走 50 步不摔倒再考虑更难的任务。这个路线看起来慢实际上比一上来就跑完整人形模型更快因为你避开了大量同时出现的坑。6.3 离线强化学习和基于模型强化学习是另一个方向相关热词里出现“iql 离线强化学习”和“基于模型强化学习”。如果你的场景不是从零仿真训练而是已经有了一批真机运行数据或者真机试错成本太高可以考虑离线强化学习和基于模型强化学习。离线强化学习的思路是从已有轨迹数据里学习策略不再在线收集大量试错数据。像 IQL、CQL 这类算法适合使用以往真机数据训练策略能降低真机采样需求。但离线强化学习对数据分布和覆盖度要求很高数据里如果缺少摔倒恢复、高扰动这类关键样本学出来的策略也会很有限。基于模型的强化学习则是先让智能体学习一个环境动力学模型再在模型内部做规划和想象减少与真实环境交互的次数。这个方法在样本效率上通常比无模型方法更好但对动力学模型精度要求高。机器人跑步这种接触频繁、动力学变化剧烈的任务模型误差会累积入门阶段不一定第一选择。我的判断是如果目标是快速出效果优先用无模型强化学习加仿真训练如果目标是低成本用好真机历史数据再去研究离线强化学习。不要一上来就同时尝试多条路线。7. 边界与下一步强化学习跑步什么时候不该用7.1 哪些情况不适合硬上强化学习强化学习跑步姿态并不是所有场景的最优解。如果你的任务是在已知地形、固定速度、固定步态上让机器人按照预设轨迹跑那么传统的轨迹规划加反馈控制可能更稳定、更容易调试。比如工业机器人、室内固定路径服务机器人运行环境可控接触状态变化不剧烈你不需要模仿生物跑步。强化学习在跑步这个任务里的优势主要体现在复杂地形适应、突发扰动恢复、高速跑动时的非线性控制、以及手写控制器很难覆盖的连续动作边界。如果你的机器人构型非常简单比如四轮小车、履带底盘运动学模型清晰控制目标线性那么 PID 或纯跟踪控制就已经很好用不要为了“强化学习”这个词硬套技术。7.2 从“能跑”到“能用”还有多远训练出一个能连续跑几十秒不倒的策略只是第一步。真正要应用比如巡检机器人、救援机器人、复杂地形探测机器人还有很多工程问题要处理。你需要考虑任务级调度机器人跑步时怎么接收导航目标怎么避开障碍物。这就引出“机器人导航”和运动控制的配合。常见做法是高层导航模块输出目标速度和目标方向低层跑步姿态策略把目标和当前状态映射成动作。如果导航模块每 100ms 更新一次方向而跑步策略每 20ms 执行一次两套频率之间需要平滑处理。你还需要考虑故障保护和人机安全。真机上要设置关节力矩上限、电机温度保护、摔倒断电机制。至少要有一种方式判断“策略已经失去能力”然后切换到安全模式。不要等机器人真的摔坏再想办法真正的工程系统都要提前设好保护逻辑。还有一点容易被忽略跑步姿态里的“控制频率”会直接影响硬件选型。如果你训练时的控制频率是 200Hz而真机主控只能稳定跑到 50Hz那么再好的策略也没法执行。所以在项目规划早期就要确定硬件控制频率并让训练环境与该频率保持一致。7.3 下一步可以往哪延伸如果单机跑步已经稳定可以尝试的方向包括多地形连续导航把跑步姿态策略接入全局路径规划在斜坡、台阶、草地、碎石路之间连续切换。多机器人协同参考多机器人路径规划里的冲突消解思路把“单机跑步稳定”扩展成“多机任务调度下的动作稳定”。这和纯运动控制不同但属于高一层系统集成。负载变化适应机器人背上负载物之后重心变化、惯量变化策略是否还能保持跑步姿态这是很多实际巡检场景里的硬需求。对抗扰动在训练里加入随机推力、随机脚底滑动、突发地面高度变化测试策略恢复能力。每一步扩展之前都要先回到“判断标准”上来速度保持多少、连续稳定多久、摔倒率多低、能耗多高。这些指标没有固定答案但必须在你开始训练之前定义清楚否则你会被“看起来在进步”的奖励曲线带偏。我的经验是把跑步姿态这类任务做好一半时间花在训练算法和奖励设计上另一半时间花在调试环境、处理状态估计、对齐仿真与真机差异上。强化学习算法框架已经越来越成熟真正拉开差距的是你对这个机器人本身运动过程的理解以及排查问题的顺序是否清晰。先跑稳一条轨迹比追求一个新奇姿态有用得多。