公司动态
强化学习让机器人跑出非人形步态:从奖励设计到Sim2Real实战
这次我们看一个机器人运动控制里非常典型的题目让机器人跑起来而且要跑出属于机器人自己的跑步姿态不是复刻人形跑步动作。很多人一听到“跑步姿态”下意识会觉得目标是让机器人像人一样摆臂、抬腿、前倾但强化学习这套方法恰恰相反——它并不会盯着“人形”去模仿而是从机器人自身动力学出发跑去最大化“跑得稳、跑得快、能耗低”这些更底层的目标。最后你会发现四足机器人可能跑出对侧小跑双足机器人可能跑出屈膝高频小步幅姿态看起来不一定“像人”但确实是在跑步。这类工作真正要解决的其实是两步问题第一步强化学习策略到底优化什么也就是奖励函数怎么设计第二步仿真里学好的策略怎么迁移到真实机器人上也就是 Sim2Real 怎么做。现在很多开源项目已经把仿真环境、训练脚本、部署接口打包得很完整比如 legged_gym、Isaac Lab、MuJoCo MPC 生态但真正跑通从奖励到实物全流程的人并没有想象中那么多卡点往往集中在奖励权重、域随机化程度和实物部署安全边界这三块。这篇文章会围绕“强化学习让机器人保持跑步姿态而非人形”这个主题给出一套可以照着做的技术流程。内容覆盖基础概念辨析、仿真环境准备、奖励函数代码、PPO 训练、TensorBoard 效果验证、Sim2Real 迁移、资源占用观察、常见问题排查和合规最佳实践。目标只有一个让你看完之后知道从哪下手也知道最容易被什么坑拦住。1. 核心能力速览先把整个技术方案的关键信息放在前面。能力项说明技术方向强化学习驱动的机器人跑步步态生成以 PPO 等在线强化学习为主可扩展离线强化学习典型机器人平台四足机器人、双足机器人、轮足混合机器人覆盖 Unitree Go1/A1、Aliengo 等结构核心训练工具Isaac Lab / Isaac Gym、MuJoCo、Gazebo、legged_gym 等奖励设计目标速度跟踪、躯干姿态稳定、关节平滑、能耗约束、扰动恢复训练算法PPO 为主按需使用 SAC、IQL 等离线或在线算法训练端硬件门槛建议使用支持 CUDA 的 NVIDIA GPU具体显存依赖并行环境数和策略参数量部署端硬件只需要策略网络推理常见机器人主控 CPU 即可运行小规模 MLP 策略启动方式训练脚本启动TensorBoard 观察训练曲线导出模型后部署到实机接口能力仿真环境提供环境步进接口部署端可封装策略推理接口供控制循环调用批量能力支持多环境并行训练、批量步态参数扫描适合场景四足快速巡检、双足快速移动、复杂地形动态步态、抗扰动运动控制需要说明的是表格里没有写死某个具体版本号也没有给出固定的显存数字。原因很简单不同机器人模型、不同并行环境数量、是否启用视觉输入训练资源差异会非常大。更稳妥的判断是先用小批量环境验证流程再逐步增加并行度。2. 先搞清楚一个问题为什么“非人形”反而是优势“保持跑步姿态而非人形”这句话从技术角度理解其实有两层含义。第一层含义是任务目标上的差异。传统动画或者动作捕捉领域跑步姿态通常指的是“看起来像人类的跑步动作”比如手臂摆动角度、躯干前倾幅度、脚掌落地顺序这些指标都是以人类运动学数据为参照系。但在机器人运动控制里如果直接把人类步行数据作为目标去跟踪往往效果很差。因为机器人的关节数量、力矩特性、质量分布和人类并不一致强行追轨迹会给电机带来极大负载还可能造成步态僵硬。第二层含义是强化学习方法的本质。强化学习不直接告诉机器人“每一步应该摆到什么角度”而是告诉它“向前跑的时候别摔倒别浪费能量保持身体大致水平”。至于怎么迈腿、怎么摆臂、用什么样的步频完全由策略网络在探索中自己发现。这也是为什么很多四足机器人跑出来的步态跟生物学上动物跑步非常接近但又不是完全照搬。它是在机器人自身动力学约束下找到的最优解。这正是“非人形”的价值所在。当你不去追求外观模仿时策略网络有了更大的搜索空间。它可能发现高速跑步时减少腾空时间更稳定也可能发现在斜面地形上略微降低重心更安全。这些行为不是人设计出来的是奖励函数和随机环境“逼”出来的。对于机器人工程师来说这才是强化学习相对于传统 MPC 和轨迹规划最有吸引力的地方。3. 适用场景与使用边界这套方法适合什么人、解决什么问题需要提前讲清楚。从场景上看“强化学习跑步步态”最直接的应用是四足机器人和双足机器人的快速移动任务。四足机器人可以用在厂区巡检、物流运输、复杂地形搜救跑步步态能够显著提高移动速度和越障能力。双足机器人则更多集中在服务型机器人快速响应和动态平衡研究上。如果任务本身对移动速度要求不高普通行走步态就够用不一定需要专门训练跑步。从读者角度来说这篇文章适合算法工程师、机器人控制工程师、仿真工程师以及正在做毕业设计或竞赛的学生。你不需要一开始就有一台真实机器人仿真环境里完全可以把策略训练和步态验证跑通。等到策略稳定后再考虑迁移到实物平台。但也有几个不建议的场景。一是如果你的目标是要生成“拟人化动画”那强化学习跑步训练不是最优解应该直接去看动作捕捉和动画风格迁移。二是如果你的训练预算非常有限比如只有一台没有独立显卡的电脑那么大规模并行强化学习训练会受到明显限制可以考虑降低并行环境数或者在 MuJoCo 这类轻量级仿真里做小规模实验。三是如果任务对安全性要求极高且没有足够的仿真验证时间不建议直接跳到实物上做高强度跑步实验应该先从低速、悬挂、有限位保护的状态开始。边界方面还要强调合规。机器人跑步训练涉及电机功率输出和物理碰撞实物测试时必须设置机械限位、紧急停机和软硬件双重保护。使用公开仿真资产、机器人 URDF 模型和开源代码时要遵守对应许可证要求。如果训练数据或部署场景涉及人员、隐私或版权素材需要先确认授权。4. 环境准备与前置条件开始训练之前先把环境理清楚。4.1 操作系统与编程环境从当前开源社区的主流做法看Ubuntu 22.04 搭配 Python 3.9 或 3.10 是兼容性较好的组合。PyTorch 版本建议选择与 CUDA 匹配的稳定版本。如果你使用的是 Isaac Lab 或 legged_gym需要额外确认它们对 Isaac Sim 版本的要求因为不同版本之间 API 差异比较大。一个完整的实验环境包括Ubuntu 操作系统或带 CUDA 支持的 Windows 环境Python 虚拟环境推荐 conda 或 venvCUDA 驱动和 PyTorchGPU 环境建议先跑通torch.cuda.is_available()机器人模型文件URDF 或 MJCF 格式仿真平台Isaac Lab、Isaac Gym 或 MuJoCo可视化工具TensorBoard 或 Weights Biases模型导出工具如 ONNX 导出依赖。4.2 硬件门槛与资源预判训练阶段建议有一块支持 CUDA 的 NVIDIA 显卡。这里不写死具体型号因为不同机器人模型和并行环境数差异很大。从经验上看小规模实验可以先从 256 或 512 个并行环境开始观察显存和 GPU 利用率再逐步增加。如果不启动渲染显存占用会明显下降如果使用 RGB 图像作为视觉输入显存压力会成倍增加。部署阶段则宽容很多。跑步策略通常是一个输入几十维状态、输出十几维或二十几维关节动作的 MLP 网络参数量可能只有几十万到一两百万。这类网络在常见机器人主控器上 CPU 推理即可达到较高频率真正影响控制频率的是传感器读取、状态估计和通信延迟。4.3 目录结构建议建议把项目文件按以下方式组织后续批量实验和排查会省很多事rl_run/ ├── envs/ │ ├── robot_env.py │ └── reward_terms.py ├── configs/ │ ├── train_rl.yaml │ └── robot_params.yaml ├── data/ │ ├── logs/ # TensorBoard 日志 │ ├── checkpoints/ # 模型权重 │ └── videos/ # 仿真步态视频 ├── scripts/ │ ├── train.py │ ├── evaluate.py │ └── export_onnx.py └── deploy/ ├── policy_runner.cpp └── state_estimator.py5. 奖励函数设计跑步步态怎么写代码奖励函数是整个强化学习跑步训练的核心。机器人的跑步行为不是“写”出来的而是“奖励”出来的。下面给出一套通用跑步步态奖励函数模板代码基于 PyTorch 风格实际使用时需要根据自己项目里的观测空间做适配。import torch def compute_reward(obs, actions, target_velocity): # 1. 速度跟踪奖励 base_lin_vel obs[base_linear_velocity] # [num_envs, 3] current_xy base_lin_vel[:, :2] target_xy target_velocity[:, :2] vel_error torch.norm(current_xy - target_xy, dim-1) vel_reward torch.exp(-vel_error) # 2. 躯干姿态奖励 base_roll obs[base_roll] # [num_envs] base_pitch obs[base_pitch] # [num_envs] posture_error base_roll**2 base_pitch**2 posture_reward torch.exp(-posture_error) # 3. 关节变化平滑奖励 action_diff torch.mean( torch.abs(actions[:, 1:] - actions[:, :-1]), dim-1 ) smooth_reward torch.exp(-action_diff) # 4. 能耗惩罚 joint_torque obs.get(joint_torque, torch.zeros_like(actions)) energy_penalty torch.mean(joint_torque**2, dim-1) # 5. 综合奖励 reward ( 1.5 * vel_reward 0.3 * posture_reward 0.1 * smooth_reward - 0.002 * energy_penalty ) return reward这段代码里有几个值得注意的点。速度跟踪奖励用指数衰减形式而不是直接用速度误差的负值。主要原因是指数函数把奖励范围压缩到 0 到 1 之间梯度变化更平滑策略在训练初期不会因为速度误差太大而彻底失去学习信号。躯干姿态奖励同理目标是让机器人在跑步过程中尽量保持躯干接近水平但不需要精确到什么角度误差小到一定程度就认为合格。关节平滑奖励解决的是高频抖动问题。如果只优化速度策略网络很容易学会高频摆腿看起来在快速移动但电机受力极差、关节振动明显。这个奖励项会惩罚相邻控制步之间的动作突变。能耗惩罚是最后一道约束。跑步步态的能耗通常比行走高但也不是越高越好。加入力矩平方惩罚后策略会在满足速度要求的前提下倾向于选择更节省能量的步态。需要注意的是这个权重需要慢慢调如果太大机器人会倾向“不跑”、慢慢走如果太小训练出的策略可能动作非常剧烈。除了这些核心项实际跑步任务还经常加入以下辅助奖励足底接触模式奖励鼓励机器人按跑步节奏切换支撑相和腾空相高度奖励鼓励躯干保持在合理高度范围避免贴地或过度跳跃方向奖励鼓励机器人沿目标方向前进而不是斜着跑防碰撞惩罚约束肢体之间或肢体与地面之外的物体发生碰撞。奖励权重没有标准答案但有一个相对有效的调试顺序先只保留速度跟踪和姿态奖励确认机器人能跑起来再加入平滑和能耗项解决动作质量最后加入任务相关的额外项比如方向、高度、步态节奏。6. 训练流程与算法选择6.1 算法选型跑步步态训练最常见的算法是 PPO。原因有三。一是稳定PPO 对超参数不那么敏感适合奖励函数经常调整的早期阶段。二是天然支持大规模并行环境Isaac Lab、legged_gym 这些框架的示例基本都基于 PPO。三是社区问题沉淀多遇到不收敛、崩溃或者效果差的时候容易找到参考。如果训练预算有限又希望从已有步态数据中学习可以考虑离线强化学习比如 IQL。这类方法需要一份包含状态、动作、奖励的数据集训练阶段不再需要在线交互可以在一定程度上减少真实机器人试错成本。但离线数据质量会直接影响最终性能数据集里如果缺少高速跑步样本策略很难学会高速跑步。6.2 课程学习与域随机化直接让机器人从零开始跑步成功率很低。更实用的做法是课程学习先从平地上低速行走开始速度目标逐步提高到跑步区间等平地跑步稳定之后再加入小坡度、小扰动、随机摩擦系数。域随机化是 Sim2Real 的关键步骤。训练时随机化摩擦系数、电机强度、关节阻尼、负载质量和通信延迟让策略在多种动力学参数下都能保持稳定。这样迁移到真实机器人时即使模型参数存在误差策略也不会立刻崩溃。常见做法是在每个 episode 开始时从分布中采样一组动力学参数。6.3 训练启动方式下面给出一个训练命令模板实际命令需要根据你使用的框架调整。# legged_gym 风格示例需要按实际任务名修改 cd rl_run python legged_gym/scripts/train.py \ --taskgo1_run \ --num_envs2048 \ --headless# Isaac Lab 风格示例 cd rl_run python scripts/train.py \ --taskUnitree-Go1-Run \ --num_envs2048 \ --headless \ --max_iterations20000训练日志会输出到指定 log 目录建议养成每 500 到 1000 步保存一次 checkpoint 的习惯。训练到一半如果发现奖励设计有问题还可以从上一个 checkpoint 继续调。6.4 训练过程观察使用 TensorBoard 观察训练曲线tensorboard --logdir logs重点看四条曲线episodic_reward回合总奖励应该整体上升mean_survival_time机器人平均存活步数跑步任务里就是“没摔倒的时间”policy_loss策略损失应该稳定而不是剧烈震荡velocity_tracking_error速度跟踪误差应该逐步下降并收敛到较小范围。如果奖励总是不升或者明显上升但机器人还是跑不起来优先怀疑奖励权重和观测特征而不是急着换算法。7. 功能测试与效果验证训练完成后需要进行系统的仿真验证。不要只看总奖励要看具体行为指标。7.1 平地跑步速度跟踪测试任务在平坦地面给机器人设定不同的目标速度观察它能否达到并保持。输入目标速度从 1.0 m/s 逐步提高到 3.0 m/s操作每个速度段持续 5 秒以上记录实际速度曲线预期结果实际速度能稳定接近目标速度误差在可接受范围内判断标准速度波动幅度小机器人不摔倒躯干倾角保持稳定。速度跟踪是跑步步态最核心的验证项。如果机器人在低速下正常、高速下摔倒说明奖励函数里速度项权重不足或者训练时最大目标速度设置太低。7.2 姿态稳定性与步态周期分析跑步的定义不只是速度快还需要有清晰的步态周期。可以录制仿真视频或者从日志中提取关节角度、足端接触信号。一个简单的步态统计脚本可以这样写import numpy as np # 假设已经从训练日志中读取了足端接触信号 # contact_phase 形状为 [T, 4]表示四足各自的触地状态 contact np.load(contact_phase.npy) # 统计支撑相与腾空相时长 swing_phase 1.0 - contact.mean(axis1) # 任意时刻腾空 flight_idx np.where(swing_phase 0.5)[0] if len(flight_idx) 0: print(没有检测到明显的腾空相可能还在走不是跑) else: # 统计腾空占比跑步步态的腾空相会显著高于行走 print(f腾空时间占比: {len(flight_idx) / len(contact):.2f})这个脚本只是非常粗略的判定方式。实际跑步步态还需要看步频、对称性、触地顺序。但至少能帮你分辨策略到底是在“快走”还是在“跑步”。7.3 扰动恢复测试在机器人稳定跑步时施加突发推力或者突然改变地面摩擦系数观察策略是否能快速恢复平衡。操作方式一在仿真环境里给 base link 施加一个短时水平力操作方式二把跑步路径中间的一段地面摩擦系数调小 50%预期结果机器人速度短暂变化后能恢复躯干不持续倾斜不摔倒失败排查如果一推就倒说明训练时域随机化程度不足或者姿态奖励权重太低。7.4 长距离连续跑步测试让机器人连续跑步 60 秒以上观察策略是否出现周期性的能量堆积、关节发热、姿态漂移。仿真里可能不明显但连续跑步数据能帮你判断策略是否收敛到稳定策略而不是阶段性表现。7.5 判断训练是否成功的标准一组可参考的判断标准目标速度区间内速度跟踪误差小于某一个稳定范围躯干滚转和俯仰角度保持在小角度范围内各个关节角度不存在明显的高频振荡策略对随机扰动具有恢复能力连续跑步时不会周期性地摔倒。如果以上标准都满足策略就可以进入 Sim2Real 迁移准备阶段。8. 从仿真到实物Sim2Real 迁移与部署仿真里跑通的策略迁移到真实机器人上时通常会经历性能下降这是 Sim2Real gap 的客观存在。降低这个 gap 的核心手段是训练阶段做域随机化但部署阶段本身也要做足够多的工作。8.1 模型导出先将 PyTorch 策略导出为部署格式常见做法是导出 ONNX 或直接保存 TorchScript。import torch policy torch.load(checkpoint_latest.pt) policy.eval() dummy_input torch.randn(1, policy.input_dim) torch.onnx.export( policy, dummy_input, policy_run.onnx, input_names[obs], output_names[action], dynamic_axes{obs: {0: batch}, action: {0: batch}}, )ONNX 文件的好处是部署端不依赖完整 PyTorch 环境可以用 ONNX Runtime 加载也可以转换到 TensorRT 等推理引擎。8.2 部署控制循环真实机器人部署时控制循环通常是这样读取关节编码器、IMU 数据通过状态估计得到机器人当前线速度、角速度、躯干姿态组装策略输入向量推理得到关节动作目标通过底层电机控制器输出力矩等待下一个控制周期。这里需要特别强调的是控制频率。跑步步态的动力学变化比行走快得多控制频率如果太低策略的下一步动作已经不符合当前状态很容易摔倒。具体频率取决于机器人平台但建议先看原仿真环境使用的频率再在实物上接近或保持一致。8.3 实物部署的安全步骤第一步悬挂测试把机器人悬挂在安全支架上让腿在空中运动检查关节动作是否正常、模型是否出现异常抖动第二步低速平走测试在平整地面以 0.3 m/s 到 0.5 m/s 的速度运行确认转向和姿态稳定第三步中速快走测试逐步提升速度观察跑步姿态是否出现第四步受限跑步测试在开阔、无人的场地进行高速跑步旁边设置急停按钮和防护措施第五步扰动测试在低速状态下人工轻轻干扰机器人确认恢复行为符合预期。每一步开始前都要检查机械限位、电机温度、电池电压和通信延迟。任何异常都要停止测试先回到仿真里复现问题。9. 资源占用与性能观察9.1 训练阶段资源观察训练时资源占用直接影响迭代效率。建议打开两个终端分别观察 GPU 和 CPUnvidia-smi -l 2htop重点观察几个指标GPU 显存占用主要取决于并行环境数量、环境是否渲染、策略网络大小GPU 利用率如果利用率低说明数据生成可能受 CPU 仿真瓶颈限制CPU 负载多环境仿真会占用较多 CPU 核心内存占用长时间训练可能堆积日志和缓存。如果显存不足最直接的办法是降低num_envs。不要急着调小 batch size因为 RL 训练对 batch size 有基本要求太小会影响梯度稳定性。如果 CPU 是瓶颈可以考虑关闭环境渲染、减少不必要的物理碰撞体或者升级 CPU。9.2 部署阶段资源观察部署端的资源占用更多看控制频率。策略推理本身不重真正占用资源的是状态估计滤波、传感器驱动和通信协议。建议对一次完整控制循环做时间测量import time # 部署控制循环示例 def control_step(): start time.perf_counter() obs collect_observation() action policy_inference(obs) send_action_to_motors(action) elapsed time.perf_counter() - start return elapsed如果单次控制循环耗时接近甚至超过控制周期问题通常不在策略推理而在传感器读取或者电机通信。需要优先优化这些环节而不是把策略换小。9.3 降低资源占用的一般策略训练阶段先开 512 个并行环境跑通流程再逐步增加关闭渲染仿真训练不需要可视化时使用 headless 模式降低视觉输入分辨率如果用到相机从 64x64 或更低开始批量评估写完一次评估脚本批量跑多个目标任务速度清理日志定期清理旧 checkpoint避免磁盘满载。10. 常见问题与排查方法问题现象可能原因排查方式解决方案训练不收敛奖励一直不升奖励稀疏、权重不合适、观测缺少关键信息查看每个奖励项各自的曲线分阶段增加辅助奖励先跑通速度跟踪仿真中频繁摔倒电机力矩不足、控制频率太低、步态频率过低检查动作范围与关节力限制提高控制频率降低目标速度或增加关节力限制仿真跑得好实物不稳Sim2Real gap对比仿真与实物的摩擦、延迟、质量参数增加域随机化标定真实机器人动力学参数策略输出动作高频抖动缺少平滑奖励、控制频率不匹配观察动作曲线是否振荡增加关节平滑奖励或对动作输出做低通滤波显存不足并行环境数过多nvidia-smi 查看占用降低 num_envs使用 headless 模式训练速度慢CPU 仿真瓶颈或 batch size 过小htop 查看 CPU 负载关闭渲染优化物理场景复杂度实物测试中机器人有一侧明显不协调状态估计偏差或关节标定不准检查两侧关节零点与传感器数据一致性重新标定零点校验状态估计结果低速行走可以高速跑步时摔倒速度目标太高训练分布覆盖不足统计训练时的目标速度分布用课程学习逐步提升速度区间11. 最佳实践与合规建议把整个流程跑通之后有几条工程经验值得固化下来。奖励调试要有记录。每次修改权重都记录一下改动内容和训练曲线的差异。强化学习训练成本高如果每次都是凭感觉调参很容易在同一个问题上反复横跳。建议在 checkpoint 文件名或日志目录里带上奖励版本号。训练顺序很重要。先验证“能跑”再优化“跑得稳”最后才是“跑得快”。如果在初期就加入大量约束策略很可能变成原地不动或者慢走因为那样能耗低、姿态稳、平滑项也完美但速度跟踪失败。这也是为什么速度跟踪奖励权重往往是最大的一项。批量实验要有任务管理意识。强化学习训练会同时生成大量日志、视频和 checkpoint建议按日期和实验目的组织目录。需要做参数扫描时使用 Python 脚本批量生成配置而不是手改 YAML。合规方面需要特别注意几点。实物机器人测试必须设置安全围栏和急停装置跑步速度下机器人摔倒可能造成设备损坏或人员受伤。仿真资产、机器人模型、开源训练代码如果来自公开项目要遵守对应开源许可。如果训练数据包含人物、人脸、声音或者受版权保护的素材必须提前获得授权。强化学习方法本身的目的是提升机器人自主运动能力不应该被用于对人或动物的伤害性应用也不应该用于规避安全控制机制。公开发布实物测试视频时注意脱敏和场地安全信息。12. 总结与下一步“强化学习让机器人保持跑步姿态而非人形”本质上是一个奖励设计问题而不是动作模仿问题。跑通这套流程后你会对“机器人自主发现步态”这件事有非常直观的感受刚开始机器人像喝醉了酒中间开始会走然后突然出现一个很像跑步的步态模式而这整个过程你并没有给它指定任何一条关节轨迹。这种从零探索带来的行为涌现是强化学习在机器人控制里最值得体验的部分。建议第一次实验时先用一个简单的四足模型在平地环境验证“速度跟踪奖励 姿态奖励”的组合把目标速度设到 1.0 m/s 左右跑通训练和评估闭环。最容易踩的坑有两个一是奖励权重调整过于激进二是训练刚有起色就急着上实物。前者会让策略反复在“走”和“跑”之间震荡后者会直接把 Sim2Real gap 变成实战事故。下一步可以从三个方向扩展一是加入视觉输入让机器人根据前方地形调整跑步步态二是引入离线强化学习用已有的步态数据集训练策略减少在线试错成本三是部署到真实四足平台在安全场地做中高速跑步和扰动恢复测试。路线上建议先把仿真验证做充分再逐步向实物推进。