4、传统步态控制方法:CPG控制、ZMP稳定性判据、轨迹规划与摆动腿控制

各位同学,今天我们来聊聊四足机器人步态控制里的「老前辈」们。说实话,虽然现在强化学习很火,但传统方法依然是很多工业级产品的基石。我当年刚入行时,第一个项目就是调CPG参数,那叫一个头大。但正是这些经历,让我对步态控制有了深刻的理解。

4.1 CPG控制:模仿生物节律

CPG,全称是Central Pattern Generator,中文叫中枢模式发生器。说白了,就是模仿动物脊髓里的神经回路。动物走路不用大脑想「抬左腿、迈右腿」,全靠脊髓里的CPG自动产生节律信号。

我在项目中遇到过一个问题:用CPG生成的步态,在平地上走得很稳,但一上斜坡就乱套。后来发现是相位耦合没调好。嗯,这里要注意,CPG的核心就是相位关系

核心思想: 用一组耦合的振荡器,产生多路周期性信号,分别控制四条腿的关节角度。

常见的CPG模型是Hopf振荡器,数学形式如下:

dx/dt = α(μ - r²)x - ωy
dy/dt = α(μ - r²)y + ωx
其中 r² = x² + y²,ω 控制频率,μ 控制振幅

四条腿的CPG通过耦合项连接,比如:

  • 对角腿(左前+右后):同相位,一起摆动
  • 同侧腿(左前+左后):反相位,交替摆动
  • 前腿之间:相位差180°

我曾经调试过一个四足机器人,CPG参数调了整整两周。最后发现,耦合强度不能太大,否则四条腿会「锁死」成同相位,变成兔子跳。你想想看,一个80公斤的机器人像兔子一样跳,那画面太美不敢看。

个人经验: CPG的耦合强度建议从0.1开始调,步长0.05。频率ω先固定,调好相位关系再调频率。

4.2 ZMP稳定性判据:别让机器人摔倒

ZMP,Zero Moment Point,零力矩点。这个概念最早用在双足机器人上,后来四足机器人也借鉴了。说白了,就是看机器人脚底的压力中心,是不是落在支撑多边形内。

我习惯把ZMP理解成「机器人的重心投影」。如果ZMP在脚掌范围内,机器人就稳;如果跑出去了,那就等着摔吧。

ZMP的计算公式:

ZMP_x = (∑ m_i (z_i + g) x_i - ∑ m_i x_i'' z_i) / ∑ m_i (z_i + g)
ZMP_y = (∑ m_i (z_i + g) y_i - ∑ m_i y_i'' z_i) / ∑ m_i (z_i + g)

看着复杂,其实核心就两点:

  • 位置项:各连杆的质量乘以位置
  • 加速度项:各连杆的惯性力产生的力矩

在四足机器人中,ZMP主要用于静态步态准静态步态。比如爬行步态,三条腿着地,ZMP必须落在三角形内。我见过一个团队,ZMP算错了符号,结果机器人每次抬腿都往反方向倒,哈哈。

避坑指南: 我曾经在ZMP计算中忽略了腿部质量,结果仿真里稳如泰山,实际机器人一跑就倒。记住,腿部质量占比很大,不能忽略!

4.3 轨迹规划:让腿画个漂亮的弧线

轨迹规划,说白了就是决定腿在空中的运动路径。常见的轨迹有:

  • 矩形轨迹:抬腿-前伸-落地-后蹬,简单粗暴
  • 椭圆轨迹:平滑过渡,适合高速奔跑
  • 贝塞尔曲线:灵活可控,适合复杂地形

我个人习惯用五次多项式来规划摆动腿轨迹。为什么?因为可以同时约束位置、速度和加速度,保证起落点平滑。

// 摆动腿轨迹规划(五次多项式)
double trajectory(double t, double t0, double tf, 
                  double p0, double pf, 
                  double v0, double vf, 
                  double a0, double af) {
    double T = tf - t0;
    double tau = (t - t0) / T;
    
    // 计算系数
    double a0_val = p0;
    double a1 = v0 * T;
    double a2 = a0 * T * T / 2.0;
    // ... 省略中间系数计算
    
    return a0_val + a1*tau + a2*tau*tau + a3*tau*tau*tau 
           + a4*tau*tau*tau*tau + a5*tau*tau*tau*tau*tau;
}

这里有个关键点:抬腿高度。抬太高浪费能量,抬太低容易绊倒。我一般设成机身离地高度的30%-40%。比如机身高度30cm,抬腿高度就设10-12cm。

4.4 摆动腿控制:落地那一下最讲究

摆动腿控制,核心就两个阶段:

  1. 摆动相(Swing Phase):腿在空中,按轨迹运动
  2. 支撑相(Stance Phase):腿着地,支撑身体

摆动相的控制,我习惯用位置控制+前馈补偿。位置控制保证轨迹跟踪精度,前馈补偿克服重力影响。

支撑相的控制,则用阻抗控制。为什么?因为地面是硬的,如果位置控制太死,冲击力会很大。阻抗控制让腿有「弹性」,落地更柔和。

关键参数:
  • 摆动相:位置增益 Kp=500-1000 N/m,阻尼 Kd=50-100 N·s/m
  • 支撑相:刚度 K=1000-3000 N/m,阻尼 D=100-300 N·s/m

我记得有一次,机器人走路总是一瘸一拐。查了半天,发现是摆动腿的轨迹起始点没对齐。支撑相结束时,腿的位置和速度要作为摆动相的初始条件。这个衔接没做好,步态就会「断档」。

4.5 四种方法的协同工作

实际工程中,这四种方法不是孤立的。我画了一张图,展示它们的关系:

传统步态控制方法协同框架 CPG控制 生成节律信号 ZMP稳定性判据 评估稳定性 轨迹规划 生成运动路径 摆动腿控制 执行运动指令 相位信息 轨迹参数 稳定性约束 参考轨迹 CPG提供节律 → ZMP评估稳定性 → 轨迹规划生成路径 → 摆动腿控制执行

你看,CPG生成节律信号,告诉机器人「什么时候抬腿」。ZMP实时评估稳定性,如果发现要倒了,就调整步态参数。轨迹规划根据ZMP的反馈,生成平滑的摆动腿路径。最后,摆动腿控制负责执行,把理论轨迹变成实际的关节运动。

这套流程,我在多个项目中验证过。虽然现在强化学习很强大,但传统方法在可解释性稳定性上依然有优势。尤其是工业场景,客户要的是「为什么这样走」,而不是「神经网络黑盒」。

我的建议: 如果你是初学者,先把这四种方法吃透。CPG让你理解步态的本质,ZMP让你学会稳定性分析,轨迹规划锻炼你的数学功底,摆动腿控制考验你的工程能力。这些基础打牢了,再学强化学习会事半功倍。

好了,这一章的内容就到这里。传统方法虽然「老」,但经典永不过时。下次遇到步态控制问题,不妨先想想:CPG的相位调好了吗?ZMP在支撑多边形内吗?轨迹平滑吗?落地冲击大吗?把这四个问题解决了,你的机器人至少能稳稳地走起来。


专注资料整理