复杂手脚协同动作组设计:前进招手动作组

        前面几周的设计开发,我已经完成了 Milk-V Duo S 开发环境搭建、WiFi 网络配置、串口控制开发、动作组调度开发、动作序列执行模块开发 以及与云端 Webhook 服务的联调。本周我继续负责 Duo S 端和机器人端动作库的完善,重点设计了一个新的复杂动作组:11-前进招手。(这个动作组之前多次尝试过,但是之前每次的调试都难以使机器人顺利执行,左右倾歪,终于在本周顺利完成了收尾,成功执行率高达98%)

        和之前的站立、摇头、普通挥手、下蹲等基础动作相比,“前进招手”不再只是单一肢体的局部动作,而是一个典型的手脚协同动作组。它需要机器人一边做出向前移动的步态变化,一边完成左右手招手动作,最后还要能够稳定回到标准站立姿态。这类动作更能体现机器人动作编排的技术难度,因为它同时涉及重心转移、腿部支撑、手臂表达、时间节奏和动作安全回正。

一、为什么要设计“前进招手”动作组

在情绪互动机器人项目中,机器人不能只停留在“听到开心就挥手”“听到紧张就下蹲”这种简单映射。我们的目标是让机器人能够根据用户输入的情绪文本或故事内容做出更自然、更有叙事感的身体表达。

例如当用户输入:

我看到朋友从远处走过来,开心地向他打招呼。

如果机器人只执行一个普通挥手动作,虽然也能表达“打招呼”,但是缺少“迎上去”的动作趋势。因此我设计了“前进招手”这个组合动作,让机器人先进入招手状态,再通过腿部步态变化模拟向前靠近,最后用左右手招手完成热情互动。

这个动作组在语义上可以对应:

语义场景 动作表达
开心见面 前进 + 招手
主动靠近用户 脚步前进
热情问候 左右手招手
故事开头的积极情绪 主动迎接式动作
演示场景中的开场动作 吸引观众注意

二、动作组整体结构

本次设计的 前进招手 一共包含 32 个动作关键帧,总执行时间约为 21.55 秒。每一个关键帧都由 <Table1> 表示,其中包含:

<ID>动作步骤编号</ID>
<Move>所有舵机的目标 P 值</Move>
<Time>当前动作持续时间</Time>
<position>上位机中舵机窗口位置</position>

它的结构不是简单地从第 1 步执行到第 32 步,而是可以分成四个阶段理解:

阶段 步骤范围 动作功能
准备阶段 1-9 从标准站立进入招手预备姿态
前进阶段 10-20 腿部开始交替运动,模拟向前移动
招手阶段 21-30 在步态基础上加入左右手招手
回正阶段 31-32 手脚同步收回,恢复标准站立
步骤 动作描述
1 机器人以标准站立姿态静止,头部居中。
2 短暂停顿(T200),保持站立姿态不变。
3 头部(#24)转向一侧至 P919,开始摇头。
4 头部在该侧停留(T500),保持偏头姿态。
5 头部转回中间偏另一侧至 P1523。
6 在该位置停留,为下一步大幅摆动蓄力。
7 头部大幅度转向相反侧至 P2058,完成一次完整摇头。
8 在大幅侧停留,突出摇头端点。
9 头部回中至 P1500,同时左臂(#21)微调至 P1500,摇头阶段结束。
10 双脚前掌抬起(#7、#8 上移),膝关节(#25)下沉,身体微蹲,准备行走。
11 左腿迈出第一步,髋膝踝(#3-#6)向前摆动,手臂配合展开,头部转向一侧。
12 右腿跟随迈步,身体重心前移,手臂交替摆动,脚踝(#27)抬起。
13 左腿再次前迈,腿部关节协调运动,身体稳步前进。
14 右腿跟进,形成连续行走节奏,手臂维持摆动。
15 左腿继续前迈,步态循环推进。
16 右腿迈步,手臂摆动幅度保持。
17 左腿前迈,身体重心平稳过渡。
18 右腿跟进,完成又一个完整步态周期。
19 左腿迈步,头部开始逐渐回中,手臂摆幅略有减小。
20 右腿迈步,身体姿态开始向站立回归。
21 左腿前迈,脚踝(#23)开始承重上抬,手臂进一步收拢。
22 右腿跟进,手臂摆动幅度继续减小。
23 左腿迈步,手臂微调配合身体平衡。
24 右腿迈步,手臂进一步收拢至近站立位。
25 左腿前迈,手臂继续回收。
26 右腿跟进,身体接近站立姿态。
27 左腿最后一步前迈,手臂基本归位。
28 右腿迈步,全身姿态趋于稳定。
29 左腿迈步,手臂完全回收至站立摆动位。
30 右腿最后一步跟进,行走即将结束。
31 双脚调平(#7、#8 回收),手臂和脚踝开始恢复站立数值,减速缓冲。
32 所有关节恢复初始站立姿态,动作结束。

三、前 9 步:从站立到招手预备姿态

动作组的第 1 步是标准站立姿态:

#3 P1895 #4 P1919 #5 P2151 #6 P1570
#7 P1477 #8 P1523 #9 P1430 #10 P826
#11 P1081 #12 P1105
#21 P1477 #22 P1000 #23 P500
#24 P1500 #25 P2500 #26 P2000 #27 P1500

这个姿态和前面博客中提到的站立动作组保持一致。这样设计的原因是:所有复杂动作都应该从统一的“零点姿态”开始,避免上一个动作遗留的姿态误差影响后续执行。

第 3 步到第 8 步主要改变的是 24 号舵机:

#24 P919
#24 P1523
#24 P2058

技术理解:24 号舵机在这里承担的是手臂摆动的主驱动作用。它从 P1500 附近的中间位置,切换到 P919、P1523、P2058 等不同角度,形成手臂上下摆动的视觉效果。为了避免突然大幅度抬臂造成机械冲击,我没有直接从 P1500 跳到最大位置,而是通过多个中间帧进行缓冲。

时间上,这一部分采用了 T300、T500 的组合。T300 用来制造较快的手臂变化,T500 用来给机器人一点停顿,让动作看起来不是机械地抽动,而是有“抬起—停顿—再摆动”的节奏。

四、第 10-20 步:加入腿部前进步态

第 10 步开始,动作不再只是手臂变化,而是加入腿部舵机的联动。例如第 11 步中,多个腿部相关舵机同时发生变化:

#3 P1988 #4 P1686 #5 P1779 #6 P1384
#7 P1600 #8 P1650 #9 P1267 #10 P1012
#11 P1500 #12 P1230

这些编号主要控制机器人下肢和身体姿态。前进动作的难点不在于让某一个舵机转动,而在于让多个舵机按照相互配合的方式变化:

  • 一侧腿部前移时,另一侧腿部要承担支撑;
  • 身体重心不能过度偏向一边,否则机器人容易倾倒;
  • 脚掌角度要配合腿部弯曲,否则容易出现“脚拖地”或“脚尖顶地”;
  • 每一步都要留出足够执行时间,让舵机实际运动能够跟上目标位置。

技术理解:机器人步态不是简单地让左右腿轮流抬起,而是一个“支撑腿—摆动腿—重心转移—脚掌落地”的连续过程。XML 中每一帧的 P 值本质上就是一个离散的关键帧,而连续动作的自然程度取决于关键帧之间的差值和 Time 时间是否合理。

五、第 21-30 步:左右手招手与前进步态合成

这个动作组最复杂的部分是第 21 步到第 30 步。在这一阶段,机器人已经处在步态运动中,同时上肢开始加入左右手招手动作。

以第 21、22、23、24 步为例:

#23 P1400 #24 P1000
#23 P2000 #24 P1000
#22 P1300 #23 P2000 #24 P1000
#21 P1200 #22 P900 #23 P2000 #24 P1000

这里的 21、22、23、24 号舵机主要参与上肢和手臂姿态表达。通过让 21、22 号舵机在 P1500/P1200、P1300/P900 之间切换,配合 23、24 号舵机的大幅度变化,机器人可以表现出左右手交替招手的感觉。

我还把这个复杂动作拆分出了两个独立动作组:

  • 16-左招手.xml
  • 17-右招手.xml

这样做的好处是:前进招手既可以作为一个完整动作组执行,也可以拆成单独的“左招手”和“右招手”供云端动作序列调用。例如云端可以根据文本语义生成:

[16, 17, 0]

表示先左招手,再右招手,最后回到站立。也可以直接生成:

[11, 0]

表示执行完整的“前进招手”复合动作组。

六、Duo S 端动作库映射设计

为了让云端 OpenClaw 生成的动作编号能够被 Duo S 端正确执行,我在动作库中加入了新的编号映射:

ACTION_MAP = {
    0: "站立.xml",
    1: "挥手.xml",
    2: "摇头.xml",
    11: "前进招手.xml",
    12: "鞠躬谢谢.xml",
    13: "下蹲保护.xml",
    16: "左招手.xml",
    17: "右招手.xml",
}

技术理解:云端传下来的不是 XML 文件本身,而是动作编号序列。Duo S 端要做的工作是把编号映射到本地动作组文件,再逐帧解析 XML,最后通过串口发送给舵机控制板。因此,动作库设计必须做到:

  1. 编号唯一,避免不同动作冲突;
  2. 文件名清晰,方便后续维护;
  3. 执行前校验动作是否存在;
  4. 动作执行完成后回到站立,减少姿态累积误差。

七、动作执行中的时间同步

11-前进招手.xml 中的时间包括 T200、T300、T500、T700、T750、T800、T1000 等多种长度。不同时间的作用不同:

时间 作用
T200 短暂停顿,用于动作节奏切换
T300 快速手臂摆动
T500 手臂动作缓冲
T700 回正过渡
T750 步态主节奏
T1000 稳定姿态或重心调整

技术理解:如果所有动作都使用同一个时间,机器人会显得非常机械。复杂动作中必须根据身体部位的功能安排时间。手臂动作可以快一点,因为惯性小;腿部和身体重心变化必须慢一点,因为它们直接影响稳定性。

八、本周总结

本周完成了复杂动作组 11-前进招手.xml 的设计和调试,并将其扩展为可拆分的 16-左招手.xml17-右招手.xml。这个动作组相比之前的基础动作有明显提升:

  • 从单一舵机动作升级为 17 个舵机协同控制;
  • 从单纯手势升级为手脚联动;
  • 从普通动作组升级为可拆分、可复用的动作模块;
  • 从本地执行扩展到云端动作编号调用;
  • 为 OpenClaw 根据情绪语义生成更丰富的动作序列提供了新的动作基础。

通过这次调试,我对动作组设计的理解也更深入了:机器人动作不是把 P 值堆在一起,而是要把“语义表达、机械结构、重心稳定、时间节奏、动作回正”统一考虑。复杂动作组真正体现的是端侧工程能力,而 Milk-V Duo S 的作用就是把云端生成的抽象动作编号,可靠地转换成真实机器人可以执行的身体语言。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐