4. 步态规划

步态规划,说白了就是决定四条腿什么时候抬、什么时候落。很多新手一上来就调 PID,结果狗子站都站不稳——其实问题往往出在步态上。我个人习惯先把步态逻辑理清楚,再去碰底层控制。

四足机器人的步态,核心就三个参数:占空比(一条腿支撑相占整个周期的比例)、相位差(腿与腿之间的时间偏移)、步频(每秒走几步)。不同的组合,就产生了不同的步态。

核心观点: 步态规划的本质,是给四条腿分配“支撑”和“摆动”的时间窗口。支撑相负责承重,摆动相负责迈腿。两者不能重叠,否则会打架。

4.1 Trot 步态——最常用的“对角线小跑”

Trot 步态,就是对角线腿成对运动。左前+右后为一组,右前+左后为另一组。两组交替支撑和摆动。这是四足机器人最经典、最稳定的动态步态。

关键参数:

  • 占空比:0.5(每条腿一半时间支撑,一半时间摆动)
  • 相位差:0.5(两组之间错开半个周期)
  • 步频:2~4 Hz(视机器人尺寸而定)

我在项目中遇到过一个问题:Trot 步态跑起来之后,机身会左右摇晃。后来发现是支撑相切换时,重心转移不够平滑。解决办法是在支撑相末尾加一段“双支撑”过渡,让重心先移到新支撑腿上,再抬另一条。

我的经验: Trot 步态的足端轨迹,建议用贝塞尔曲线或摆线。摆线的好处是触地速度为零,冲击小。我一般用五阶多项式插值,算起来不复杂,效果也够用。

4.2 Walk 步态——低速下的“静稳定”选择

Walk 步态,就是四条腿依次抬起、落下,任何时候至少有三条腿在地上。这种步态是静稳定的——即使突然断电,机器人也不会倒。

关键参数:

  • 占空比:0.75(每条腿 75% 时间支撑,25% 时间摆动)
  • 相位差:0.25(四条腿依次错开 1/4 周期)
  • 抬腿顺序:左后→左前→右后→右前(常见的一种)

Walk 步态适合在崎岖地面、狭窄空间或者需要精确定位的场景。缺点就是慢。你想想看,如果让狗子用 Walk 步态跑起来,那画面会非常滑稽——四条腿倒腾得飞快,但速度就是上不去。

注意: Walk 步态的支撑多边形计算很关键。重心必须始终落在三条支撑腿构成的三角形内。如果重心跑出去了,机器人就会侧翻。我建议在仿真里先画出来这个三角形,肉眼确认一下。

4.3 Bound 步态——高速下的“跳跃式”奔跑

Bound 步态,就是前腿一组、后腿一组,两组交替触地。这其实是四足动物在高速奔跑时的常用步态,比如兔子、猎豹。

关键参数:

  • 占空比:0.3~0.4(支撑相很短,摆动相很长)
  • 相位差:0.5(前后两组错开半个周期)
  • 特点:存在“腾空期”——四条腿同时离地

Bound 步态对动力学要求很高。因为存在腾空期,落地时的冲击力会很大。我曾经在仿真里跑 Bound,结果落地瞬间关节力矩直接爆表,电机冒烟(仿真里冒烟,哈哈)。后来加了落地缓冲控制,才稳住。

对比总结:
步态速度稳定性占空比适用场景
Trot中速动态稳定0.5平坦地面、常规行走
Walk低速静稳定0.75崎岖地面、精确定位
Bound高速动态稳定(有腾空)0.3~0.4平坦地面、高速奔跑

4.4 步态切换逻辑——从走到跑,平滑过渡

步态切换,是实际部署中最容易出问题的地方。直接从一个步态跳到另一个,机器人会像触电一样抽搐。原因很简单:切换瞬间,腿的位置、速度、加速度都不连续。

我常用的切换策略是相位插值法。具体来说:

  1. 检测到切换指令后,记录当前步态的相位和足端位置。
  2. 在下一个周期内,逐步将相位偏移和占空比过渡到目标步态。
  3. 过渡时间一般设 0.5~1 个步态周期。

举个例子,从 Trot 切换到 Bound:

  • Trot 的占空比是 0.5,Bound 是 0.3。不能直接跳,要每步减少 0.05,花 4 步完成。
  • 相位差也要同步调整。Trot 是对角线成对,Bound 是前后成对。这个变化要平滑。
  • 足端轨迹的抬腿高度也要渐变。Trot 抬得低,Bound 抬得高。
避坑指南: 我曾经在切换时只做了位置插值,没做速度插值。结果切换完成瞬间,足端速度突变,机身剧烈晃动。后来我改成对足端位置、速度、加速度都做三次样条插值,才彻底解决。

下面这张图是我自己画的步态切换状态机,你可以参考一下:

步态切换状态机 Trot 步态 Walk 步态 Bound 步态 Trot ↔ Walk 过渡 Trot ↔ Bound 过渡 Walk ↔ Bound 过渡 说明: 实线箭头表示切换方向,虚线箭头表示过渡完成后回到原步态或目标步态。每个过渡节点内部执行 0.5~1 个周期的相位插值。

4.5 步态参数在线调整

实际部署时,步态参数不能写死。我一般会在上位机里开一个参数接口,允许运行时调整:

  • 步频: 根据遥控器油门值线性映射
  • 抬腿高度: 根据地面的崎岖程度自动调整(用 IMU 和足端力传感器判断)
  • 占空比: 根据速度指令自动切换(低速用高占空比,高速用低占空比)
重要提醒: 在线调整参数时,一定要做限幅和速率限制。我曾经在调试时手滑把步频从 2 Hz 直接拉到 10 Hz,结果电机响应不过来,腿直接甩飞了。嗯,从那以后我所有的参数接口都加了软限位。

最后说一句,步态规划没有银弹。Trot、Walk、Bound 各有各的脾气。我的建议是:先在仿真里把三种步态都跑通,然后重点调好 Trot 到 Bound 的切换——这是实际部署中最常用的场景。等你把切换逻辑调顺了,剩下的就是细节打磨了。