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
这个约束方程有什么用?两个场景:
- 轨迹规划:规划出的路径必须满足这个约束,否则车辆无法执行
- 状态估计:可以用约束方程来修正传感器噪声,比如卡尔曼滤波里加约束
总结一下自行车模型的三个关键点:
- 状态量:(x, y, θ),控制量:(v, δ)
- 运动学方程:ẋ=v·cos(θ), ẏ=v·sin(θ), θ̇=v·tan(δ)/L
- 约束条件:ẋ·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,输出车辆轨迹。试试看能不能画出圆形轨迹和直线轨迹。