自动驾驶控制:入门篇

车辆模型

用运动学自行车模型理解车辆状态如何变化。

这篇文章讲什么

前两篇已经讲了:

  • 控制系统整体在干什么
  • 控制器需要参考轨迹和车辆状态

这一篇讲第三个核心概念:

车辆模型

简单说,车辆模型回答的问题是:

如果我给车一个加速度和转向角,车下一步会怎么动?

控制器输出的是:

加速度 a
转向角 δ

车辆模型描述的是这些控制量会让车辆状态怎么变化。

也就是:

当前车辆状态 + 控制量 → 下一时刻车辆状态

为什么控制需要车辆模型

控制不是只看当前位置,然后随便给一个方向盘角度。

控制器需要知道:

  • 车现在在哪里
  • 车现在朝哪
  • 车现在速度是多少
  • 给一个转向角之后,车大概会往哪走

车辆模型就是用来描述这些运动关系的。

比如:

速度越大,同样时间内走得越远
航向角不同,车辆前进方向不同
转向角越大,车辆转弯越明显

所以模型不是一个额外装饰,它是控制系统里很重要的一部分。

但入门阶段不用一上来追求复杂模型。

我们先用一个足够简单、足够好理解的模型,把系统跑起来。

模型和真实车辆的关系

模型不是完整复制真实车辆。

真实车辆很复杂,会受到很多因素影响:

  • 轮胎侧偏
  • 车辆质量
  • 悬架
  • 路面附着
  • 空气阻力
  • 执行器延迟

如果一开始就全部考虑,入门会非常痛苦。

所以工程里通常会根据目标选择模型复杂度。

如果只是低速轨迹跟踪、入门仿真、算法理解,简单模型就够。

如果要高速控制、极限工况、精确预测,就需要更复杂的动力学模型。

可以先记住一句话:

模型不是越复杂越好,而是要和任务匹配。

最简单的运动学自行车模型

入门阶段最常用的是运动学自行车模型。

它把一辆四轮车简化成一辆“自行车”:

  • 前轮代表两个前轮
  • 后轮代表两个后轮
  • 车辆沿车身方向前进
  • 转向角决定车辆怎么转弯

这样做的好处是:

  • 好理解
  • 公式简单
  • 适合低速场景
  • 很适合讲 Pure Pursuit、Stanley、LQR、MPC 的入门版本

可以先看成这样:

车辆当前位置:(x, y)
车辆航向角:ψ
车辆速度:v
车辆轴距:L
前轮转角:δ

模型输入和输出

车辆模型的输入通常包括两类。

第一类是当前车辆状态:

状态量 含义
x 当前横向坐标
y 当前纵向坐标
ψ 当前航向角
v 当前速度

第二类是控制器输出的控制量:

控制量 含义
a 加速度
δ 转向角

模型的输出是下一时刻车辆状态:

x_next
y_next
ψ_next
v_next

也就是:

车辆模型(当前状态, 控制量) → 下一时刻状态

最小模型公式

先看最核心的几个公式。

车辆在很短的时间 Δt 内,位置可以近似这样更新:

$$ x_{k+1} = x_k + v_k \cos(\psi_k) \Delta t $$

$$ y_{k+1} = y_k + v_k \sin(\psi_k) \Delta t $$

速度可以这样更新:

$$ v_{k+1} = v_k + a_k \Delta t $$

航向角可以这样更新:

$$ \psi_{k+1} = \psi_k + \frac{v_k}{L}\tan(\delta_k)\Delta t $$

这里不用急着推导,只需要理解每一项的意思。

符号 含义
x, y 车辆位置
ψ 车辆航向角
v 车辆速度
a 加速度
δ 转向角
L 车辆轴距
Δt 控制周期

这些公式其实就在说:

  • 车会沿当前车头方向往前走
  • 速度越大,走得越远
  • 加速度会改变速度
  • 转向角会改变车头方向

模型复杂度怎么选

不同模型适合不同场景。

模型 特点 适合场景
质点模型 只关心位置和速度 最简单的路径理解
运动学自行车模型 考虑航向角和转向角 低速轨迹跟踪、入门控制
动力学自行车模型 考虑轮胎力和侧偏 高速、稳定性分析
复杂整车模型 更接近真实车辆 高精度仿真、车辆动力学研究

这个系列的目标是搭一个最小可实现系统。

所以先选:

运动学自行车模型

它足够简单,也足够连接后面的控制器。

模型和控制器是什么关系

可以这样理解:

模型:车会怎么动
控制器:为了跟上轨迹,应该怎么控制

控制器要输出加速度和转向角。

车辆模型告诉我们,这两个量会怎样影响车辆位置、速度和航向角。

比如:

  • 纵向 P 控制器输出 a
  • Pure Pursuit 输出 δ
  • 车辆模型根据 aδ 更新车辆状态

放在一起就是:

参考轨迹 + 当前状态
控制器计算 a, δ
车辆模型更新 x, y, ψ, v
得到下一时刻车辆状态

最小伪代码

车辆模型可以先理解成一个状态更新函数:

def update_vehicle(state, control, dt):
    x = state.x
    y = state.y
    yaw = state.yaw
    v = state.v

    a = control.a
    delta = control.delta

    x_next = x + v * cos(yaw) * dt
    y_next = y + v * sin(yaw) * dt
    yaw_next = yaw + v / L * tan(delta) * dt
    v_next = v + a * dt

    return x_next, y_next, yaw_next, v_next

真实系统或仿真平台里,车辆运动会由底层车辆模型或执行器完成。

在这个入门系列里,车辆模型主要用来帮助我们理解状态如何变化。

后面更复杂的控制器,才会更强地依赖模型本身。

小结

这一篇只需要记住三句话:

车辆模型描述车辆怎么动。

控制器计算车辆应该怎么控制。

入门阶段先用运动学自行车模型,就足够搭建最小轨迹跟踪系统。