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公斤的机器人像兔子一样跳,那画面太美不敢看。
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算错了符号,结果机器人每次抬腿都往反方向倒,哈哈。
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 摆动腿控制:落地那一下最讲究
摆动腿控制,核心就两个阶段:
- 摆动相(Swing Phase):腿在空中,按轨迹运动
- 支撑相(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实时评估稳定性,如果发现要倒了,就调整步态参数。轨迹规划根据ZMP的反馈,生成平滑的摆动腿路径。最后,摆动腿控制负责执行,把理论轨迹变成实际的关节运动。
这套流程,我在多个项目中验证过。虽然现在强化学习很强大,但传统方法在可解释性和稳定性上依然有优势。尤其是工业场景,客户要的是「为什么这样走」,而不是「神经网络黑盒」。
好了,这一章的内容就到这里。传统方法虽然「老」,但经典永不过时。下次遇到步态控制问题,不妨先想想:CPG的相位调好了吗?ZMP在支撑多边形内吗?轨迹平滑吗?落地冲击大吗?把这四个问题解决了,你的机器人至少能稳稳地走起来。