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时,解析法退化成欧拉法,无缝切换。

避坑指南:我曾经在差速模型里直接用欧拉法,结果原地旋转时角度误差越来越大,最后路径跟踪直接崩了。换成解析法后,问题解决。所以,如果你的车经常原地旋转或急转弯,务必用解析法。

好了,这一章的内容就到这里。运动学模型是路径跟踪的根基,选对了模型,后面的控制器设计就事半功倍。下一章我们会讲动力学模型,那又是另一番天地了。

车辆运动学模型知识体系 车辆运动学模型 自行车模型 阿克曼转向几何 差速驱动模型 状态: (x, y, θ) | 控制: (v, δ) 低速场景适用 (v < 5 m/s) 内外轮转角不同 可近似为自行车模型 控制: (v_L, v_R) | 可原地旋转 直线稳定性差 离散化方法 欧拉法 (O(Δt)) RK4 (O(Δt⁴)) 解析法 (精确)

公众号:蓝海资料掘金营,微信deep3321