仿人机器人 - 5 全身运动模式生成

本文为书籍 Introduction to Humanoid Robotics 的汉化, 主要借助翻译器 DeepL.

另外, 原书有管贻生教授的译作版本:《仿人机器人》(清华大学出版社, 2007年). 强烈推荐.


5 全身运动模式生成 (Generation of Whole Body Motion Patterns)

在本章中, 我们将介绍如何为仿人机器人生成全身运动模式. 这一领域的研究仍在进行中, 最终方法仍有待开发. 因此, 我们将简单介绍目前正在使用的示例.

5.1 如何生成全身运动

让我们考虑图 5.1 所示的运动. 机器人首先要从站立姿势移动到跪姿, 从地面提起行李, 然后将行李向前搬运 1 [m]. 您将如何生成这样的全身运动?聪明的读者现在可能已经有了计划.

要生成行走模式, 可以使用前一章讨论过的方法. 问题在于如何产生运动, 使机器人能够拾起盒子. 为什么不能使用与工业机器人机械手相同的方法呢?

如图 5.3 所示, 工业 6 轴机器人机械手通常配有一个称为示教器的装置. 通过该装置, 您可以设定末端执行器的初始位置和姿态, 可能用于焊接, 喷涂或抓取. 此外, 您还可以设置末端执行器必须经过的路径点, 控制器将在这些点之间进行插补, 并生成控制角轨迹. 之所以能做到这一点, 是因为 6 轴工业机器人机械手的关节数量最少, 只有 6 个自由度. 因此, 如果设定了相当于 6 个自由度的位置和姿态, 就可以使用逆运动学求解关节角度.

与具有多个自由度的机器人 (如仿人机器人) 的主要区别在于, 即使您设定了末端效应器的位置和姿态, 也不会得到唯一的解决方案, 而是会有多个解决方案. 您可以通过站立抓住门把手, 然后蹲下来试试. 另一个复杂因素是, 仿人机器人不像工业机器人操纵器那样通过螺栓固定在地面上. 这就意味着, 不仅需要确保初始姿势, 中间姿势和目标姿势能够让机器人保持平衡, 还必须确保 ZMP 轨迹保持在由机器人与地面的接触点所定义的支撑多边形内.

因此, 下面讨论的大多数方法都会首先生成一个粗略的全身运动轨迹, 然后对其进行修改, 使 ZMP 运动轨迹保持在支撑多边形内. 图 5.4 显示了生成全身运动所需的步骤. 在步骤 A 中, 我们首先生成符合要求的全身运动. 在步骤 B 中, 我们进行必要的调整, 使机器人保持平衡. 大多数仿人机器人都有保持机器人稳定的传感器反馈回路, 因此实际使用的运动是对步骤 B 中生成的轨迹进行的进一步修改.

如果在步骤 B 中创建的运动是完美的, 那么步骤 C 可能不是绝对必要的. 不过, 大家可能都知道, 这个世界并不完美, 所以认为可以预先定义与现实世界相关的所有参数是不现实的.

5.2 生成粗略的全身运动

大约有三种方法可以生成大致符合您要求的全身运动.

  1. 使用动作捕捉, 获取人体数据.
  2. 创建 GUI (图形用户界面) 或使用 CAD 系统.
  3. 使用高速多元搜索方法.

下面我们将详细介绍.

5.2.1 使用动作捕捉技术

仿人机器人是为了像人一样而制造的, 因此尝试使用从真实人体运动中捕捉到的数据是很自然的一步. 要实际捕捉这些数据, 通常只需使用动作捕捉系统. 图 5.5 显示的是一个人在跳津轻 Jongara-bushi (日本北部的一种舞蹈) 时的动作捕捉数据[121]. 这可以让您轻松捕捉到人的全身动作. 然而, 仿人机器人与真实的人之间存在细微差别. 这意味着你不能简单地将这些数据发送给机器人, 然后指望它能正常运动.

5.2.2 使用图形用户界面

在计算机生成的动画中, 你可以看到人或拟人化的动物和机器人四处走动, 就像它们存在于现实世界中一样. 从这个意义上说, 用于计算机制图的工具同样适用于生成仿人机器人的动作. Pin/Drag 界面[76]是一种用于生成仿人机器人动作的方法.

基本概念如图 5.6 所示. 您 "钉住" (Pin) 不应移动的链节, 并将想要移动的端点移动到您希望它们移动的位置. 通过使用 Pin/Drag 界面, 可以为整个机器人创建自然的动作.

图 5.7 显示的是两条腿的脚趾和脚跟以及左手被按住时产生的运动. 右手通过拖动屏幕中的部件向下移动, 然后向上移动, 持续时间为 4 秒钟. 可以看到, 机器人从地上捡起东西的动作看起来很自然. 不过, 这个动作只能满足您在动作生成过程中发送的物理约束. 它并不满足诸如 ZMP 等动态约束条件. 如果按原样使用这个动作, 机器人仍有可能摔倒.

5.2.3 使用高速多元搜索方法

虽然使用运动捕捉和基于图形用户界面的方法可能比较直观, 但仍然比较麻烦, 而且耗时. 第三种解决方案是使用 RRT[48] 等方法进行高速多变量搜索. 通过搜索所有关节产生的向量空间, 可以生成满足各种条件的运动, 例如在不与桌子表面等障碍物发生碰撞的情况下伸手到桌子下面[49].

在这种方法中, 通过准备仿人机器人及其周围环境的三维数据, 可以在 6 秒内自动生成全身运动, 如图 5.8 所示的从椅子下面伸手的动作. 利用这种方法, 您可以搜索满足物理约束条件的稳定姿势, 然后创建将这些姿势平滑连接起来的关节轨迹. 因此, 无法生成动态稳定的全身运动.

5.3 将全身运动模式转换为动态稳定运动

使用第 5.2 节中介绍的方法生成的运动并不具有动态稳定性, 因此不能简单地用它们来控制真实的机器人. 因此, 下一步就是将生成的轨迹从一系列静态稳定的姿势转换为动态稳定的关节轨迹, 如图 5.4 所示. 在本节中, 我们将介绍动力学滤波器, 自动平衡器和严格的躯干运动计算. 上一节介绍的使用预览控制的动态过滤方法也是将轨迹转换为动态稳定轨迹的一种方法.

5.3.1 动力学滤波器

动力学滤波方法是一种将物理上不可能的全身运动转换为物理上可行的运动的过滤方法[79] [76]. 该方法由控制器和优化器组成 (图 5.9) . 控制器将未经测试的原始轨迹 和机器人当前状态 作为输入. 它由局部和全局反馈回路组成, 用于计算下一个目标关节加速度 . 这个目标关节加速度不一定能在此时实现. 优化器会寻找一种解决方案, 既能满足机器人的物理约束条件 (地面阻力, 地面接触点的受力方向) , 又能将关节所需的加速度 保持在最低水平.

图 5.10 上半部分显示的是运动捕捉数据. 下半部分显示的是使用动力学滤波器转换后的数据. 可以看到, 脚的定位已转换为更逼真的轨迹.

5.3.2 自动平衡器

自动平衡器在每个时间步对关节角度进行二阶优化[147]. 在这种方法中, 重点是静态稳定性, 因此虽然它不能用于稳定行走, 但对于稳定机器人保持在同一位置且支撑多边形不变的运动是有效的[148].

这个名字最初出现在 Yuki Masami 创作的漫画 Patlabor (小学馆) 中. 使机器人 (漫画中称为劳工) 保持平衡的系统称为自动平衡器. 受这一系统启发的田宫等人在他们的系统中使用了相同的名称.

这种方法可以应用于步行, 但只适用于缓慢的静态步行[112].

自动平衡器通过以下方式使机器人保持平衡:

  1. 使机器人的重心沿通过支撑多边形中给定点的轴线移动.
  2. 将绕该轴的力矩控制在一定范围内.

允许绕轴的力矩量是根据保持 ZMP 点在支撑多边形内所必须满足的条件, 以及在下一个时间段前保持力矩力低于零所必须满足的条件计算得出的. 这种平衡补偿方法基本上是一个二阶运筹学问题, 可以解决尽可能接近原始要求的全身运动问题. 自动平衡器会在所有时间步长内执行这些计算.

图 5.11 显示了使用图 5.8 所示的 RRT 方法生成全身运动, 然后使用自动平衡器进行稳定, 最后由仿人机器人 H6 实际执行的情况[49].

5.3.3 严格的躯干运动计算算法

躯干运动补偿算法将腿部, ZMP 和手部的运动轨迹作为输入, 为躯干底部创建运动轨迹. 计算结果将作为整个身体的运动轨迹[53].

图 5.12 显示了该算法的流程图. 线性化和碰撞检测与规避中使用的假设是: 腰部关节的高度不变, 简化的手臂模型只在水平面内移动, 上半身的近似重心不会沿 轴移动. 通过对目标 ZMP 点周围的 3 轴力矩进行快速傅立叶变换 (FFT) , 然后进行反 FFT 变换, 就能很好地估计躯干的运动. 将其用于机器人的实际模型, 就可以计算出目标 ZMP 点周围的力矩误差, 这是因为使用了近似值而不是实际模型. 将这些值相加并整合, 就可以重新计算出一个更接近的估计值. 通过对整个过程进行迭代, 可以使解法趋近于分析解法.

这种算法可以获得精确的分析解, 但缺点是需要循环进行大量计算. 因此, 有一种方法可以根据第 次计算的矩误差来假设近似模型的实际误差. 利用这种方法提出的算法可以将所需的计算量减少到 1/100.

要处理非重复运动, 如运动的开始和结束, 可以创建实际运动前后很长一段时间没有运动的数据, 并应用相同的算法. 如图 5.13 所示, 严格躯干运动计算[53]用于生成仿人机器人 WABIAN 的全身运动.

5.4 仿人机器人全身运动生成的远程操作

在制作仿人机器人跳舞或演奏乐器时, 您有足够的时间准备数据, 因此可以使用离线运动生成方法. 但是, 如果要在一个从未去过的地方或新的环境中使用仿人机器人, 就需要在线或实时生成全身动作.

遗憾的是, 机器人对自身环境的感知和规划能力远不及人类. 因此, 已经提出的方法都试图尽可能地利用人类固有的这种能力.

如图 5.4 所示, 仿人机器人的在线运动生成与离线运动生成相同. 首先生成一个粗略的近似值 (步骤 A) , 然后对其进行修改, 使机器人能够正确保持平衡 (步骤 B) , 之后再次修改以补偿动态运动 (步骤 C) . 但是, 当你必须实时快速地完成所有这些工作时, 情况就会发生很大变化. 无论多么粗糙, 实时创建全身运动轨迹都不是一件容易的事. 因此, 在对仿人机器人进行远程操作时, 需要修改上述步骤 A 和 B, 并执行以下操作. 在步骤 A 中, 先生成部分身体运动轨迹, 然后在步骤 B 中创建全身运动轨迹, 使机器人保持稳定, 然后在步骤 C 中使用稳定器, 利用传感器反馈保持机器人稳定, 并修改全身运动轨迹.

下面我们将介绍如何利用仿人机器人的全身动作进行远程操作.

在步骤 A 中, 我们将学习 "使用操作点切换法远程生成全身运动". 步骤 B 的重点是 "利用分解动量控制产生全身运动". 在上一章中, 我们已经讨论过利用传感器反馈稳定机器人的方法.

5.4.1 使用操作点切换法远程生成全身运动

由于仿人机器人有很大的自由度, 要真正实时创建全身动作, 需要一个像动作捕捉系统这样的大型系统. 然而, 仿人机器人与人类并不完全相同, 因此捕捉到的数据不能在未经修改的情况下使用.

因此, 让我们反思一下我们每天究竟是如何活动身体的. 人们会根据自己想要做的事情, 将注意力集中在不同的部位. 他们将注意力转移到对手头的操作最重要的部位, 并有意识地移动它. 与此同时, 为了保持平衡或更轻松地完成手头的任务, 人们会 "无意识 "地移动那些对操作无关紧要的关节.

例如, 当你伸手去拿桌子上的瓶子时, 你的注意力会集中在拿瓶子的那只手上. 当你准备坐下时, 你会把注意力集中在你的屁股上, 同时把身体往椅子上放. 当你要踢球时, 你的注意力会集中在要踢球的那只脚上 (图 5.14) .

我们关注的部分通常是在一定的自由度范围内移动的, 因此通常可以使用简单的输入设备 (如操纵杆) 来指示所需的运动. 另一方面, 无意识移动的部分可以作为控制的一部分来实现, 使机器人保持平衡. 这样, 您就可以控制机器人, 而无需考虑人类与机器人之间的几何和动态差异. 这就是注意力点切换法的基础[25].

举例来说, 我们将解释如何使用两个操纵杆为仿人机器人产生全身运动. 首先, 我们为操纵杆上的八个按钮分配功能, 如图 5.15 所示. 功能包括头部, 左右手, 左右腕, 躯干和左右脚的指示, 以及世界, 躯干和本地三个坐标之间的切换. 操作员按下代表他要操作的位置的按钮, 然后使用操纵杆指定方向, 产生全身运动, 从而改变正在操作的仿人机器人身体部分的姿态和位置.

5.4.2 利用分解动量控制生成稳定的全身运动

在掌握了仿人机器人的准确物理参数后, 就可以通过指定平移和角动量的变化量来生成机器人的全身运动, 并以此为基础计算关节角速度. 这就是所谓的分解动量控制 [108].

首先, 使用具有四个开放链节的六自由度身体链节为人形机器人建模, 如 5.16 所示.

通过这种方法, 您可以使用以下公式计算目标速度 , 目标角速度 和躯干坐标系 速度 , 角速度 .

如果给定肢体末端坐标 (定义在固定于地面的世界坐标 中) 中的肢体末端目标速度 和肢体末端目标角速度 , 以及躯干局部坐标 中的目标速度 和角速度 , 则第 个肢体的目标关节角度 可用以下方法计算.

这里, 是第 个肢体的雅可比矩阵的广义逆矩阵. 是一个 的单位矩阵, 是起始于躯干坐标原点, 止于运算坐标 原点的向量. 算子 是反对称矩阵, 相当于叉乘.

公式 5.1 中的 由要进行的遥控操作决定. 例如, 如果操作员想用手腕做平移运动, 那么操作员可以使用遥控器的杠杆来公开指定平移速度向量 的精确运动量. 在这一操作过程中, 右手旋转速度向量 的所有元素都将与所有其他肢体的旋转和平移速度向量 一起被设置为零.

在分解动量控制框架内, 可以移动其余肢体以满足所需的运动要求. 不过, 由于这通常会导致机器人出现不可预测的行为, 因此通常会保持其余肢体不动.

可通过以下公式计算, 并采用分解动量控制. 它们依赖于仿人机器人的目标平移动量 , 围绕重心的目标角动量 , 这些动量由机器人自主计算或由远程操作员指定.

其中

是惯性矩阵, 表示机器人的总平移动量和角动量对第 个链节的影响. 是机器人的总质心, 是围绕机器人重心的惯性张量, 是基于机器人躯干坐标系 的势向量. 是一个 单位矩阵, 表示伪逆矩阵. 是一个 的选择矩阵 , 它提供了要控制的力矩元素, 具体描述如下:

这里, 是一个 的列向量, 其中与要控制的力矩元素相对应的元素设为 1, 其余为 0.

如果将其设置为控制所有力矩元素, 则 will not have an area set to zero, 因此无法通过公式 (5.1) 和 (5.2) 控制 .

在公式 5.2 中, 由远程操作员指定. 可由机器人的控制系统自主计算. 例如, 可用来保持机器人的平衡. 如果我们将坐标系 定义为与世界坐标系 平行, 其原点位于机器人支撑多边形的中心, 那么总平移动量 坐标系 中的平移速度之间的关系可描述如下:

因此, 通过使用下式计算目标平移动量 , 可以将重心 移动到给定位置 .

上面的 是预设增益. 将公式 (5.4) 添加到机器人内部的自主控制器中, 操作员就可以在机器人保持平衡的情况下指定运动, 而无需考虑运动学和动力学之间的区别.

就精度而言, 仅使用公式 (5.4) 只能保证机器人的重心保持在支撑多边形内. 但如果同时考虑机器人质心周围的目标角动量 并将其保持为零, 或者将躯干坐标系的目标加速度 保持在足够小的值上, 就能让机器人保持平衡.

5.4.3 仿人机器人 HRP-2 的应用与实验

图 5.17 展示了我们在上一节中介绍的远程全身操作系统在仿人机器人 HRP-2 上的实施示例. 控制系统主要由输入设备服务器, 全身运动生成器和稳定器等子系统组成[26].

输入设备服务器根据远程机器人操作的操作点切换方法, 利用输入为仿人机器人的一部分生成动作. 这是在一台运行 Linux 的电脑上实现的. 用户使用两个三自由度操纵杆及其上的按钮产生运动, 设定躯干坐标系 和被操作链节 的目标平移和旋转速度.

全身运动发生器使用分解动量法为机器人产生稳定的全身运动. 它被置于机器人内部. 由该组件产生的运动被传送到 PC 中的 I/O 控制板, 然后再传送到伺服驱动器板.

稳定器利用传感器反馈使机器人处于稳定状态.

图 5.18 显示了使用 HRP-2 拿起放在桌上不同位置的易拉罐, 并通过遥控操作将其扔进垃圾桶的图像.

实际操作流程如下:

  1. 仿人机器人 HRP-2 站在离桌子大约 3 米远的地方.
  2. 操作员首先使用操纵杆将 HRP-2 的头部指向工作台, 以确定罐子的位置.
  3. 找到罐子后, 机器人就会靠近罐子. 操作员使用操纵杆指示行走的方向和速度.
  4. 机器人停下来, 利用 3D 视觉系统[146] 确定罐子的位置, 并测量与罐子的距离.
  5. 根据检测到的位置数据, 机器人计算出手的轨迹, 并自动抓起罐子.
  6. 操作员使用遥控操作提起罐子, 并检查罐子是否抓牢.
  7. 机器人重新开始行走, 然后走到垃圾桶旁, 把罐子扔掉. 这部分工作完全由远程操作完成.

有一次, 机器人把罐子抓得太紧, 罐子卡在了它的手上. 不过, 操作员能够远程摇动机器人的手, 因此能够放下罐子. 实施远程操作的好处之一就是可以自动进行这种高级别的错误恢复.

5.5 减少仿人机器人向后摔倒时的冲击力

任何没有固定在地面上的东西都有可能翻倒. 如图 5.19 所示, 一个物体, 如人形机器人, 具有高质心和小支撑多边形, 即使翻转一个小角度, 也会变得静态不稳定.

在这本书之前, 所有内容都是关于如何保持机器人的稳定, 防止它摔倒. 从人类也会摔倒这一事实中可以看出, 在现实中不可能完全避免机器人摔倒. 因此, 仿人机器人必须能够优雅地摔倒, 以防止自身受到严重损坏. 在 HRP-2P 上使用的减少冲击控制就是一个例子[58].

HRP-2P (图 5.20) 是 HRP-2 的原型模型. 该仿人机器人身高 158 厘米, 体重 58 千克 [66]. HRP-2P 的臀部有吸收冲击力的衬垫. 因此, 最好以尽可能低的速度撞击地面.

在机器人向后倒下的实验中, 为了提高上半身的冲击吸收能力, 我们还在机器人的背部增加了衬垫.

首先, 我们将坠落本身分为五种状态, 并在每种状态下以不同方式控制机器人的运动.

  1. SQUATTING: 这是摔倒的初始状态, 机器人的质心偏离支撑多边形太远. 所有控制都会停止, 由摔倒控制接管. 它开始弯曲机器人的膝盖, 并开始弯曲颈部, 腰部和手臂, 使机器人以臀部着地.
  2. EXTEND1: 继续摔倒. 当地面与机器人脚跟着地点和臀部着地点连线的夹角 (图 5.21) 小于一定值时, 机器人开始伸展膝盖, 以降低臀部着地的速度. 这也能确保机器人用臀部着地.
  3. TOUCHDOWN: 进入下一阶段. 当角度 低于另一个值时, 机器人准备触地, 并停止对关节的伺服控制.
  4. EXTEND2: 当摔倒后经过一定时间, 机器人会伸出双腿, 以防止由于坠落的冲力而导致头部滚动.
  5. FINISH: 在经过足够的时间并检测到机器人处于稳定状态后, 机器人的关节将伸展开来, 为站立运动做准备.

如图 5.22 所示, 通过这个动作和减少冲击力, HRP-2P 能够在摔倒后站起来. 站立动作将在下一节中解释.

5.6 让仿人机器人重新站立起来

在上一节中, 我们介绍了如何减少摔倒时的冲击力, 从而避免仿人机器人自身受到严重损坏. 接下来, 我们需要的是能够再次站起来. 为此, 您必须能够从机器人正面或背面躺着的状态中爬起来. 要站起来, 必须保持机器人的平衡, 但当移动到站立状态时, 也需要干扰机器人的平衡[28]. 因此, 如图 5.23 所示, 要站立起来, 需要将其分为多个单独的动作.

在上一节中, 我们只介绍了如何让机器人从背面着陆. 然而, 让机器人正面着陆也很重要. 在这种情况下, 最终位置就是机器人正面着地的状态.

除了状态 2 和状态 3 之间的转换外, 所有状态之间的切换都是静态稳定的, 机器人的质心在与地面接触的点的支撑多边形内. 这些静态稳定的运动可以离线生成, 并在需要时重新运行.

由于踝关节的限制, 在状态 2 和状态 3 之间的转换需要对质心在支撑多边形外的平衡进行动态控制. 在从状态 3 到状态 2 的转换过程中, 机器人必须从用膝盖和脚趾保持平衡的状态转换到用脚保持平衡的状态. 髋关节的俯仰角度受到控制, 这样机器人的身体就会向后移动. 当检测到旋转时, 机器人开始将关节移动到状态 2. 为了防止机器人向后摔倒, 我们使用躯干位置顺应控制[70]来保持机器人的平衡.

我们将这种控制应用于仿人机器人 HRP-2P. 在图 图 5.24 和图 5.25 显示了机器人从面朝下和面朝上的状态中站起来的过程. 图中的 表示经过的时间. 我们在上一节 (图 5.22) 中解释了机器人的倒地动作后, 就可以利用这种控制方式让机器人在倒地后站起来.

如图 5.26 和 5.27 所示, 通过逆转图 5.23 中的状态转换, 可以让机器人躺下. 一旦机器人能够躺下并重新站起来, 可能的运动变化 (例如从汽车下面爬行) 就会大大增加.