杜克大学CoDance:人形机器人如何学会与真人搭档跳舞
你有没有想过,教机器人跳舞,比教机器人走路难在哪?走路的时候,机器人只需要管好自己。摔不摔倒,走多快,全凭自己的平衡感和步态规划。但跳双人舞不一样,你的舞伴会往前走、往后退、会突然停下来,还会一直拉着你的手。你得跟上她的节奏,同时手上还不能太僵硬,不然两个人一碰撞就全乱套了。这正是杜克大学一个研究团...
教机器人跳舞,比教它走路难在哪儿?你有没有琢磨过这个问题。
走路时,机器人只要把自己管好就行。走多快、摔不摔,靠的是自身的平衡感和步态规划。跳双人舞就不同了:舞伴会往前、会后退、会忽然停住,手还一直拉着你。节奏得跟上,手上又不能太僵,否则一碰就全乱。
杜克大学一支研究团队最近做的正是这件事,他们让人形机器人学会了跟真人搭档跳舞,论文名为CoDance。读完这篇论文,我感受最深的一点是,团队处理的不只是“机器人怎么跳舞”这么简单,背后是一个更底层的矛盾:机器人如何在保住自己动作风格的同时,柔软地回应别人的触碰。先看看CoDance出现之前,机器人模仿人类动作的主流做法是什么样。
机器人会跳舞、能翻跟头、做各种花哨动作,这几年靠的基本都是运动模仿技术。所谓运动模仿*,就是拿一段录好的人类动作视频,或者动捕数据,让机器人通过强化学习、模仿学习去还原,把关节轨迹尽量往参考动作上靠。这套办法现在已经很成熟了,后空翻做得出来,复杂的街舞也跳得了,看上去表现力十足。问题是,这些工作都默认了一个前提:机器人独自在跳。参考动作是定死的,一旦偏离就算跟踪误差,误差越小奖励越高。一个人跳的时候,这么算没什么毛病。可只要多出一个搭档,这套逻辑马上就撑不住了。
设想两个人跳交谊舞,其中一个完全不管对方在哪,只顾按脑子里背好的舞步往前走,会怎样?不是踩到对方的脚,就是两人手越拉越远最后脱开,再不然对方后退了他还往前冲,直接撞上。这算不上跳舞,只是两个独立的个体恰好待在同一块地板上。
面对的就是这个问题:怎么让机器人既保留自己的舞步风格,又能实时跟着舞伴的位置调整,还要在两手始终拉着对方的情况下,既不把对方手腕捏得生疼,也不至于软绵绵地一拽就散架。
这里有个关键的技术矛盾。传统运动模仿把偏离参考动作当作错误来惩罚,可物理接触天然会逼着机器人偏离参考:舞伴的手会推、会拉,手臂必须跟着变形才叫柔顺。两件事正好对着干。
CoDance的思路,得先从训练数据从哪里来说起。视频里只有动作,没有力。
研究团队既没用动作捕捉设备,也没专门请演员穿一身传感器去跳舞,而是直接拿了一段两人跳舞的普通视频,长度9.7秒。这段视频先经过一个叫PromptHMR的工具处理,提取出两位舞者的三维人体姿态,再借助GMR这个重定向工具,把人类动作映射到机器人的关节结构上。重定向*:把人类骨骼的动作转换成机器人骨骼能执行的动作,因为两者的关节数量、长度比例都不一样,直接照搬是行不通的。这样,两位舞者中一个成了机器人要学习的参考动作,另一个成了训练时机器人要跟随的舞伴。
但大问题来了:视频只记录了动作,没有记录力。画面里能看到两个人拉着手一起移动,却看不出谁用了多大劲儿拉对方、谁的手腕被压弯了多少。这些力学信息,视频天生就没有。而恰恰是这些力,决定了机器人该如何柔顺地回应接触。
这就好比你去看一段两人掰手腕的视频,画面里只有手臂角度的变化,两人各自用了多大劲完全看不出来。这部分信息不补上,机器人学到的只是一个“看起来像”的动作序列。真人上去拉它的手,用的力和视频里的角度对不上,机器人要么完全不理会这个力(显得僵硬),要么乱做出一通毫无章法的反应(显得失控)。
为了补上这个缺口,团队用了一种叫多连杆柔顺增强的办法。多连杆柔顺增强*是一类数据增强技术:它以参考动作为底子,模拟手部可能受到的各种受力情形,再倒推出机器人在受力之下该摆出什么姿态,于是原本只有动作的视频数据,就变成了动作和力学信息都带的训练数据。
落地时是怎么做的?系统会在整段舞蹈里随机插进若干虚拟交互事件,每个事件对应一次手部受力,节奏是“逐渐加力、保持、逐渐释放”,跟现实里有人慢慢拽你的手、停一下、再慢慢松开差不多。每个事件都会采样一个力的大小和方向,外加一个机器人手臂的虚拟刚度值。刚度说白了就是手臂有多“硬”:刚度低,同样的力能把手臂推得更远;刚度高,手几乎不动。公式很简单,
这套流程里藏着三处巧思,可以单独拎出来讲一讲。
头一处是两手联动的交互方式。真实跳舞的时候,两只手不一定各受各的力:有时两手朝同一个方向推,有时两手像拉弹簧那样相向而行,有时一只手往上、另一只手往下做拧转。研究者据此设了五种交互意图——单手受力、双手同向、双手镜像、双手拧转、双手相对,每次随机选一种来生成数据,机器人学到的柔顺反应因此更丰富,不再是单一的"推一下就弯一下"。
第二处是拿舞伴的动作来指方向。系统会看舞伴眼下移动的速度方向,多数受力事件顺着这个方向生成,少数则逆着机器人前进方向推。这样造出来的力学场景更接近真实跳舞时会遇到的情况,并非胡乱编出来的随机力。
第三处是把力度和平衡绑在一起。手上受力一大,身体重心就得跟着调,否则人站不住。系统每生成一个受力事件之前,先算一算施加这个力的话机器人重心要偏移多少,一旦超出预设的安全范围,就按比例把这个力缩小,保证生成的动作始终是机器人站得住的。
整套流程最后产出了200段带受力事件的动作片段,外加200段无受力的纯动作片段;其中一半朝前走,另一半是时间倒放后朝后走的版本。机器人由此既学会往前迈步,也学会往后退步的舞步风格。
只靠柔顺还不够,机器人得认得出舞伴
拿到这批融合了力学信息的训练数据,下一步就是训练策略。
这里有个设计很容易被忽略,其实相当关键:机器人在训练时能看到哪些信息。
论文里交代得很清楚,机器人的决策网络只能看到舞伴骨盆和两个膝盖的位置,是最近一秒钟的轨迹,还要换算到机器人自己的坐标系里。
初看这个设计有点怪,为什么不给机器人看舞伴全身的详细姿态?研究者的考虑很实际:真到部署的时候,机器人身上不可能装一整套捕捉舞伴全身姿态的设备,现实中能用的往往只有几个贴在身上的动捕标记点。训练时用的信息量要是远超部署时能拿到的信息量,这套系统到了现实世界就会失灵。所以他们索性从一开始就把输入的信息量卡死,只用稀疏的几个关键点,仿真训练和现实部署走同一套输入标准。
好比学开车,教练车上装满了各种高级传感器帮你判断路况,等你拿到驾照开上什么都没有的普通车,那套依赖传感器的本领根本用不上。CoDance团队显然是要让机器人在"仿真教室"里就适应"真实考场"的条件,而不是等上了考场才发现设备对不上。
机器人靠这几个关键点来决定脚步怎么迈:每只脚各设一个跟随目标,右脚跟着舞伴的左脚走,左脚跟着舞伴的右脚走,中间保持0.5米的固定跟随距离。奖励函数会鼓励自己的脚尽量贴近这个跟随目标,同时也奖励自然的迈步节奏,既不许卡在原地不动,也不许迈得太快。
这个策略没有被告知任何具体的速度指令或路线规划,全靠观察舞伴的动作来反应,和很多依赖预设速度指令的机器人控制方式不一样。
为验证机器人真是在看舞伴、而不是在背稿子,研究者做了个很直接的测试:把舞伴的位置信息全部清零,结果机器人几乎百分之百摔倒,一秒钟内脚步误差就达到0.42米。接着又换了个更微妙的测试,把舞伴的动作时间顺序倒过来播放,机器人自己的参考动作保持不变。这一回只有大约四分之一的尝试能顺利完成,脚步误差0.267米。对比很说明问题:清零测试证明机器人确实依赖舞伴信息,倒放测试则进一步证明,当舞伴信息和自己预期的参考动作对不上时,机器人会努力适应新信息,但这种适应是有限度的。
上身柔软,下身守住风格
机器人的身体被明确拆成两部分分别对待,这是整个系统里设计得很聪明的一点。
上半身,也就是肩膀、手肘、手腕,负责响应物理接触,追踪那个经过力学调整后的参考姿态,力的大小和力矩也要尽量对上脚本里设定的目标值。
下半身,也就是骨盆、髋关节、膝盖、脚踝,负责守住舞步的风格,不太受手上力的直接影响。
这种分工意味着什么?舞伴突然用力拉机器人的手时,手臂会顺着力的方向弯曲变形,把这个外力缓冲掉,腿脚的步态却不会因此乱套,走路的节奏和姿态风格照旧。就像一位经验丰富的舞者,被舞伴稍微拉拽一下,胳膊很自然地顺势伸展,脚下步伐丝毫不乱,照样稳稳踩着节拍走。要是没有这个分工,手上一受力整个人的步态都跟着变形,舞蹈看起来就会一惊一乍,毫无美感,还很可能直接失去平衡摔倒。
论文给出了两种实现下半身舞步风格的方式,作者分别称它们为解耦策略和全身跟踪策略。
解耦策略:下半身的动作风格不是靠直接跟踪参考轨迹学出来的,而是靠一个对抗式的判别器。判别器拿机器人实际走出来的下半身姿态和训练数据里的下半身姿态作比较,如果分辨不出两者的差别,就说明机器人学得够像了。这套方法来自一个叫AMP的经典技术。
下半身这块,采用的办法是传统参考轨迹跟踪,直接让机器人朝经过力学调整后的目标姿态去靠,计算量不大,落地也容易。
两种方式各有侧重,实验结果显示,两者在脚步跟随精度和柔顺性上表现相当接近,差距都在一两厘米、零点几牛顿的量级,几乎可以忽略。真正拉开差距的是舞步风格的自然程度。研究者专门做了对照实验,把解耦策略里的对抗项直接去掉,只留下跟随和柔顺的奖励,结果下半身的姿态误差和朝向误差都显著变差,朝向误差在带力事件的片段里涨到原来的2.6倍,在无力片段里涨到3.0倍。论文配的图也很直观:没有对抗项约束的机器人,骨盆会转向偏离舞伴朝向的方向,腰胯往行进方向的反方向拧,站姿变成一种蹲伏状态,整体看起来很怪异,不像在跳舞,倒像在勉强维持平衡。
这说明一件事:让机器人回应物理接触,和让机器人保持自己的动作风格,这两个目标必须明确分开处理,才能两头都做好;一旦混在一起优化,很容易顾此失彼。
柔顺究竟能柔到什么程度
“柔顺”这个说法听起来有点虚,论文倒是给了一个相当具体的量化指标。
研究者做了一组对照实验。基准策略只会机械地复现原始参考动作,受力后完全不做调整,他们把它叫作“僵硬跟踪者”。
结果是这样的:在训练阶段见过的动作片段上,CoDance训练出的柔顺策略手腕位移,大约达到力学增强数据中预设位移量的80%;那个僵硬跟踪者的手腕,只走了预设位移量的约20%。
这组数字放到现实里是什么意思?舞伴使劲拽机器人手腕时,柔顺策略的手臂会顺着力道移开大部分该移的距离,好比一条放松的手臂被人轻轻一带就跟着走了。僵硬策略的手臂则几乎钉在原地,舞伴的拉力等于白费,真在现实里拉起来,手感就像拽一根焊死的铁棍,手腕很可能被硬生生顶伤。80%对20%这个差距,不只在训练过的动作上成立,换成从没训练过的新动作片段,优势照样在,两种柔顺策略的误差增长都不到1厘米。换句话说,这套力学增强数据养出来的柔顺反应能举一反三,不是靠死记硬背。
跳到一半要掉头,怎么办
真实跳舞时方向切换很常见。舞伴往前走过一段,忽然又往后退,机器人得跟着掉头,不能继续照原计划一路走到底。
论文里对应这个场景的训练机制,叫片段衔接。
片段衔接*:训练时把两段方向不同的动作片段首尾接在一起。一段播完,系统从训练库里随机抽另一段,从舞伴当前的位置接着播,于是一次训练能跨过不止一个片段。机器人因此学到的不只是单独跳完一段舞步,还有片段与片段之间怎么平滑过渡。
不做这个设计会怎样?研究者专门测了一个没用片段衔接训练的策略,在需要掉头衔接的测试场景里,成功率只有48%,差不多一半的尝试会在衔接那一刻直接失败。用了衔接训练的两种策略,成功率都在96%以上。有意思的是,失败那个策略在失败前的脚步误差和成功策略差不多,说明它不是没跟上舞伴,而是切换方向这个动作压根没学过,到了那一瞬间直接懵了,不知道该怎么从往前走换成往后走。
这就像一个只背过单个舞步套路、从没练过衔接的舞者。前半段跳得挺好,音乐突然变调要求转身换方向,他完全不知道怎么从上一个动作自然过渡到下一个,只能僵在原地或者直接乱了阵脚。衔接训练做的事,说到底就是提前让机器人经历无数次“从一种状态切到另一种状态”,真到了要掉头的那一刻,它已经练过很多遍,不会手足无措。
真机器人跳起来是什么样
仿真数据说了这么多,最终还得看机器人在现实世界里表现如何。
研究团队把训练好的解耦策略部署到一台宇树科技的G1人形机器人上,控制频率50赫兹。现场用一套叫Vicon的动作捕捉系统追踪真人舞伴的骨盆和膝盖位置,以及机器人自身骨盆的位置,这些数据实时喂给机器人的策略网络,输入格式和训练时是同一套。两只手的虚拟刚度设成固定值,真实的力直接来自人手的物理接触,不再是仿真里生成的虚拟力。
测试总共跑了三轮:1 次是持续 12.8 秒的单向舞步,另外 2 次各持续 38.9 秒,舞步里包含前进与后退的反复切换。三轮都没出岔子,机器人一次也没跌倒。三轮测试中,机器人与舞伴的距离分别有 93%、83%、73% 的时间保持在目标距离 0.5 米上下 0.1 米的区间内,平均距离落在 0.48 到 0.5 米之间,跟预设的跟随间距咬得很紧。整支舞跳下来,两者一同位移了约 3.8 米。
研究团队还额外做了个小实验,单独测机器人站着不动、只有手部受力时的柔顺反应,分单手挂重物、双手朝不同方向拉、双手同时往外拉三种情况。机器人的胳膊都跟着力的方向移动,脚下却稳稳不动。这个小实验某种程度上是对前面那套力学增强训练效果最干净的验证:排除跟随舞伴这个变量之后,纯粹看柔顺反应,表现确实符合预期。
眼下的短板也很明显,论文作者并未回避。训练素材只有一段视频、一种舞蹈,仿真环境中舞伴的动作是固定播放的,谈不上真正的双向互动智能。一旦舞伴的实际走向与机器人预期的参考方向完全相反,能完整跑完全程的测试大约只占四分之一,可见系统对参考动作的依赖仍相当重。跟随的几何关系同样被锁死在固定的前后偏移上,双人舞里常见的旋转、托举、换位这类更复杂的互动,这套系统目前还接不住。
CoDance 不会停在这里。论文末尾,研究者给出了后续打算:把方法推广到下沉起身、转身、箱步等更复杂的舞蹈元素上;力学增强那套流程目前只作用于手腕,他们想把它延伸到身体任意选定的部位。
写在后面
论文里有个细节让我想了很久。数据生成环节,研究者特意加了一道平衡预算的保险:每次模拟受力前先算重心会偏多少,一旦超出就自动把力调小。看着不起眼,却点破了一件常被忽略的事——柔顺并不等于无条件让步。真正柔顺的让步是有底线的:既要顺着外力变形,又不能让自己站不稳摔下去。人与人相处也差不多,肯迁就对方,不等于放弃自己的立场,边界感和柔软度可以并存。
另一个让我意外的是论文中“倒放测试”的结果。把舞伴动作的时间轴倒过来播放,机器人的失败率远高于随便猜的水平,成功率只有 28.6%。也就是说,它学到的是一种非常具体、与特定参考动作牢牢绑定的协调能力,而非抽象的、放之四海皆准的“跟随能力”。这提醒人,眼下不少看似聪明的机器人行为,背后可能是高度依赖特定场景数据训练出来的;场景稍一变动,暴露出的脆弱程度或许会超出预期。
被人拉手时顺势移动手臂,机器人已经学会了;可舞伴改变主意时随机应变、重新规划整支舞,它还不会。中间这道鸿沟,究竟要多少段视频、多少种舞伴动作,才能真的填平?
Q&A
Q1:CoDance是什么?
A:CoDance是杜克大学团队提出的框架。它让人形机器人看一段双人跳舞视频,就能学会跟着真人舞伴的脚步走;双手保持接触的时候,机器人还能做出柔顺的力学反应,人机双人舞因此可以一直跳下去。
Q2:训练CoDance所用的机器人数据,是从哪里来的?
A:数据来源是一段9.7秒的真人双人舞视频。团队先做姿态提取和动作重定向,再用多连杆柔顺增强技术处理,把单纯的动作数据变成同时带有力学信息的训练数据,整个过程不用另加力传感器去采集。这套框架训练出的机器人,已经部署到宇树G1人形机器人上。实测中,它和真人连着跳了38.9秒双人舞,三次测试都没有摔倒;大部分时间里,跟随距离保持在目标值0.5米上下0.1米的范围内。