4. 静态步态规划:三脚支撑与四脚支撑的切换逻辑、重心投影法、静态稳定性判据
静态步态,说白了就是机器人走路时,每一步都保证重心落在支撑多边形内。听起来简单,但实际做起来,坑不少。我记得刚入行那会儿,觉得静态步态不就是慢点走嘛,结果第一次让机器人迈腿,直接侧翻——嗯,重心投影没算对。
这一章,我们重点聊三个东西:支撑相切换逻辑、重心投影法、以及静态稳定性判据。掌握了这些,你就能让四足机器人稳稳地迈出每一步。
4.1 支撑相与摆动相的基本概念
先明确两个基本状态:
- 支撑相:腿接触地面,承担体重。
- 摆动相:腿抬起,向前迈步。
静态步态的核心,就是保证在任何时刻,至少有三条腿处于支撑相。四足机器人有四种可能的支撑组合:
| 支撑类型 | 支撑腿数量 | 典型应用场景 |
|---|---|---|
| 四脚支撑 | 4 | 起步、停止、姿态调整 |
| 三脚支撑 | 3 | 迈步过程中 |
| 两脚支撑 | 2 | 动态步态(后续章节) |
静态步态只用到前两种。四脚支撑是安全态,三脚支撑是过渡态。
4.2 三脚支撑与四脚支撑的切换逻辑
切换逻辑其实不复杂,但顺序错了就会翻车。我见过不少同学直接把摆动腿抬起来,结果重心一偏,机器人直接倒。正确的做法是:先规划重心,再抬腿。
4.2.1 四脚支撑 → 三脚支撑
切换条件:
- 当前处于四脚支撑稳定状态。
- 确定要抬起的腿(比如右前腿)。
- 将重心移动到剩余三条腿构成的三角形内。
- 确认重心投影在三角形内后,再抬起目标腿。
4.2.2 三脚支撑 → 四脚支撑
切换条件:
- 摆动腿落地,形成四脚支撑。
- 确认所有足端接触力正常。
- 将重心移回四脚支撑的中心位置。
这里有个细节:落地瞬间,摆动腿的足端速度应该接近零,否则会产生冲击力。我习惯在摆动相末端加一段减速曲线,让足端平滑着陆。
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)。
- 凸包内部区域就是支撑多边形。
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);
}
4.5 静态步态规划流程
把上面的知识点串起来,静态步态规划的完整流程如下:
- 初始化:四脚支撑,重心位于支撑四边形中心。
- 选择摆动腿:按对角顺序(如右前→左后→左前→右后)。
- 移动重心:将重心投影移动到目标三脚支撑三角形的稳定区域内。
- 抬腿摆动:抬起摆动腿,沿规划轨迹向前迈步。
- 落地:摆动腿落地,形成新的四脚支撑。
- 重心归位:将重心移回新四脚支撑的中心。
- 重复:选择下一组摆动腿,继续循环。
你想想看,这个流程其实和人类走路很像——先转移重心,再迈腿。只不过机器人需要精确计算每一步的稳定裕度。
4.6 知识结构图
下面这张图总结了本章的核心知识结构:
4.7 避坑指南
最后,分享几个我在项目中踩过的坑:
- 重心移动速度过快:仿真中看着没问题,但实际机器人有惯性,容易超调。我后来加了速度限制和低通滤波。
- 忽略足端滑动:仿真中地面摩擦系数是理想的,但实际中足端会滑动。我习惯在仿真中设置一个较小的摩擦系数(0.6左右),留出安全余量。
- 稳定裕度设得太小:为了追求步态流畅,我把裕度压到2厘米,结果稍微有点地面不平就翻车。现在至少留5厘米。
- 摆动腿轨迹不连续:抬腿和落腿瞬间速度突变,导致冲击力。我改用五次多项式插值,保证位置、速度、加速度都连续。
静态步态是四足机器人步态规划的基础。虽然它走得慢,但胜在稳定可靠。等你把静态步态跑通了,再去做动态步态,心里就有底了。