自动驾驶控制:入门篇

自动驾驶控制系统入门

理解自动驾驶控制系统的输入、输出和闭环结构。

这篇文章讲什么

自动驾驶里的“控制”到底在干什么?

简单说,控制系统要做的事情就是:

给它一条参考轨迹,再给它当前车辆状态,它算出车下一步该怎么开。

在最常见的车辆控制里,输出通常就是两个量:

  • 加速度
  • 转向角

也就是:

参考轨迹 + 车辆状态
控制系统
加速度 + 转向角

如果放到车上理解,加速度决定车快一点还是慢一点,转向角决定车往左打还是往右打。

自动驾驶控制解决什么问题

自动驾驶系统一般可以粗略分成几个部分:

感知 → 定位 → 规划 → 控制 → 车辆执行

控制在最后一段。

规划模块告诉车辆:

“你应该沿着这条轨迹走。”

控制模块负责回答:

“那我现在方向盘该打多少?油门或刹车该给多少?”

所以控制不是重新规划路线,也不是识别红绿灯。控制只关心一件事:

让车辆尽可能稳定、平滑、准确地跟上给定轨迹。

输入是什么

控制系统通常需要两个输入。

第一个是参考轨迹。

参考轨迹可以理解成规划模块给出的一串目标点,每个点可能包含:

  • 位置 x
  • 位置 y
  • 航向角 yaw
  • 期望速度 v
  • 曲率 kappa

第二个是车辆当前状态。

车辆状态来自定位、传感器或仿真器,一般包含:

  • 当前 x
  • 当前 y
  • 当前 yaw
  • 当前速度 v
  • 当前加速度
  • 当前转向角

控制器要做的事情,就是比较“我现在在哪”和“我应该去哪”,然后算出控制量。

车辆模型是什么

车辆模型描述的是:

如果我给车辆一个加速度和转向角,车辆接下来会怎么运动。

入门阶段可以先把车辆理解成一个会往前走、会转弯的点:

  • 速度决定它往前走多快
  • 航向角决定它朝哪个方向走
  • 转向角决定它接下来怎么转

车辆模型不是控制器本身,它描述的是车辆“会怎么动”。

控制器要根据这个运动规律,去计算合适的加速度和转向角。

控制器是什么

控制器就是控制系统里的“大脑”。

它接收:

  • 参考轨迹
  • 当前车辆状态

然后输出:

  • 加速度
  • 转向角

可以把控制器理解成一个函数:

控制器(参考轨迹, 当前车辆状态) → 加速度, 转向角

我们可以把控制器拆成两部分:

  • 纵向控制:控制速度,输出加速度
  • 横向控制:控制方向,输出转向角

也就是:

目标速度 - 当前速度 → 纵向控制器 → 加速度
参考轨迹 - 当前姿态 → 横向控制器 → 转向角

输出是什么

控制器最终输出的是车辆执行器能理解的控制指令。

在自动驾驶控制里,最核心的两个输出是:

a:加速度
δ:转向角

加速度 a 负责纵向运动:

  • a > 0:加速
  • a < 0:减速
  • a = 0:保持当前速度附近

转向角 δ 负责横向运动:

  • δ > 0:向左或向右转,取决于坐标系约定
  • δ < 0:向另一侧转
  • δ = 0:尽量直行

在不同平台里,控制量通常还要转换成执行器能接收的格式。

比如油门、刹车、方向盘角度,或者某个仿真平台自己的控制接口。

但从控制算法角度看,先抓住这两个量就够了:

纵向:加速度
横向:转向角

控制闭环是什么

控制系统不是只算一次。

它是一个不断循环的过程:

读取车辆状态
读取参考轨迹
计算控制量
车辆执行
车辆状态变化
继续下一轮

这就叫闭环控制。

“闭环”的关键是:车辆执行之后,系统还会继续观察车辆的新状态,然后再次修正。

比如车辆偏离轨迹了,下一轮控制器就会看到偏差,然后让车辆往轨迹方向修回来。

为什么先用 P 控制器 + Pure Pursuit

入门阶段最重要的不是一上来学最复杂的控制器,而是先跑通整个链路。

所以这个系列先用一个很简单的组合:

  • 纵向:P 控制器
  • 横向:Pure Pursuit

P 控制器负责速度。

它的直觉很简单:

速度慢了,就加速多一点
速度快了,就加速少一点或者减速

Pure Pursuit 负责方向。

它的直觉也很简单:

在前方轨迹上找一个目标点
让车朝这个目标点开过去

这两个控制器不一定最强,但非常适合入门。

因为它们能让我们先看懂完整控制系统:

参考轨迹
车辆状态
车辆模型
纵向控制器
横向控制器
控制输出
闭环执行

最小伪代码

整个控制系统可以先理解成下面这段伪代码:

while running:
    state = get_vehicle_state()
    target = find_target_point(reference_path, state)

    a = p_controller(target.speed, state.speed)
    delta = pure_pursuit_controller(target, state)

    apply_control(a, delta)

这就是自动驾驶控制入门阶段最核心的东西。

后面的几篇文章,其实就是把这里面的每一步拆开讲清楚:

  • 参考轨迹和车辆状态是什么
  • 车辆模型怎么理解
  • P 控制器怎么控制速度
  • Pure Pursuit 怎么控制方向
  • 最后怎么把它们拼成一个能跑的最小系统