4. 静态步态规划:三脚支撑与四脚支撑的切换逻辑、重心投影法、静态稳定性判据

静态步态,说白了就是机器人走路时,每一步都保证重心落在支撑多边形内。听起来简单,但实际做起来,坑不少。我记得刚入行那会儿,觉得静态步态不就是慢点走嘛,结果第一次让机器人迈腿,直接侧翻——嗯,重心投影没算对。

这一章,我们重点聊三个东西:支撑相切换逻辑、重心投影法、以及静态稳定性判据。掌握了这些,你就能让四足机器人稳稳地迈出每一步。

4.1 支撑相与摆动相的基本概念

先明确两个基本状态:

  • 支撑相:腿接触地面,承担体重。
  • 摆动相:腿抬起,向前迈步。

静态步态的核心,就是保证在任何时刻,至少有三条腿处于支撑相。四足机器人有四种可能的支撑组合:

支撑类型 支撑腿数量 典型应用场景
四脚支撑 4 起步、停止、姿态调整
三脚支撑 3 迈步过程中
两脚支撑 2 动态步态(后续章节)

静态步态只用到前两种。四脚支撑是安全态,三脚支撑是过渡态。

4.2 三脚支撑与四脚支撑的切换逻辑

切换逻辑其实不复杂,但顺序错了就会翻车。我见过不少同学直接把摆动腿抬起来,结果重心一偏,机器人直接倒。正确的做法是:先规划重心,再抬腿。

4.2.1 四脚支撑 → 三脚支撑

切换条件:

  1. 当前处于四脚支撑稳定状态。
  2. 确定要抬起的腿(比如右前腿)。
  3. 将重心移动到剩余三条腿构成的三角形内。
  4. 确认重心投影在三角形内后,再抬起目标腿。
注意: 重心移动需要时间。如果移动速度太快,惯性会导致实际重心偏离规划位置。我曾经在仿真中设了过大的重心移动速度,结果每次抬腿都触发倾覆预警。后来把移动时间从0.2秒延长到0.5秒,问题就解决了。

4.2.2 三脚支撑 → 四脚支撑

切换条件:

  1. 摆动腿落地,形成四脚支撑。
  2. 确认所有足端接触力正常。
  3. 将重心移回四脚支撑的中心位置。

这里有个细节:落地瞬间,摆动腿的足端速度应该接近零,否则会产生冲击力。我习惯在摆动相末端加一段减速曲线,让足端平滑着陆。

4.3 重心投影法

重心投影法,说白了就是计算机器人整体重心(CoM)在水平面上的投影点,然后判断这个点是否落在支撑多边形内。

4.3.1 重心位置计算

对于四足机器人,重心位置由机身和四条腿共同决定:

// 伪代码:计算整体重心位置
Vec3 computeCoM() {
    Vec3 com = body_mass * body_position;
    for (int i = 0; i < 4; i++) {
        com += leg_mass * leg_com_position[i];
    }
    com /= (body_mass + 4 * leg_mass);
    return com;
}

实际项目中,腿的质量占比不大,但也不能忽略。我做过一个对比:忽略腿质量时,重心误差大约3-5厘米,对于静态步态来说,这个误差足以导致不稳定。

4.3.2 支撑多边形构建

支撑多边形就是所有支撑腿足端在水平面上的凸包。对于三脚支撑,它是一个三角形;对于四脚支撑,它是一个四边形。

构建方法:

  • 获取所有支撑腿的足端位置(x, y坐标)。
  • 计算这些点的凸包(Convex Hull)。
  • 凸包内部区域就是支撑多边形。
小技巧: 在仿真中,我常用Graham扫描法计算凸包。代码量不大,而且效率高。如果不想自己写,OpenCV的convexHull函数也能直接用。

4.3.3 投影点与多边形的位置关系

判断重心投影点是否在支撑多边形内,常用方法有两种:

方法 原理 优缺点
射线法 从点出发引一条射线,统计与多边形边的交点数量 通用性强,但需要处理边界情况
面积法 将多边形分割为三角形,计算点与各边构成的三角形面积之和 计算简单,适合三角形支撑多边形

我个人偏爱面积法,尤其是三脚支撑时,直接判断三个小三角形面积之和是否等于大三角形面积即可。

4.4 静态稳定性判据

静态稳定性判据,核心就一句话:重心投影点必须在支撑多边形内部,且留有一定裕量。

4.4.1 稳定裕度

稳定裕度(Stability Margin)是衡量稳定程度的指标。常见的有:

  • 稳定裕度:重心投影点到支撑多边形各边的最短距离。
  • 相对稳定裕度:最短距离除以支撑多边形的特征尺寸(如外接圆半径)。

我一般要求稳定裕度不小于5厘米。如果裕度太小,地面稍微不平或者足端打滑,机器人就会失去稳定。

4.4.2 判据公式

静态稳定性判据可以写成:

bool isStaticallyStable(Vec2 com_proj, vector<Vec2> support_polygon, float margin) {
    // 计算重心投影点到支撑多边形各边的距离
    for (int i = 0; i < support_polygon.size(); i++) {
        Vec2 p1 = support_polygon[i];
        Vec2 p2 = support_polygon[(i+1) % support_polygon.size()];
        float dist = pointToLineDistance(com_proj, p1, p2);
        if (dist < margin) return false;
    }
    // 检查点是否在多边形内部
    return isPointInsidePolygon(com_proj, support_polygon);
}
关键点: 稳定裕度不是越大越好。裕度过大,意味着重心移动过多,步态周期变长,行走效率降低。我通常在平坦地面上设5厘米裕度,在崎岖地面上增加到8-10厘米。

4.5 静态步态规划流程

把上面的知识点串起来,静态步态规划的完整流程如下:

  1. 初始化:四脚支撑,重心位于支撑四边形中心。
  2. 选择摆动腿:按对角顺序(如右前→左后→左前→右后)。
  3. 移动重心:将重心投影移动到目标三脚支撑三角形的稳定区域内。
  4. 抬腿摆动:抬起摆动腿,沿规划轨迹向前迈步。
  5. 落地:摆动腿落地,形成新的四脚支撑。
  6. 重心归位:将重心移回新四脚支撑的中心。
  7. 重复:选择下一组摆动腿,继续循环。

你想想看,这个流程其实和人类走路很像——先转移重心,再迈腿。只不过机器人需要精确计算每一步的稳定裕度。

4.6 知识结构图

下面这张图总结了本章的核心知识结构:

静态步态规划知识结构 静态步态规划 支撑相切换逻辑 重心投影法 静态稳定性判据 四脚→三脚 三脚→四脚 CoM计算 支撑多边形 稳定裕度 判据公式 核心原则:重心投影始终落在支撑多边形内,并保留足够裕量 三脚支撑是过渡态,四脚支撑是安全态

4.7 避坑指南

最后,分享几个我在项目中踩过的坑:

  • 重心移动速度过快:仿真中看着没问题,但实际机器人有惯性,容易超调。我后来加了速度限制和低通滤波。
  • 忽略足端滑动:仿真中地面摩擦系数是理想的,但实际中足端会滑动。我习惯在仿真中设置一个较小的摩擦系数(0.6左右),留出安全余量。
  • 稳定裕度设得太小:为了追求步态流畅,我把裕度压到2厘米,结果稍微有点地面不平就翻车。现在至少留5厘米。
  • 摆动腿轨迹不连续:抬腿和落腿瞬间速度突变,导致冲击力。我改用五次多项式插值,保证位置、速度、加速度都连续。

静态步态是四足机器人步态规划的基础。虽然它走得慢,但胜在稳定可靠。等你把静态步态跑通了,再去做动态步态,心里就有底了。