☰
人形机器人学习控制实战:模仿学习+强化学习全链路解析
2026/10/22 14:09:19 网站建设 项目流程

人形机器人这几年热度一直居高不下,但真正上手做过的朋友应该都有体会:用传统控制去搞定一台双足机器人的稳定行走、转身、抓取,调试周期往往按月算,稍有模型误差就得重新调参。我自己在做人形机器人控制时,最有效的路线反而是把模仿学习和强化学习这两套东西组合起来用——前者用人类动作数据给策略一个起步点,后者在模拟器里反复试错把鲁棒性刷出来。这篇文章就把我从数据采集、奖励设计、模拟训练到真机迁移整条链路拆开讲清楚,适合正在做具身智能、机器人控制或者想了解人形机器人算法落地的工程师和研究者参考。

1. 人形机器人为什么绕不开学习控制这条路线

1.1 传统控制方法卡在哪

先说传统控制。人形机器人本质上是一个高维度、强耦合、变拓扑的多刚体系统:两条腿加起来十几个关节,每只脚落地和离地时接触状态都在切换,跟地面之间还有摩擦和形变。传统方法通常要先把机器人简化成质心模型或者倒立摆模型,再在线跑模型预测控制或全身控制来规划质心轨迹和关节力矩。

问题在于,这种建模方式对“模型准确度”的要求非常苛刻。你把机器人放在平整的水泥地上,参数调好了能走,一旦换到地毯、斜坡或者有点小石子的路面,模型里的摩擦系数、接触刚度全都要重新估计。更麻烦的是,传统控制里每一步都在做“当前状态的优化求解”,计算开销大,而且很难把“遇到扰动怎么调整重心”这种经验沉淀进控制器里。

用一个生活化的类比来解释:人走路时并不会在每一个瞬间精确计算每条肌肉该出多少力,更多是靠“快倒了就往反方向迈一步”这种条件反射式经验在维持。传统控制想用公式把每一步算清楚,结果就是算得很慢还很脆;而学习控制正好能让机器人从大量数据中自己总结出这种“走路的直觉”。

1.2 模仿学习和强化学习各扛什么活

模仿学习(IL)和强化学习(RL)是学习控制的两条主要路径,它们解决的问题其实是互补的。

模仿学习的思路很简单:你给我看专家是怎么做的,我把“状态到动作”的映射关系学出来。具体来说就是收集人在操作、行走时的状态轨迹和动作轨迹,然后用监督学习训练一个策略网络,让机器人的动作尽量模仿示范样本。这个方案的优点是起步快,只要数据录得好,一下午就能让机器人学会一个有模有样的技能雏形,比如握手、搬箱子这类操作性任务。

强化学习的思路完全不同:不给你示范,给你一个奖励函数,让机器人在模拟器里自己随便试。走对了给正奖励,摔倒了给负奖励,几千万次试错之后策略自然涌现。它最大的优势是能探索出远超示范覆盖范围的行为——示范数据里没有的高速奔跑、急停转身,RL照样能学出来。

那为什么一定要把两者组合用?因为纯底靠模仿学习,策略上限被示范数据的多样性锁死,数据里没出现过的状态基本就会崩;纯靠强化学习,冷启动的时候效率极低,奖励函数稍微设计得不够细致,机器人就会卡在某个奇怪的局部最优里出不来。我常用的做法是先通过模仿学习让策略学个大概动作,再利用强化学习在模拟器里进一步“强化打磨”,这叫warm start,能同时规避两个方案各自的缺陷。

2. 模仿学习:从数据到策略的完整链路

2.1 示范数据从哪来

模仿学习的第一步是数据,这一步的质量直接决定后续策略的天花板。常见的数据来源有三类:光学动捕、遥操作采集和视频学习。

光学动捕是精度最高的方案。在人的关键部位贴上标记点,由动捕系统记录三维位置和姿态,再通过重定向算法映射到机器人的关节空间。问题是成本高、环境受限,而且动捕拿到的是人体运动学数据,跟机器人本体结构往往不一致——人的手臂关节定义和机器人的关节限位不一样,骨骼长度也不一样,必须做重定向和限位裁剪。

遥操作是更接地气的方式。操作者穿上全身外骨骼或者用主手控制从手,直接操作机器人完成动作,同时记录机器人实时的关节角度、角速度、力矩这些状态量。这套方案的优点就是“录出来的数据天然匹配机器人本体”,不需要做太多重定向,问题在于遥操作设备本身有学习成本和疲劳度限制,长时间采集容易混入大量低质量轨迹。

视频学习则是近几年兴起的方案,直接从人做动作的视频中提取动作语义和轨迹,比如抓个杯子、叠个衣服。由于视频没有精确的关节力矩信息,这类方法通常更依赖大模型来补全中间状态,落地难度其实更高。

实操中有几个关键细节容易被忽略:数据一定要覆盖一个动作的多种变化。比如学“拿起水杯”,如果只在固定位置录了一次示教,策略基本只能记住那一个位置;至少要变着杯子的位置、朝向、抬手路径录几十到上百条轨迹,策略才具备基本的泛化能力。数据里也要主动注入一些“半成功或者失误后修正”的片段,这样策略在出错时才知道怎么自我纠正,而不是直接瘫痪。

2.2 行为克隆和它的分布偏移

行为克隆(BC)是最直观的模仿学习算法:把采集到的状态-动作对当成训练数据,用监督学习让策略网络拟合专家的动作分布。训练本身没有什么难点,一个多层MLP或者Transformer都能工作,真正坑人的是“分布偏移”问题。

分布偏移可以用一句话概括:训练时策略看到的全是专家状态,推理时只要出了一次错,机器人就进入了一个训练分布之外的陌生状态,然后再也回不来了。拿走路来说,训练数据里的身体姿态都是比较正的,一旦某个小扰动让机器人躯干歪了5度,这个歪着的状态训练时几乎没见过,策略瞬间不知道怎么输出动作,于是越走越歪,最终摔倒。

解决分布偏移有两个很实用的办法。第一是训练时给状态加噪声——把专家状态向量随机加上高斯扰动,相当于强迫策略学会在偏离理想状态时也能输出纠正动作。我实测下来,加噪声训练效果立竿见影:不加噪声时策略连续执行几秒就崩,加噪声后能连续执行几十秒,稳定性提升非常大。第二是采用DAgger这类在线交互算法,让策略边执行边由人类专家纠正错误状态,把纠正轨迹不断混入训练集,这适合有真机或者高保真仿真器的场景。

2.3 扩散策略与多模态动作生成

近几年模仿学习领域很值得关注的进展就是扩散策略(Diffusion Policy)。传统行为克隆网络学的是“给定状态输出一个确定动作”,但很多机器人任务天然是多模态的——同样是拿杯子,手可以从杯子上方抓,也可以从侧边绕过去抓,两种方案都合理。确定性网络只能输出一个平均结果,训练数据里那些“不同但合理”的动作会互相打架,最终学出一个四不像的中间动作。

扩散策略的思路是:把动作生成当成一个从噪声中逐步去噪的过程。它不直接输出单一动作,而是输出一个“动作轨迹的分布”,采样时每次生成一段完整动作序列。由于生成过程天然保留了多模态性质,策略就能在不同采样下表现出不同的合理行为。这个特性对操作类任务尤其重要,人形机器人做双手协作时,每个手的分工方式变化很多,确定性策略很难覆盖。

在实际落地时,扩散策略的注意力输入通常包含机器人状态、点云或者视觉特征,输出是未来一段时间(比如2到5秒)的关节位置序列。去噪步数一般设8到16步,太多影响实时性,太少动作又不够平滑。我建议在算法上线前先用仿真环境跑几轮,重点看生成轨迹的平滑性和成功率,这两项达标了再考虑上真机。

3. 强化学习:在模拟器里摔出走路能力

3.1 状态、动作、奖励先想清楚

强化学习在人形机器人上最典型的应用就是训练行走、奔跑、跳跃这类全身运动技能。训练之前,先把状态空间、动作空间和奖励函数这三件事想明白,可以省掉后面一大半的调参时间。

状态空间一般会把关节角度、关节角速度、足底接触力、躯干姿态(IMU)、线速度和角速度、目标速度以及上一时刻的动作拼在一起,总共大概几十到上百维。设计原则是“该有的信息都要有,但不相关的维度尽量砍掉”:理论上机器人每个关节都能提供状态,但手腕末端关节对腿部行走帮助不大,加进去只会增加网络负担。同样,状态里一定要把目标命令(比如前进速度、转弯角速度)包括进去,否则策略不知道用户想让机器人干什么。

动作空间的选择更关键。直接用关节力矩作为动作会让RL训练极其不稳定,因为力矩和运动之间还隔着复杂的动力学和摩擦。更通用的做法是让策略输出“关节位置目标”,再交给底层的PD控制器转换成关节力矩,这样策略学的其实是“该摆什么姿势”,底层跟踪由控制算法兜底。PD控制器的刚度、阻尼参数通常提前调好,训练中固定不变。

奖励函数的设计就是真正的“炼狱”环节了。以训练行走为例,核心奖励是“实际前进速度跟上目标速度”,差异越小奖励越高。但单有这个奖励,机器人大概率会学出一些“作弊”动作,比如躯干前倾猛冲、步子迈得极大或者膝盖一直半屈着走。因此奖励函数必须包含一组惩罚项:躯干姿态偏离直立太远要惩罚、关节活动到极限要惩罚、动作变化率太剧烈要惩罚、足底非预期滑移要惩罚。这些惩罚项的权重一般比主任务奖励小一到两个数量级,但缺了它们策略就会走形。

3.2 PPO训练中的工程难题

具体算法上,当前人形机器人RL训练基本被PPO这类策略梯度方法统治,原因在于它稳定、对奖励尺度不敏感,而且在GPU并行仿真场景下实现成熟。PPO本身原理并不复杂,训练过程中的工程问题才是真正劝退人的地方。

最常遇到的是观测归一化问题。状态向量的各个维度量纲差异很大,关节角度可能是零点几弧度,IMU角速度可能是每秒几弧度,如果这些原始值直接喂进网络,训练速度会慢得让人怀疑人生。解决办法是在训练前统计每个维度的均值和方差,实时对状态做归一化,把输入压到近似标准正态分布。我经常看到有人模型结构、奖励都写对了,就是忘了做观测归一化,训练曲线一直不涨,加了归一化之后几分钟就正常了。

第二个常见问题是reward hacking。机器人不是人类,它对奖励的理解往往“歪”得离谱。我训练时遇到过机器人发现,只要把躯干大幅度前倾、用胸口往前冲,速度跟踪奖励就能刷满,因为它靠摔倒的加速度骗过了“前进速度”的计算。这种问题没有万能解法,只能不断根据诡异的动作行为加惩罚项,或者把故意卡住状态的终止条件写得更严。

第三个问题是训练崩溃。PPO训练到一半奖励突然跌到谷底,很多时候是因为机器人被随机初始化到了一个极端危险的状态(比如脚陷进地里、身体先着地),策略面对这个状态产生巨大梯度更新,直接把网络学崩了。实战中我会限制初始状态随机范围,同时给每个step设置卫星条件,让机器人摔倒后尽快终止本回合重新开始,而不是在奇怪的状态里硬耗。

3.3 sim-to-real迁移的账

模拟器里练得再好,上真机才是考验的开始。机器人的物理模型、执行器延迟、传感器噪声、地面摩擦,每一样都和仿真存在偏差,这就是常说的sim-to-real gap。想要让策略从仿真顺利迁移到真机,核心手段是对抗“不确定”而不是精确建模。

域随机化(Domain Randomization)是我最推崇的做法:在训练时把机器人质量、质心位置、关节摩擦、地面摩擦系数、电机力矩增益、传感器噪声等参数全部加上随机扰动,让策略在一个“不确定世界”里学习。这样做出来的策略虽然不会在仿真里拿满分,但到了真机后对各种偏差的容忍度明显更高。前几年我训练一个四足机器人,一开始用固定参数仿真实测总是有0.2秒左右的延迟误差,后来把执行器延迟也随机化训练,真机表现立刻稳定下来。

系统辨识这边也别忽视。机器人本体的质量、转动惯量、摩擦参数可以离线测量一次,模型越接近真实,域随机化需要弥补的偏差就越小。但我不建议花大量时间追求百分百精确,因为执行器摩擦和延迟本身就随温度、磨损变化,追求极致精度收益很低,把重点放在策略的鲁棒性上性价比更高。

4. 手把手实操:从模拟训练到真机行走

4.1 环境搭建与仿真配置

实操前的第一步是选物理引擎。目前我常用的有两个:一个是轻量级开源引擎MuJoCo,接触模型稳定、调参直观,适合小规模调试和算法验证;另一个是GPU并行仿真Isaac Gym,可以在训练时一次性并行成百上千个环境,训练速度比单机快一个量级,适合大规模RL训练。

搭建环境时,机器人模型文件(URDF或MJCF)里的几个参数特别值得注意。第一是惯性参数,这个直接从CAD模型导入往往和实物偏差不小,有条件的先用CAD估计再用真机辨识结果校准一遍,能明显减少迁移时的性能损失。第二是关节阻尼和摩擦,设置太低的话机器人学出来的动作会非常“飘”,真机电机的实际阻力会把它拖垮;设置太高的话仿真里动作又发僵,一般建议按真实电机的堵转力矩估一估再微调。

另外地面上摩擦系数不要用统一的,不同的瓷砖、地毯、橡胶垫摩擦差异很大。训练时直接把这个系数设置成随机值,每次reset都在一个范围内重新采样,让策略适应不同路面条件。

4.2 奖励函数的可复用模板

下面给一份我用来训练人形机器人平地行走的奖励函数简化模板,这里用类Python伪代码描述,便于讲解结构。实际训练时一定要结合MRDF统计和曲线分布再调权。

# 状态: 关节角度q、角速度dq、躯干姿态rpy、IMU角速度w、目标速度cmd_v、足底接触力f # 动作: 关节位置目标target_q def compute_reward(state, action, next_state): # 1. 主任务奖励: 实际速度与目标速度的一致性 v_lin = next_state.base_linear_vel[:2] # 机器人平面速度 v_cmd = state.cmd_vel[:2] # 期望速度 vel_track = exp(-penalty_weight * ||v_lin - v_cmd||^2) # 2. 姿态惩罚: 躯干尽量竖直 roll, pitch, _ = next_state.base_rpy posture_penalty = -p_weight * (roll^2 + pitch^2) # 3. 动作平滑惩罚: 动作变化率不要太猛 d_action = action - state.last_action action_penalty = -a_weight * ||d_action||^2 # 4. 关节极限惩罚: 远离关节限位 joint_limit_penalty = -l_weight * sum(max(0, q - q_max)^2 + max(0, q_min - q)^2) # 5. 角速度惩罚: 不要原地疯狂自旋 yaw_rate = next_state.base_angular_vel[2] spin_penalty = -s_weight * yaw_rate^2 return vel_track + posture_penalty + action_penalty + joint_limit_penalty + spin_penalty

整体权重逻辑:速度跟踪的exp项主任务占绝对主导,后面四项惩罚总权重加起来不要超过主任务权重的五分之一。训练初期如果策略一直走不动,可以把速度跟踪的奖励权重适度增加或者改用“分段线性”的误差惩罚,给学得慢的状态更平滑的梯度。

4.3 训练、导出、真机迁移流程

训练时不要一上来就上高难度。我习惯做“课程学习”:先让机器人目标速度在0到0.3米/秒之间随机,等策略稳定输出不摔倒了,再逐步扩展到0到1米/秒、加上转弯命令、加上外部推力扰动。课程设计本质是在“够得着”的难度边缘慢慢往上推,让策略的优化过程不会因为目标太难而卡在局部最优。

训练结束后导出的东西一般包括:策略网络权重、观测归一化参数、PD控制器的增益和动作缩放因子。真机部署时先不急着跑完整速度,第一步固定在0.1米/秒左右低速运行;测试时把机器人绑上安全绳,旁边放一层防摔垫,遥控器上绑定一个急停按钮,一旦发现策略有异常抖动就立即断电。

真机迁移的前几次测试大概率会暴露出问题,常见的是机器人会“拖着脚走”或者“膝盖弯曲过度”。这种时候别急着改网络,先看是不是PD增益和频率设置和仿真差异太大,再看看是不是状态向量的传感器数据没有滤波对齐。很多时候问题并不在策略本身,而在部署细节。

5. 常见问题与排查技巧实录

5.1 问题速查表

我把实操中遇到的典型问题整理成一张速查表,方便对照排查:

现象可能原因优先排查方向
仿真里能走,真机一跑就摔动力学模型偏差大、域随机化不足校准惯性参数,增大摩擦、延迟、噪声的随机范围
模仿学习学完动作很怪示范数据里有坏帧或中断清洗数据,去掉关节跳变的片段,检查重定向和限位
模仿学习连续执行中途崩掉分布偏移,训练时缺少噪声扰动状态加高斯噪声训练,或引入在线数据(DAgger)
PPO奖励一直不涨观测归一化缺失、奖励稀疏加上obs归一化统计;拆解奖励分解看哪部分不上升
奖励在涨但动作越来越怪reward hacking检查哪些惩罚项权重太低,给奖励函数加约束
训练后期突然崩溃极端初始状态导致策略剧烈更新限制初始随机范围,加过早终止条件(摔倒即终止回合)

5.2 我的几条避坑心得

第一条心得:RL训练监控不能只看总的奖励曲线,一定要把奖励函数拆开看每一项的分量曲线。很多时候总奖励在涨,但姿态惩罚项突然飙升,说明策略在拿姿态换速度,这种“隐形走形”在总曲线里看不出来,等到真机测试就已经晚了。

第二条心得:模仿学习阶段的数据质量比数据量更重要。我试过用几百条乱七八糟的轨迹去训练,结果还不如精心清洗过的五六十条好。每条轨迹录完都要人工检查一遍关节命令序列,有没有瞬时跳变、有没有抖动、有没有动作中断。数据清洗工具可以自动化,但最终审核最好肉眼过一遍。

第三条心得:在模拟器上训练之前,先把真实机器人放在低速、小幅度的运动下跑几分钟,记录电机的实际响应延迟。把这个延迟加进仿真的执行器模型里,迁移成功率能提升一大截。这个动作看起来小,作用往往比调半天域随机化参数都明显。

第四条心得:如果团队资源有限,别急着一上来就在人形机器人上练高难度跑跳。先把策略训练和迁移流程在一个相对简单的操作任务上走通,比如机械臂抓取、双足原地踏步,等整个流程熟练了,再扩展到人形机器人的全身运动技能,踩坑成本会小很多。

我现在做项目时,默认流程就是“人类示教数据做初始策略,模拟器RL强化鲁棒性,真机小步慢跑验证迁移”,这套打法在多个机器人都稳定复现过。如果你正准备做人形机器人的模仿学习或者强化学习项目,我强烈建议先把状态、动作、奖励设计这三件事写在一个文档里,明确每个维度的含义和权重逻辑,再去碰代码。把基础框架定清楚,后面填内容会顺畅得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询