
1. 全身跟踪到底在解决什么问题人形机器人的全身跟踪英文叫 General Whole-Body Tracking说白了就是让机器人实时模仿人类的动作——你抬腿它抬腿你转身它转身你挥手它挥手。这件事听起来像是科幻电影里的场景但它背后涉及的控制理论、动力学建模和强化学习训练范式已经发展了好几年最近一年因为几篇高质量论文的集中出现突然变成了一个热门方向。我最早接触这个方向是在一个模拟环境里做 locomotion 的项目当时只是让机器人学会走路就已经调参数调到怀疑人生。后来看到全身跟踪的任务定义第一反应是这不就是把走路、平衡、手臂协调、头部朝向全部耦合在一起同时求解吗难度直接上了一个数量级。但恰恰是这种高难度让它成为了检验算法框架和训练范式的最佳试金石。这篇文章想做的事情很明确把全身跟踪这个任务的算法框架拆开把训练范式讲透把实操中会踩的坑一个一个标出来。不管你是刚入门想了解这个方向的研究生还是已经在做相关项目但卡在某个环节的工程师我都尽量让你读完能有一张清晰的地图知道每一步该往哪走、为什么这么走、以及走的时候要注意什么。全身跟踪的核心难点在于“全身”两个字。传统的人形机器人控制通常把任务拆开下肢负责平衡和移动上肢负责操作或摆动头部单独控制朝向。这种解耦方式在简单场景下够用但一旦要求机器人像人一样完成连贯的全身动作——比如一边小跑一边挥手、一边转身一边保持手臂姿态——解耦控制的局限性就暴露了。关节之间的动力学耦合、接触力的重新分配、质心的动态偏移这些问题必须在一个统一的框架里同时处理。从应用场景来看全身跟踪的价值在于它让机器人具备了通用动作模仿能力。这意味着你不需要为每一个具体任务单独设计控制器而是可以用一套框架去跟踪任意参考动作。这对遥操作、动作捕捉数据复用、人机协作等场景都有直接意义。比如在危险环境作业中操作员穿着动捕服做动作机器人实时跟踪执行操作员不需要学习任何机器人特定的控制接口直接用自己最自然的动作就能驱动机器人。适合阅读这篇文章的读者包括做机器人控制方向的研究生和工程师、对强化学习在机器人上落地感兴趣的人、以及想了解人形机器人前沿进展的技术爱好者。我会尽量把数学公式控制在必要范围内用直观解释代替繁琐推导但关键的算法逻辑和参数选择会讲清楚。2. 算法框架的整体设计思路2.1 为什么选择统一跟踪框架而不是分层控制在全身跟踪任务中最核心的架构决策是用一个统一的策略网络直接输出所有关节的目标位置还是用分层结构让高层规划、低层执行。这两种思路各有道理但我实测下来统一跟踪框架在通用性和鲁棒性上明显占优。统一框架的基本逻辑是策略网络的输入是当前机器人状态关节角度、关节速度、躯干姿态、角速度等加上参考动作的目标状态目标关节角度、目标躯干姿态、目标速度等输出是所有关节的位置目标或力矩目标。整个网络是一个端到端的大策略没有显式的任务分解。这种设计的优势在于网络可以自动学习关节之间的协调关系。比如当机器人需要快速转身时下肢的支撑腿需要调整接触力上肢需要配合摆动来补偿角动量头部需要保持朝向稳定——这些协调关系如果靠人工设计分层控制器需要大量的工程调参和状态机设计。而统一策略网络通过训练可以隐式地学到这些耦合关系。但统一框架也有代价。最大的问题是训练难度高搜索空间太大奖励函数设计复杂容易陷入局部最优。我试过直接用统一框架从零训练结果机器人学会了“站着不动”这个局部最优解——因为不动就不会摔倒不会摔倒就不会有惩罚。后来通过奖励塑形和课程学习才逐步解决。分层控制的思路是高层策略输出质心轨迹、落脚点、躯干姿态等低维目标低层控制器负责跟踪这些目标并输出关节指令。这种方式的优势是训练更稳定因为每一层的任务更明确。但缺点是通用性受限——高层策略的输出空间是人为定义的如果参考动作包含一些高层策略没有考虑到的维度比如手臂的精细动作就无法完整跟踪。我目前的判断是如果你的目标是通用动作跟踪优先考虑统一框架如果任务范围明确且对稳定性要求极高分层控制更稳妥。两者也可以结合比如用统一框架做全身策略但在底层加一个关节级的PD控制器来保证执行精度。2.2 参考动作的表示与对齐全身跟踪的输入是参考动作通常来自动作捕捉数据或人工设计的轨迹。参考动作的表示方式直接影响策略网络的学习难度。最常见的表示是关节角度序列每一帧给出所有关节的目标角度。这种表示直观但有一个问题——不同机器人的关节定义和自由度数量可能不同直接用人体的关节角度去驱动机器人需要做重定向retargeting。重定向的质量直接影响跟踪效果如果重定向后的动作在机器人运动学上不可行比如关节超限、自碰撞策略网络再怎么训练也跟踪不好。另一种表示是末端执行器位置和躯干姿态给出双手、双脚、头部的位置和躯干朝向让策略网络自己去求解关节角度。这种表示更抽象对机器人形态的依赖更小但策略网络需要学习逆运动学训练难度更大。我在实际项目中用的是混合表示关节角度作为主要输入同时提供末端执行器的位置作为辅助信息。这样策略网络既有直接的关节级引导又有任务空间的目标约束。实测下来这种混合表示比纯关节角度表示的跟踪精度高不少尤其是在手臂和腿部的末端跟踪上。参考动作的时间对齐也很关键。如果参考动作的速度和机器人的响应速度不匹配跟踪就会滞后或超前。常见的做法是在训练时对参考动作做时间缩放time scaling让机器人学会在不同速度下跟踪同一动作。具体实现是在每一帧对参考动作的时间索引加一个扰动扰动范围通常是原始速度的0.8到1.2倍。这样训练出来的策略对速度变化有一定鲁棒性。2.3 观测空间与动作空间的设计取舍观测空间的设计是全身跟踪框架中最容易出问题的地方。观测太少策略网络无法感知足够的状态信息跟踪效果差观测太多训练难度增加而且容易过拟合到训练时的特定状态分布。我通常把观测分成几类机器人本体状态关节角度、关节速度、躯干姿态、躯干角速度、质心位置和速度、参考动作状态当前帧和未来几帧的目标关节角度、目标躯干姿态、以及任务相关状态比如接触状态、地面高度。本体状态是必须的参考动作状态决定了跟踪的目标任务相关状态帮助策略网络处理接触和地形变化。一个容易忽略的细节是观测的归一化。不同物理量的量纲和范围差异很大比如关节角度通常在正负180度以内而质心速度可能达到几米每秒。如果不做归一化策略网络会被大量纲的观测主导小量纲的观测被忽略。我的做法是对每一类观测单独做归一化用训练数据集的均值和标准差做标准化然后在推理时用同样的统计量。动作空间的选择更直接位置控制还是力矩控制。位置控制的优势是稳定性好底层有PD控制器保证执行精度策略网络只需要输出目标位置。力矩控制的优势是响应快可以实现更动态的动作但训练难度大容易不稳定。我目前倾向于位置控制因为全身跟踪的任务通常不需要极端的动态性能稳定性更重要。如果确实需要力矩控制可以在位置控制的基础上加一个前馈力矩项兼顾稳定性和响应速度。3. 训练范式的核心细节与实操要点3.1 强化学习训练的基本流程全身跟踪的训练范式目前主流是强化学习具体来说是基于策略梯度的方法比如PPOProximal Policy Optimization。整个训练流程可以分成几个阶段环境搭建、奖励设计、策略网络初始化、训练循环、以及策略评估和部署。环境搭建是第一步也是最耗时的一步。我用的模拟环境通常是Isaac Gym或MuJoCo前者适合大规模并行训练后者适合精细的接触模拟。环境里需要定义机器人的URDF模型、地面接触参数、以及参考动作的加载和播放逻辑。一个容易踩的坑是接触参数的设置如果地面摩擦系数太大机器人容易卡住太小又容易滑倒。我通常从0.8开始试根据训练效果调整。奖励设计是训练范式的核心。全身跟踪的奖励通常由几部分组成跟踪奖励关节角度误差、末端位置误差、躯干姿态误差、正则化奖励关节速度惩罚、力矩惩罚、动作平滑度惩罚、以及任务奖励存活奖励、接触奖励。跟踪奖励是主项正则化奖励防止策略网络输出剧烈变化的动作任务奖励引导机器人保持平衡。我用的奖励函数大致是这样的跟踪奖励用指数形式误差越小奖励越接近1误差越大奖励越接近0。具体公式是 reward exp(-k * error)其中k是缩放系数误差是关节角度误差的加权和。正则化奖励用二次惩罚比如关节速度的平方和乘以一个小的系数。存活奖励是每帧给一个小的正数鼓励机器人不要摔倒。策略网络初始化也很关键。如果从随机初始化开始训练前期几乎不可能学到有效的跟踪策略因为随机动作会导致机器人立刻摔倒。我的做法是先用一个简单的站立策略初始化网络或者用模仿学习从参考动作中预训练一个初始策略然后再用强化学习微调。这样训练效率高很多而且不容易陷入局部最优。3.2 课程学习与奖励塑形课程学习是全身跟踪训练中不可或缺的技巧。直接让机器人跟踪完整的复杂动作几乎不可能成功。我的课程学习通常分几个阶段第一阶段只训练站立和平衡参考动作是静止的站立姿态第二阶段训练简单的下肢动作比如原地踏步、小幅度重心转移第三阶段加入上肢动作但下肢动作保持简单第四阶段训练完整的全身动作包括快速转身、跳跃、手臂挥舞等。每个阶段的切换条件通常是跟踪误差低于某个阈值或者训练步数达到一定数量。我一般用跟踪误差作为主要指标当连续多个episode的平均跟踪误差低于阈值时进入下一阶段。阈值的选择需要根据具体动作调整太松会导致策略在简单阶段停留太久太紧会导致策略无法进入下一阶段。奖励塑形是另一个关键技巧。原始的跟踪奖励在训练初期几乎为零因为随机策略的跟踪误差很大exp(-k * error)接近零。这导致策略网络得不到有效的梯度信号。我的做法是在训练初期加一个辅助奖励比如关节角度误差的负平方这个奖励在误差大时也有梯度。随着训练进行逐步降低辅助奖励的权重最终只保留原始的跟踪奖励。还有一个技巧是参考动作的难度自适应。在训练过程中根据策略的当前跟踪能力动态调整参考动作的速度和幅度。如果策略跟踪得好就加快参考动作的速度或增大动作幅度如果跟踪得差就放慢速度或减小幅度。这样策略始终在“跳一跳够得着”的难度下训练学习效率最高。3.3 并行训练与超参数调优全身跟踪的训练通常需要大量并行环境来加速。我用的配置是4096个并行环境每个环境运行不同的参考动作片段策略网络在所有环境上共享参数。这样一次前向传播可以收集4096个环境的数据训练效率比单环境高几个数量级。并行训练的一个挑战是环境之间的同步。如果不同环境的参考动作长度不同或者机器人的初始状态不同就需要做对齐。我的做法是在每个环境里维护一个独立的参考动作播放器每个episode开始时随机选择一个参考动作片段和初始状态episode结束时重置。这样每个环境独立运行不需要全局同步。超参数调优是训练中最耗时的部分。我通常关注几个关键超参数学习率、折扣因子、GAE参数、以及PPO的裁剪系数。学习率一般从3e-4开始试如果训练不稳定就降低到1e-4。折扣因子通常用0.99但如果任务需要长期规划可以用0.995。GAE参数用0.95是常见选择PPO裁剪系数用0.2。一个容易忽略的超参数是策略网络的网络结构。全身跟踪的策略网络通常用MLP层数在3到5层之间每层256到512个神经元。我试过用Transformer结构效果没有明显提升但训练时间增加了很多。所以目前还是用MLP为主。激活函数用ELU或SiLU比ReLU更平滑训练更稳定。4. 实操过程与核心环节实现4.1 环境搭建与参考动作预处理环境搭建的第一步是导入机器人模型。我用的机器人模型是一个简化的人形机器人有23个自由度每条腿6个每条手臂5个躯干1个。URDF文件里需要定义每个关节的类型、范围、以及连杆的质量和惯性矩阵。这些参数直接影响动力学模拟的准确性如果质量或惯性设置不对训练出来的策略在真机上会表现很差。参考动作的预处理包括几个步骤重定向、滤波、以及时间对齐。重定向是把人体动作映射到机器人关节空间我用的方法是最小二乘优化最小化人体末端位置和机器人末端位置的差异。滤波是用低通滤波器去除动作捕捉数据里的噪声截止频率通常设在5到10赫兹。时间对齐是确保参考动作的帧率和训练环境的控制频率一致如果不一致需要做插值或降采样。一个实操中的细节是参考动作的起始帧选择。如果参考动作从一个不稳定的姿态开始比如单脚站立机器人很难从初始状态跟踪上。我的做法是在参考动作前面加一段过渡帧从机器人的默认站立姿态平滑过渡到参考动作的起始姿态。过渡帧的长度通常是0.5到1秒用三次多项式插值生成。4.2 策略网络训练与调试策略网络的训练循环包括几个步骤收集数据、计算优势函数、更新策略网络和价值网络。我用的框架是PyTorch训练循环大致如下for iteration in range(num_iterations): # 收集数据 obs env.reset() for step in range(horizon): action policy(obs) next_obs, reward, done, info env.step(action) buffer.add(obs, action, reward, next_obs, done) obs next_obs # 计算优势函数 advantages compute_gae(buffer, value_net, gamma, lam) # 更新策略网络和价值网络 for epoch in range(num_epochs): for batch in buffer.get_batches(batch_size): loss compute_ppo_loss(batch, advantages, policy, value_net) optimizer.zero_grad() loss.backward() optimizer.step()调试训练过程时我主要看几个指标平均回报、跟踪误差、策略熵、以及价值函数的损失。平均回报应该随着训练逐步上升如果震荡太大可能是学习率太高或奖励设计有问题。跟踪误差应该逐步下降如果卡在某个值不动可能是策略陷入了局部最优。策略熵应该逐步下降但如果下降太快说明策略过早收敛需要增加探索。一个常见的调试场景是机器人学会了“偷懒”策略比如只跟踪下肢动作上肢保持不动因为上肢的跟踪误差对总奖励的影响较小。解决方法是调整奖励权重让上肢和下肢的跟踪误差权重相当或者对每个关节的跟踪误差做归一化避免某些关节的误差被忽略。4.3 策略部署与真机迁移策略训练好之后需要部署到真机上。部署的第一步是策略网络的导出和优化。我通常把PyTorch模型导出为ONNX格式然后用TensorRT做推理加速。推理频率需要和控制频率匹配通常是50到100赫兹。如果推理延迟太大需要在策略网络和底层控制器之间加一个缓冲器用上一帧的动作作为当前帧的目标。真机迁移的最大挑战是模拟到现实的差距sim-to-real gap。模拟环境里的接触模型、摩擦系数、电机响应特性和真机都有差异。我的做法是在训练时加入域随机化domain randomization随机化地面摩擦系数、电机延迟、关节阻尼、以及机器人质量。这样训练出来的策略对参数变化有一定鲁棒性迁移到真机时表现更稳定。另一个技巧是在真机上做在线自适应。部署时用一个简单的自适应控制器根据真机的实际状态调整策略网络的输出。比如如果机器人实际关节角度和策略网络输出的目标角度有偏差就用一个积分项来补偿。这样即使模拟和真机有差异也能通过在线调整来弥补。5. 常见问题与排查技巧实录5.1 训练不收敛或收敛到局部最优训练不收敛是全身跟踪中最常见的问题。表现是平均回报震荡或下降跟踪误差不降反升。我排查这个问题的顺序是先检查奖励函数再检查观测和动作空间最后检查超参数。奖励函数的问题通常是权重不平衡。如果正则化奖励的权重太大策略网络会倾向于输出零动作因为零动作的惩罚最小。如果跟踪奖励的权重太小策略网络学不到有效的跟踪行为。我的经验是跟踪奖励的权重应该是正则化奖励的10到100倍具体取决于任务的难度。观测和动作空间的问题通常是维度不匹配或归一化不当。如果观测里包含了策略网络无法影响的状态比如参考动作的未来帧策略网络可能会忽略这些观测。如果动作空间的维度大于机器人实际自由度策略网络会输出无效动作。我通常会在训练前做一次维度检查确保观测和动作的维度与机器人模型一致。局部最优的典型表现是机器人学会了“站着不动”或“只做简单动作”。解决方法是增加探索噪声、调整奖励塑形、或者用课程学习逐步增加难度。我试过在训练初期给动作加高斯噪声噪声标准差从0.1逐步降到0.01这样策略网络在初期有足够的探索后期又能精细跟踪。5.2 跟踪滞后或超前跟踪滞后是指机器人的动作比参考动作慢半拍跟踪超前是指机器人提前完成动作。这两种问题通常和参考动作的时间对齐有关。跟踪滞后的原因可能是策略网络的响应速度不够或者底层控制器的带宽不足。解决方法是提高控制频率、减小策略网络的层数、或者增加前馈项。我试过在策略网络输出上加一个参考动作的速度前馈这样机器人可以提前开始动作减少滞后。跟踪超前的原因可能是参考动作的速度太慢策略网络学会了“抢拍”。解决方法是调整参考动作的时间缩放或者在奖励函数里加一个时间对齐的惩罚项。我通常用动态时间规整DTW来计算跟踪误差这样即使机器人动作的速度和参考动作不完全一致也能正确评估跟踪质量。5.3 真机上的振荡与不稳定真机上的振荡通常来自几个方面策略网络的输出频率太高、底层控制器的增益太大、或者传感器噪声太大。我排查这个问题的顺序是先降低策略网络的输出频率再调整底层控制器的增益最后检查传感器滤波。策略网络的输出频率太高会导致动作变化太快底层控制器跟不上。我的做法是在策略网络和底层控制器之间加一个低通滤波器截止频率设在10到20赫兹。这样策略网络的输出被平滑后再送给底层控制器振荡会明显减少。底层控制器的增益太大也会导致振荡。我通常用PD控制器比例增益从50开始试微分增益从1开始试根据实际响应调整。如果机器人振荡先降低比例增益再调整微分增益。传感器噪声太大的话需要在状态估计里加卡尔曼滤波或互补滤波。5.4 常见问题速查表问题现象可能原因排查方法解决方案训练不收敛奖励权重不平衡检查跟踪奖励和正则化奖励的比例调整权重跟踪奖励占主导收敛到局部最优探索不足检查策略熵是否过早下降增加探索噪声用课程学习跟踪滞后响应速度不够检查控制频率和网络层数提高频率减小网络加前馈跟踪超前参考动作太慢检查时间缩放调整时间缩放加时间对齐惩罚真机振荡输出频率太高检查策略输出频率加低通滤波器降低频率真机不稳定控制器增益太大检查PD增益降低比例增益调整微分增益迁移效果差模拟到现实差距检查域随机化范围增加域随机化在线自适应6. 全身跟踪框架的扩展与个人体会全身跟踪框架训练好之后可以扩展到很多相关任务。比如把参考动作从关节角度换成末端执行器轨迹就可以做操作任务的跟踪把参考动作换成质心轨迹和落脚点就可以做导航和行走的跟踪把参考动作换成人类视频里的姿态估计结果就可以做从视频到机器人动作的直接映射。我最近在尝试的一个扩展是用全身跟踪框架做遥操作。操作员穿着动捕服做动作动捕数据实时传给策略网络策略网络输出关节目标位置驱动机器人。这个场景对跟踪的实时性和鲁棒性要求很高因为操作员的动作是连续变化的而且可能有噪声。我目前的方案是在策略网络前面加一个动作平滑模块用滑动平均或卡尔曼滤波平滑动捕数据然后再送给策略网络。实测下来平滑后的跟踪效果明显更稳定。另一个扩展方向是多任务学习。用一个策略网络同时跟踪多种类型的参考动作比如行走、跑步、跳跃、挥手等。这样策略网络需要学习不同任务之间的共享表示泛化能力更强。我试过用任务编码task embedding的方式把任务类型编码成一个低维向量和观测一起输入策略网络。这样策略网络可以根据任务类型调整行为同时共享底层控制知识。我个人在实际操作中的体会是全身跟踪的难点不在于算法本身而在于细节。奖励函数的每一个权重、观测的每一个维度、超参数的每一个数值都会影响最终效果。我踩过的最大的坑是忽略了参考动作的质量——用了一个重定向效果很差的动捕数据训练了很久效果都不好后来换了重定向方法同样的算法框架效果立刻提升了一大截。所以如果你也在做这个方向建议先把参考动作的质量做好再调算法。最后再分享一个小技巧训练时定期保存策略网络的检查点并且用不同的随机种子训练多个策略最后选效果最好的。全身跟踪的训练随机性很大同一个算法框架用不同的随机种子可能效果差很多。多训几个策略选最好的那个比反复调参更省时间。