3、车辆运动学模型:自行车模型、阿克曼转向几何、差速驱动模型、运动学模型的离散化方法
各位同学,今天我们来啃一块硬骨头——车辆运动学模型。说实话,这玩意儿是路径跟踪的基石。你想想看,连车怎么动都搞不清楚,还谈什么控制?
我在做第一个AGV项目时,就吃过这个亏。当时直接上了PID,结果车在弯道里像个醉汉。后来才明白,运动学模型没选对,控制器再牛也白搭。
好,我们直接进入正题。
3.1 自行车模型(Bicycle Model)
自行车模型,说白了就是把四轮车简化成两轮车。为什么这么干?因为四轮车的转向关系太复杂了,你想想看,四个轮子各有各的转角,算起来头大。
我个人习惯,在低速场景下(比如AGV、扫地机器人),直接用自行车模型就够了。它的核心假设是:
- 车辆左右对称,合并为前后两个轮
- 忽略侧偏角,认为车轮速度方向与轮子朝向一致
- 车辆只在二维平面运动(x, y, θ)
状态量就三个:位置(x, y)和航向角θ。控制量是两个:前轮转角δ和速度v。
数学表达式长这样:
x_dot = v * cos(θ)
y_dot = v * sin(θ)
θ_dot = v * tan(δ) / L
其中L是轴距。嗯,这里要注意,tan(δ)在δ接近90度时会爆炸,所以实际项目中我会限制最大转角,一般不超过40度。
关键点:自行车模型只适用于低速(通常< 5 m/s)。高速时轮胎侧偏不可忽略,得用动力学模型。
3.2 阿克曼转向几何
阿克曼转向,这是真车用的转向方式。你想想看,四轮车转弯时,内外侧轮的转弯半径不一样。如果让它们转同样的角度,轮胎就会打滑、磨损。
阿克曼几何的核心思想:让所有车轮的转向中心交于一点。这样每个轮子都绕着同一个圆心转,纯滚动无滑动。
公式如下:
δ_inner = arctan(L / (R - W/2))
δ_outer = arctan(L / (R + W/2))
其中W是轮距,R是转弯半径。
我在项目中遇到过一个问题:有些廉价底盘根本不支持阿克曼转向,内外轮转角一样。这时候如果你用自行车模型去算,误差会很大。我的建议是——实测标定,把实际转角映射到等效自行车模型上。
实战技巧:阿克曼转向的车辆,可以用自行车模型近似,但要把等效轴距L_eq调大一点。我一般调大5%-10%,效果不错。
3.3 差速驱动模型
差速驱动,常见于两轮平衡车、履带车、麦克纳姆轮小车。它没有转向轮,靠左右轮的速度差来实现转向。
状态量同样是(x, y, θ),但控制量变成了左轮速度v_L和右轮速度v_R。
运动学方程:
v = (v_R + v_L) / 2
ω = (v_R - v_L) / W
x_dot = v * cos(θ)
y_dot = v * sin(θ)
θ_dot = ω
这里W是轮距。你会发现,当v_R = v_L时,ω=0,直线行驶。当v_R = -v_L时,原地旋转。
注意:差速模型有个坑——当v_R和v_L符号相反时,车辆绕中心旋转,但实际轨迹是个圆弧。我曾经在标定时忽略了这一点,导致路径跟踪在起点附近疯狂震荡。后来加了死区处理才解决。
差速模型的好处是机动性极强,可以原地掉头。坏处是直线行驶稳定性差,稍微有点速度差就跑偏。我建议在控制中加入积分项来补偿。
3.4 运动学模型的离散化方法
好了,模型有了,但计算机是离散的,得把连续方程变成离散形式。常用的方法有三种:
| 方法 | 精度 | 计算量 | 适用场景 |
|---|---|---|---|
| 欧拉法 | O(Δt) | 低 | 低速、小步长 |
| 龙格-库塔法(RK4) | O(Δt⁴) | 中 | 中高速、精度要求高 |
| 解析法 | 精确 | 高 | 特定模型(如匀速圆周) |
我个人习惯,在嵌入式平台上用欧拉法就够了。为什么?因为控制周期短(10-50ms),Δt小,欧拉法的误差可以接受。而且计算量小,不占CPU。
欧拉法离散自行车模型:
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
θ(k+1) = θ(k) + v * tan(δ(k)) / L * Δt
就这么简单。但要注意,如果Δt太大(比如超过100ms),欧拉法会发散。我建议用RK4做一次验证,看看误差是否在容忍范围内。
我的经验:在STM32F4上,控制周期20ms,欧拉法完全够用。如果换成树莓派,我会用RK4,反正算力富余。
差速模型的离散化类似:
v = (v_R + v_L) / 2
ω = (v_R - v_L) / W
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
θ(k+1) = θ(k) + ω * Δt
这里有个细节:如果ω接近0,直接用欧拉法没问题。但如果ω很大(比如原地旋转),建议用解析法——因为此时车辆轨迹是圆弧,欧拉法会累积角度误差。
解析法公式(匀速圆周运动):
if |ω| < ε:
x(k+1) = x(k) + v * cos(θ(k)) * Δt
y(k+1) = y(k) + v * sin(θ(k)) * Δt
else:
R = v / ω
x(k+1) = x(k) - R * sin(θ(k)) + R * sin(θ(k) + ω * Δt)
y(k+1) = y(k) + R * cos(θ(k)) - R * cos(θ(k) + ω * Δt)
θ(k+1) = θ(k) + ω * Δt
这段代码我用了好几年,从来没出过问题。你想想看,当ω=0时,解析法退化成欧拉法,无缝切换。
避坑指南:我曾经在差速模型里直接用欧拉法,结果原地旋转时角度误差越来越大,最后路径跟踪直接崩了。换成解析法后,问题解决。所以,如果你的车经常原地旋转或急转弯,务必用解析法。
好了,这一章的内容就到这里。运动学模型是路径跟踪的根基,选对了模型,后面的控制器设计就事半功倍。下一章我们会讲动力学模型,那又是另一番天地了。
公众号:蓝海资料掘金营,微信deep3321