2、车辆运动学模型:自行车模型推导、阿克曼转向几何、运动学约束方程

各位同学,咱们今天聊聊车辆运动学模型。说实话,这是整个车辆动力学里最基础、也最实用的部分。我当年刚入行时,第一个项目就是做泊车辅助系统,那时候天天跟自行车模型打交道。你想想看,一辆车那么复杂,四个轮子、悬架、转向系统,怎么简化成能用的数学模型?这就是我们今天要解决的问题。

2.1 自行车模型——把四轮车变成两轮车

为什么要叫自行车模型?说白了,就是把四轮车辆简化成一辆自行车。怎么简化?把左右两个前轮合并成一个虚拟前轮,左右两个后轮合并成一个虚拟后轮。这样一来,四轮车就变成了两轮车。

我习惯这么理解:自行车模型假设车辆是刚性的,且只有前后两个轮子。前轮负责转向,后轮负责驱动(或者从动)。这个模型虽然简单,但在很多场景下够用了。

核心假设:

  • 车辆在平坦路面上行驶(忽略垂向运动)
  • 轮胎无侧滑(纯滚动条件)
  • 前后轮分别合并为一个虚拟轮
  • 车辆为刚体,不考虑悬架变形

嗯,这里要注意:自行车模型只适用于低速场景。为什么?因为高速时轮胎侧偏不可忽略,那就得用动力学模型了。我在做自动泊车项目时,车速不超过10km/h,用自行车模型完全够用。但如果你要做高速变道辅助,那就得换模型了。

2.2 运动学方程推导

好,咱们来推导一下。先定义几个变量:

符号含义单位
(x, y)后轴中心坐标m
θ车辆航向角(与x轴夹角)rad
δ前轮转向角rad
v后轴中心速度m/s
L轴距m

我个人习惯从后轴中心出发来建模。为什么选后轴?因为后轴中心在低速时基本没有侧向速度,数学上更干净。

先看后轴中心的速度分解:

ẋ = v · cos(θ)
ẏ = v · sin(θ)

再看航向角的变化率。前轮转向角δ决定了车辆的转弯半径R。根据几何关系:

R = L / tan(δ)

角速度ω = v / R,所以:

θ̇ = v · tan(δ) / L

把这三个方程写在一起,就是完整的自行车运动学模型:

ẋ = v · cos(θ)
ẏ = v · sin(θ)
θ̇ = v · tan(δ) / L

小技巧:实际编程时,我习惯把控制量设为(v, δ)而不是(v, θ̇)。因为δ是方向盘转角,更直观。但要注意δ有物理限制,一般乘用车最大转向角在30°~40°之间。

2.3 阿克曼转向几何——让四个轮子各司其职

你可能会问:自行车模型只有一个前轮转向角,但真实车辆有左右两个前轮,它们转的角度一样吗?

答案是否定的。这就是阿克曼转向几何要解决的问题。

我当年第一次调实车时,发现按照自行车模型算出来的轨迹跟实际走的不一样。后来才意识到,左右前轮的转向角是不同的。内轮转得更多,外轮转得更少,这样才能保证所有轮子都绕着同一个圆心转动。

阿克曼转向几何的核心公式:

cot(δ_out) - cot(δ_in) = B / L

其中:

  • δ_out:外侧前轮转向角
  • δ_in:内侧前轮转向角
  • B:轮距(左右轮之间的距离)
  • L:轴距

自行车模型里用的δ,其实是左右前轮转向角的平均值:

δ ≈ (δ_in + δ_out) / 2

避坑指南:我曾经在项目中直接用自行车模型的δ去控制左右轮,结果轮胎磨损严重。后来加了阿克曼修正,问题才解决。记住:自行车模型是控制模型,阿克曼几何是执行模型,两者要配合使用。

2.4 运动学约束方程——车辆不是想怎么走就怎么走

车辆运动学约束,说白了就是「车辆不能侧着走」。你想想看,正常行驶的车,轮胎只能沿着滚动方向运动,不能横向滑动。这就是非完整约束。

数学上表达为:

ẋ · sin(θ) - ẏ · cos(θ) = 0

这个方程的意思是:后轴中心的速度方向必须与车辆纵轴方向一致。如果违反了这个约束,就说明车辆在侧滑。

我习惯把约束方程写成矩阵形式:

[sin(θ), -cos(θ), 0] · [ẋ, ẏ, θ̇]ᵀ = 0

这个约束方程有什么用?两个场景:

  • 轨迹规划:规划出的路径必须满足这个约束,否则车辆无法执行
  • 状态估计:可以用约束方程来修正传感器噪声,比如卡尔曼滤波里加约束

总结一下自行车模型的三个关键点:

  1. 状态量:(x, y, θ),控制量:(v, δ)
  2. 运动学方程:ẋ=v·cos(θ), ẏ=v·sin(θ), θ̇=v·tan(δ)/L
  3. 约束条件:ẋ·sin(θ) - ẏ·cos(θ) = 0

2.5 实际应用中的注意事项

最后聊几点实际经验:

第一,离散化问题。实际代码里要用离散时间模型。我习惯用欧拉法:

x(k+1) = x(k) + v·cos(θ)·dt
y(k+1) = y(k) + v·sin(θ)·dt
θ(k+1) = θ(k) + v·tan(δ)·dt / L

dt一般取10ms~50ms,太大误差会累积。

第二,奇点问题。当δ接近±90°时,tan(δ)会爆炸。实际中δ不会那么大,但代码里还是要加保护。

第三,坐标系选择。我建议用全局坐标系,方便做路径规划。如果你做的是局部控制,也可以用车身坐标系。

好了,自行车模型就讲到这里。下一节我们会在这个基础上加入轮胎动力学,变成更完整的车辆模型。记住:模型是工具,不是真理。选什么模型,取决于你要解决什么问题。

课后练习:写一个Python函数,输入初始状态(x0,y0,θ0)、控制序列(v,δ)和时间步长dt,输出车辆轨迹。试试看能不能画出圆形轨迹和直线轨迹。