让人形机器人从地面站起来,目标很明确,过程却远比想象中复杂。

从仰卧到站立,身体高度、重心位置、接触顺序和关节运动始终相互影响。即使最终都能站起来,不同策略采用的翻身、摆腿和支撑方式,也可能有很大差别。

这次实践中,我先尝试用奖励直接引导起身,随后转向人体示范与动作跟踪,再逐步处理动作重建、重定向、训练和跨仿真验证中的问题。

整个过程让我逐渐意识到:起身效果不好,未必是训练不够。问题可能早在示范数据中就已经存在,也可能出在部署时某项观测的定义上。

这篇文章就沿着这条实践路径,记录一些具体问题,以及我在调试过程中形成的理解。
在这里插入图片描述

从奖励驱动起身,到用示范描述动作过程

起初,我尝试通过奖励直接描述起身目标。

参考 HoST 等公开工作后,一个自然的思路是:让机器人从仰卧状态开始,通过身体高度、直立程度、脚部支撑和站立稳定性等奖励,引导策略完成起身,再用动作平滑、关节范围和接触冲击等约束控制动作质量。

实际尝试后,我感受到的主要困难是:终点相对容易描述,过程却很难仅靠奖励表达清楚。

同样是到达站立状态,策略可能采用不同的身体扭转、摆腿和支撑方式。有些动作完成了任务,但自然程度和可控性没有达到我的预期。

继续增加奖励项,也不一定能解决问题。不同目标之间可能相互竞争,策略最终找到的,是一种得分较高、却并非我希望看到的起身方式。

这只是我在具体任务中的实践体会,并不是对公开方法本身的效果评价。

随后,我改用人体示范描述动作过程,再让强化学习策略在物理环境中学习跟踪。

在这条路线里,人体示范提供动作参考,强化学习负责学习如何在机器人的动力学条件下执行它。 人体关节角不会直接变成机器人的电机指令,中间还需要重定向、训练和验证。

准备示范:先想清楚怎么起,再考虑怎么拍

为了得到合适的示范,我反复尝试过不同的起身方式,最后采用的动作大致分为三个阶段:

  1. 仰卧准备:收膝,调整上臂和肘部,为翻身做准备。
  2. 侧翻与支撑:向一侧翻转,逐步进入膝部和上肢辅助支撑的姿态。
  3. 抬身与站立:调整髋部和躯干,经过半跪姿站起,并保留一段站立过程。

这样的分段,也为后续调试提供了参照。动作失败时,可以先定位问题出在准备、翻身、支撑还是站立阶段,再分析具体原因。

人体运动数据通过 GVHMR 导出。前期最花时间的工作之一,就是反复进行:

录制 → 三维重建 → 检查 → 重新录制。

地面动作很容易出现遮挡。侧翻时,一侧手臂可能被躯干挡住;收膝时,两条腿可能在画面中重叠;撑地时,手与地面的相对位置也未必清晰。重建系统需要推断这些不可见的信息,而推断结果不一定符合实际动作。

拍摄角度同样会影响结果。在一些录制尝试中,视频里的仰卧姿态看起来没有问题,导出的三维人体却像躺在斜面上。

因此,视频看起来正常,只是第一步;三维重建结果是否可用,还要单独检查。

我主要检查身体方向、根部移动和支撑位置,并在每次导出后完整回放。遇到明显的肢体识别错误时,重新录制往往比在错误轨迹上反复打补丁更有效。

整理后的处理流程如下:

环节主要工作输出
人体运动重建从示范视频中提取人体运动人体姿态参数
动作整理检查姿态,修复局部异常修正后的参考动作
运动学重定向将人体动作映射到目标机器人机器人参考轨迹
数据转换调整采样率,校验数据与派生量训练用动作数据
动作跟踪训练在物理环境中学习执行参考动作控制策略
跨仿真验证导出策略,在另一物理仿真环境中闭环测试执行结果与问题记录

有了参考动作,训练环境仍然需要适配

引入示范后,并不意味着通用动作跟踪配置可以直接用于地面起身。

翻身和撑地包含较大的姿态变化,也涉及身体多个部位之间的支撑切换。原本适用于站立或行走的接触规则、终止条件和姿态约束,都需要重新检查。

我曾在跟踪目标之外加入较强的站立引导,结果机器人虽然到达了站立终点,动作过程却逐渐偏离了参考。

对于希望保留示范过程的任务,这样的结果并不合适。后续调整也因此重新围绕整段动作跟踪展开。

配置这类环境时,我主要关注以下几个方面:

调整方向要解决的问题检查重点
明确参考部位身体位置和姿态以哪个部位为基准训练与部署是否使用同一部位
加强过程跟踪到达站立终点,但过程偏离示范关节、刚体、末端及速度误差
平衡动作成本过强的平滑或力矩惩罚压制必要动作是否在物理限制内允许完成动作
调整接触规则合理的膝部、上肢接地被判为错误接触阶段与支撑方式是否合理
混合起点采样兼顾完整动作和后半段学习从首帧开始能否完成全过程
允许短暂滞后支撑切换时稍有误差就终止区分瞬时误差与持续偏离
分阶段增加扰动基础动作尚未学会就受到过多干扰分别评估动作完成度与鲁棒性

这里有几个容易混淆的问题。

首先,减轻动作成本,不等于扩大机器人的物理能力。 降低力矩或动作变化惩罚,只是在调整优化目标,不能替代对执行器能力和机械限位的正确建模。

其次,参考动作与其他姿态约束要相互兼容。如果示范要求某个关节明显弯曲,另一项奖励却持续鼓励它保持中立,策略就可能通过其他关节代偿。看到奇怪姿态时,除了检查训练是否收敛,也要检查目标之间是否存在矛盾。

终止条件同样需要结合动作阶段。机器人正在仰卧或侧翻时,本来就不应保持直立;支撑切换中的短暂滞后,也不一定意味着动作已经无法恢复。可以结合相对参考的偏差及其持续时间,判断是否需要终止。

最后,参考片段结束后,应明确进入回合结束或后续控制逻辑。如果直接把参考时间跳回仰卧首帧,就可能产生不合理的目标突变。

训练逐渐改善后,数据里的问题开始显露出来

随着策略跟踪能力提高,我才逐渐发现,参考动作本身还有不少问题。

有些时候,策略已经在尽力跟踪,但目标里存在根部漂移、支撑悬空或不自然的关节方向。此时继续增加跟踪权重,只会让这些矛盾更加突出。

于是,我开始把人体数据、机器人重定向结果和物理回放分开检查。

按照当时笔记中的版本编号,这部分迭代大致如下:

版本主要问题调整思路
基础整理局部手臂姿态异常建立可继续修改的人体动作基线
v1仰卧倾斜、整体高度不合理分别校准根部方向与竖直平移
v2收膝时主体被“拖走”检查根部运动与肢体相对运动的分配
v2 适配版人体支撑姿态重定向后不可达根据目标模型调整身体与上肢的配合
v3动作结束过早延长末尾站立段,观察保持能力
v4片段开头需要整理调整准备段长度,同步更新阶段时间
v5初始支撑面、腿部对称性和足底方向异常联合检查身体表面、整条腿和 IK 连续性
v6支撑阶段一侧手部偏高协调肩带、肩、肘和腕,改善支撑位置

这些版本并不是每次只改一个参数,而是逐步把问题拆开:哪些属于人体重建,哪些属于机器人可达性,哪些又必须回到物理环境中判断。

整体躺平,并不代表局部支撑已经合理

最初看到人体“像躺在斜面上”时,我首先检查了根部旋转和整体高度。之后才发现,即使身体主轴已经接近水平,胸背、骨盆、肘部和脚跟与地面的关系,仍然可能不合理。

这里不能简单地把所有关节中心调到同一高度。

胸腔和骨盆有体积,关节中心也不位于接触表面。检查人体数据时,需要关注相关网格区域;检查机器人时,则需要关注碰撞几何。骨架节点可以描述运动关系,却不能直接代替实际接触面。

局部修正还要平滑地接回原动作。即使修正后的仰卧姿态看起来合理,如果突然切换到下一阶段,也可能在关节速度中制造尖峰。因此,位置和旋转调整之后,还要检查修正区间两端的连续性。

坐标约定也值得单独记录。人体重建、可视化和机器人仿真可能采用不同的竖直轴。讨论“高度”之前,应先明确当前坐标系,以及数据已经经历了哪些坐标变换。

收膝时身体被“拖走”,问题可能出在根部轨迹

另一类典型异常是:收膝过程中,脚在世界坐标中的移动不大,躯干却向后滑走。

而我希望得到的动作,是身体主体基本留在原处,腿向身体收回。

这时,仅检查膝关节角并不够,还需要同时比较根部、躯干和脚部轨迹,判断这段运动究竟被分配给了谁。

如果问题主要来自根部水平平移,就可以针对准备阶段抑制漂移,而不必随意修改整条腿的关节角。

不过,抑制漂移也不意味着把身体完全固定。骨盆位置相对稳定时,肩部和躯干仍可能随着局部关节运动发生合理调整。修正应保留这些自然变化,并与后续轨迹连续衔接。

人体能够完成的支撑,机器人未必能原样复现

人体与机器人的身体比例、关节轴向和活动范围不同。人体动作看起来合理,重定向后仍可能出现支撑不可达的问题。

有时手的位置已经接近目标,但肩肘组合并不合理;有时只有把某个关节推到接近极限,才能勉强满足末端位置要求。

因此,修复支撑悬空时,不能只把手向下移动,还需要联合检查身体姿态、肩部位置、肘部弯曲和腿部支撑。

修改人体动作后,也要重新执行重定向,确认目标机器人是否真正获得了合理的接触关系。

这类适配需要同时满足两个条件:人体参考动作本身连贯,机器人又能在自身结构约束下实现。即使修复发生在人体参数层,换一款机器人后,仍然需要重新验证。

脚部朝向的小改动,可能牵动整条腿的 IK 解

处理脚部内偏时,我曾尝试直接做较大的三维对称修正。人体脚的方向看起来改善了,重定向后却出现了明显的腿部扭转。

IK 需要同时满足多个目标,局部目标的大幅变化,可能让求解器转入另一组解。因此,不能只看末端位置误差,还要检查髋、膝、踝的角度范围、限位饱和情况,以及相邻帧之间的变化。

后来,我采用了更谨慎的方式:先回到最近一个正常版本,再把问题拆开处理。

脚尖朝向、脚底倾斜和膝部内收,是不同的问题。试图用一次较大的局部旋转全部解决,容易引入新的异常。

首帧也需要特别关注。对于与默认站姿差异较大的起始姿态,可以在正式导出前,对首帧目标进行若干次 IK 预收敛。这个过程不会增加动作帧数,但它只改善初始化,并不能保证整段动作始终位于合理的解分支上。

修正脚尖后,如果膝部仍然内偏,就需要在一致的身体参考系中,重新检查髋、膝、踝和脚部的整体配合。用于对称修正的参考,也不能直接建立在一个已经明显不对称的姿态上。

考虑到动作可能复用于不同机器人,我尽量把人体层面的错误修回人体参数,再通过标准重定向流程生成机器人轨迹,减少对单份输出文件的临时修改。

站稳和撑住,都需要超出单帧姿态的检查

末尾一帧看起来站直,不代表机器人能够持续保持。

因此,我延长了末尾站立参考,用来观察身体高度、倾斜、关节速度和接触状态能否稳定下来。

足底方向也不能只凭踝关节角判断。关节角接近零,并不必然意味着脚底与地面平行。更直接的检查方式,是观察足底表面法向,以及脚尖、脚跟的相对高度。

到了 v6,修正重点转向支撑阶段一侧手部偏高的问题。我让肩带、肩、肘和腕共同参与调整,在对应阶段逐步引入修正,再平滑退出。

修复后,除了检查手的位置,还需要确认其他动作段没有受到意外影响。

这里也要注意结论的边界:手部更接近地面,不代表小臂已经完整接触;几何间隙减小,也不能证明机器人已经获得了足够的支撑力。

几何检查可以发现明显不合理的目标,实际接触力和动态稳定性仍需要在物理环境中验证。

可视化对齐,不等于动作已经得到修复

人体与机器人叠加显示时,对齐方式本身也可能影响判断。

如果把两者根部位置在三个方向上全部对齐,人体可能被整体抬高,看起来像悬空。只对齐水平方向,可以保留高度差供检查,但也不会自动得到正确的接触平面。

因此,修改显示对齐方式,只是在改变比较方式。实际高度是否合理,仍然需要回到数据坐标和几何表面进行判断。

类似地,逐帧把机器人抬到地面以上,虽然能够减少穿地,却也改变了根部高度轨迹。这是一种几何处理,不能替代动力学验证。

数据转换时,最需要关注的是约定是否一致

人体参数、机器人参考轨迹和训练数据之间,通常涉及坐标变换、关节重排、重采样和速度计算。上游文件一旦修改,下游结果也需要重新生成。

我会为每次处理保留源文件版本、转换配置和校验信息,重点检查:

  • 关节名称与数组顺序是否对应,左右侧是否正确映射。
  • 四元数分量顺序、坐标轴和单位是否一致。
  • 参考轨迹的采样方式是否匹配控制周期。
  • 裁切、延长或平滑动作后,速度等派生量是否同步更新。
  • 策略文件、动作数据和部署配置是否属于同一次导出。

如果参考轨迹每个控制步推进一帧,轨迹采样率就需要与控制频率匹配;如果按时间插值,则应检查插值方式和端点处理规则。

计算帧数与时长时,还要区分“样本数量”和“首尾采样时刻之间的间隔”,避免仅凭一个乘法结果,就判断数据转换出了问题。

奖励曲线变化,不一定意味着策略变差

修改动作、裁切开头、延长末尾站立段,都会改变训练样本分布和回合组成。如果奖励配置也发生了变化,曲线的绝对数值就更难直接比较。

混合起点训练还有一个容易忽略的问题:从动作中段开始并到达末尾,与从仰卧开始完成整套起身,并不是同一种测试。

因此,片段结束比例不能直接当作完整起身成功率。

误差指标也需要核对定义。例如,复位时记录的一次误差,不等于整段动作的时间平均;全身关节误差的范数,也不等于每个关节的平均误差。

对我更有帮助的评估方式,是在可比的训练进度下,固定从首帧开始回放,逐段检查准备、翻身、支撑、抬身和站立过程,再分别记录完成情况、姿态误差和稳定保持表现。

sim2sim 卡住后,我把重点放回了观测定义

同一份策略在一个测试环境中能够完成动作,换到另一个仿真环境后,却卡在翻身阶段。遇到这种情况,很容易首先怀疑摩擦参数或接触求解器。

这些因素确实值得检查,但在此之前,还有一个更基础的问题:

策略在两个环境中接收到的,究竟是不是同样含义的物理量?

观测维度相同、数值没有异常,只能说明数据可以送进网络,不能说明输入的含义一致。

以姿态跟踪为例,假设训练时使用骨盆作为参考部位,另一端却使用叠加了腰部旋转的躯干姿态,即使字段名称和数据维度完全相同,策略接收到的输入也已经改变。

如果初始化朝向时,实际侧和参考侧又使用了不同的身体部位,还会进一步引入错误的对齐旋转。

这类问题在接近直立时可能不明显,在仰卧和侧翻时却可能被放大。因此,其他动作已经通过跨仿真测试,并不能证明所有姿态范围内的观测计算都一致。

下面用一种通用形式说明姿态观测的计算关系。变量名仅用于解释,具体实现仍需遵循所用库的旋转约定:

q_actual:实际身体参考部位的世界姿态
q_reference:同一参考部位的示范姿态

启动时确定一次水平朝向对齐:
q_alignment = yaw(q_actual_start) * inverse(yaw(q_reference_start))

运行中计算相对姿态:
q_error = inverse(q_actual) * q_alignment * q_reference

如果策略接收的是旋转矩阵的部分元素,还需要统一选取哪几列,以及如何展开。

四元数的乘法顺序、世界系与局部系的关系、初始对齐方式和逐帧误差计算,都属于观测定义的一部分。

一种有效的检查方法,是先构造“机器人恰好处于参考姿态”的输入。除有意保留的差异外,计算得到的姿态误差应接近单位旋转。随后再加入已知的转向或局部倾斜,检查结果是否符合预期。

如果使用循环网络,还需要让两端采用相同的初始隐藏状态,避免把网络记忆的差异误认为观测计算问题。

完成这些离线对照后,再回到闭环仿真。经过姿态观测一致性修正,起身动作最终在另一仿真环境中执行成功。

这次经历也让我更重视跨仿真排查的顺序:先核对输入输出约定,再分析物理参数和接触行为的差异。

逐渐形成的分层排查习惯

经过这轮实践,我开始习惯先判断问题属于哪一层,再决定修改什么。

人体示范是否正确表达了动作?机器人是否能够达到参考姿态?训练目标是否相互兼容?部署端是否保持了相同的数据和控制约定?

这些问题需要分别回答。

层次需要回答的问题
录制与重建动作是否清晰可见?三维结果是否存在倾斜或错误肢体姿态?
人体动作整理根部与肢体运动是否合理?局部修改是否连续?
重定向姿态是否可达?是否存在限位饱和或 IK 解跳变?
参考接触支撑部位是否合理?几何检查与物理接触是否一致?
训练与评估奖励是否冲突?完整动作与局部片段是否分别评估?
导出与部署观测、动作、坐标、时序和网络状态是否一致?
跨仿真回放失败来自策略行为、物理差异,还是控制状态变化?

对我来说,这次实践最有价值的变化,是不再把所有异常都归结为“还需要多训练”。

有时应该重新录制,有时应该修复参考动作,有时需要调整训练条件,也有时,只是一项观测在两个环境中代表了不同的身体部位。

先找到问题所在的层次,后续修改才更容易验证,积累下来的方法也更容易复用。


前期阅读参考包括 HoST,人体运动重建使用 GVHMR。

本文记录的是个人实践中的理解和调试经验,不代表上述公开项目的默认配置或实验结论。文中最终验证结果为跨仿真环境中的起身执行成功。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐