🧠 第十章 交通与智驾:构建安全高效出行解决方案
📄 一句话概括

前车第 45 秒急刹。 定速巡航到第 51 秒就撞上了——全程没踩过刹车。自适应跟车在时距 1.8 到 0.9 秒之间: 最小车距从 18.9 掉到 9.9 米,位移只多 0.9%,最大减速从 −3.75 狠到 −4.03 米/秒²。 jerk 峰值从 37.5 掉到 2.8(单位米/秒³)。

📝 本节和前面几节的关系

上一节说清了「周围有什么」。这一节说「该怎么办」:决策规划里最基本的一个动作——跟车。 它看起来只是一个「保持距离」,实际上是一整套取舍。

一、跟车模型要回答的三个问题

① 想跟多远? 这就是「期望车距」,通常写成人跟车速成正比: 车距 = 最小车距 + 时距 × 车速。时距 1.5 秒的意思是「按当前速度,1.5 秒后到前车现在的位置」。 ② 差距大了怎么办? 差得越多,加速度越大——但要有上限,否则会一脚油门一脚刹车。 ③ 前车突然刹车怎么办? 这一条最难,因为它要求模型在「稳态」之外还能处理「突变」。 Demo 用的是经典的 IDM(智能驾驶员模型)的简化版,三项:期望速度项、车距项、阻尼项。 没有一个神经网络,全是公式。 为什么还用这种「老公式」?因为可解释、可标定、行为可预测。 出事故要能解释「为什么当时是那个加速度」,一个黑盒模型答不了。

二、定速巡航在急刹前不减速

Demo 让前车以 25 米/秒巡航、加正弦波动,第 45 秒急刹 12 米/秒²,自车初速相同、 初始车距 30 米。三种策略的结果:

策略 最小车距 最大减速 位移
定速巡航 撞上(第 51 秒) 0.00 2250.0 米
自适应 T=1.8 秒 18.9 米 −3.75 1753.1 米
自适应 T=1.2 秒 12.8 米 −3.45 1763.3 米
自适应 T=0.9 秒 9.9 米 −4.03 1768.4 米
定速巡航那一行最关键:最大减速 0.00,也就是说全程没踩过刹车。
它只盯着自己的目标速度,前车急刹它不减速——直到撞上。
这就是为什么定速巡航不能单独用在城市道路:它把安全完全交给驾驶员。
而自适应巡航(ACC)之所以是「辅助」不是「自动」,
也是这个原因——它只处理「前车」这一类风险,不处理横穿、鬼探头、加塞。
注意定速巡航那 2250 米不是「效率高」——它是按 25 米/秒硬跑 90 秒算出来的。
撞上之后这个数就没有意义了,这里保留只是为了对比。

三、时距的取舍:一半车距换一个点

三行自适应放在一起看:时距从 1.8 收到 0.9,最小车距从 18.9 掉到 9.9 米。 车距砍掉将近一半。 换来什么?位移从 1753.1 米到 1768.4 米,只多 15.3 米, 相对前车的比例从 99.9% 到 100.8%——只涨了 0.9 个点。 代价是最大减速从 −3.75 狠到 −4.03 米/秒²。 用一半的车距和更狠的刹车,换来一个点的通行量——这笔账很不划算。 所以量产车的 ACC 默认时距普遍偏保守(1.5~2.0 秒),不是因为技术做不到更紧, 是因为算过这笔账。 跟得紧的收益是「理论通行量」,代价是「每一次急刹的体感」。 顺带一个反直觉的点:时距小不一定更危险。在 Demo 里 T=0.9 的最大减速反而更狠(−4.03), 因为它离前车更近,发现要减速时已经没有余量了。 安全和舒适在这里是同向的:留距离对两者都好。

四、jerk 峰值和 95 分位差一个数量级

表里 jerk 那一列(单位米/秒³):T=1.8 是 37.5,T=0.9 是 2.8。 但两者的 95 分位都是 0.6~0.8。 这说明什么?差别只发生在急刹那两三秒里。其余时间三行的平顺性几乎一样。 为什么 T=1.8 的峰值反而更大?因为时距大、期望车距也大,前车急刹时「缺的」更多, 控制器的反应更急。 这提醒一件事:时距大不等于舒适,它只是留了更多余量。 这也说明为什么舒适性指标必须报峰值。只看平均或 95 分位, 会把「偶发的一下猛刹」藏起来——而乘客记住的恰恰就是那一下。 常用的舒服阈值是 jerk 不超过 2~3 米/秒³。 按这个标准,T=1.8 那 37.5 的峰值是超标的,必须靠加速度限幅或低通滤波压下来。

五、落地:三个旋钮,一条红线

旋钮一:时距。 决定平均车距和通行效率。 建议 1.5 秒起步,允许用户调到 1.0(运动)或 2.5(舒适)。 旋钮二:加速度上限。 决定极端情况下的体感。 建议正向 2.0、负向 −4.0 米/秒²。负向比正向给得多, 因为「该刹的时候刹不住」比「该走的时候走得慢」严重。 旋钮三:jerk 限幅。 决定「顿挫感」。建议 2.5 米/秒³ 以内,超过就平滑。 红线只有一条:不管怎么调,最小车距不能小于「制动距离 + 反应余量」。 这一条是物理约束,不是舒适性偏好。按 120 公里时速、摩擦 0.8 算, 这个下限是 70 米以上——所以高速上根本不可能「跟得紧」,时距必须大。 最后提醒:这些参数不是「调得越激进越先进」。 能在一堆约束里给出可解释、可复现的行为,才是工程成熟度。

六、动手 Demo:跟车规划:时距 1.8 收到 0.9 秒,最小车距 18.9 掉到 9.9 米,减速从 −3.8 到 −4.0

前车以 25 米/秒巡航并叠加正弦波动,第 45 秒急刹 12 米/秒²。 自车初速相同、初始车距 30 米, 分别用定速巡航和时距 1.8/1.2/0.9 秒的IDM 跟车模型跑 90 秒(步长 0.1 秒),统计最小车距、 最大减速度、jerk 峰值和 95 分位、总位移。

star = s0 + max(0.0, v * T_h + v * dvv / (2.0 * np.sqrt(A * B)))
acc = A * (1.0 - (v / (v0 + 6.0)) ** 4 - (star / max(gap, 0.1)) ** 2)
a[i] = float(np.clip(acc, -8.0, 3.0))
v[i] = max(0.0, v[i - 1] + a[i] * dt)
gap[i] = gap[i - 1] + (lead[i - 1] - v[i - 1]) * dt

jerk = np.abs(np.diff(a) / dt)
# 定速巡航那一支:acc = 1.2 * (v0 - v),只看自己的速度

实跑输出:

--------------------------------------------------------------------
跟车规划:时距 1.8 收到 0.9 秒,最小车距 18.9 掉到 9.9 米,减速从 -3.8 到 -4.0
--------------------------------------------------------------------
  仿真                     90 秒,步长 0.1 秒
  前车                     25 米/秒 + 正弦波动,第 45 秒急刹 12 米/秒
  自车                     初速 25 米/秒,初始车距 30 米

  策略                  最小车距(米)   最大减速   jerk 峰/95 分位   位移(米)   位移/前车
  ---------------------------------------------------------------------------------------
  定速巡航          撞上(第 51 秒)       0.00          0.0 / 0.0     2250.0        128.3
  自适应 T=1.8 秒               18.9      -3.75         37.5 / 0.8     1753.1         99.9
  自适应 T=1.2 秒               12.8      -3.45         11.2 / 0.9     1763.3        100.5
  自适应 T=0.9 秒                9.9      -4.03          2.8 / 0.6     1768.4        100.8

  定速巡航那一行:**撞上(第 51 秒)。**
  **它只盯着自己的目标速度,前车急刹它不减速**——最大减速是 0.00 米/秒²,也就是说全程没踩过刹车。
  **这就是为什么定速巡航不能单独用在城市道路:它把安全完全交给驾驶员。**
  自适应三行放在一起看:**时距 1.8 收到 0.9,最小车距从 18.9 掉到 9.9 米。**
  位移从 1753.1 米到 1768.4 米,**相对效率只涨了 0.9 个点;**
  **但最大减速从 -3.75 狠到 -4.03 米/秒²。**
  **用一半的车距和更狠的刹车,换来一个点的通行量——这笔账很不划算。**
  jerk 那一列(单位米/秒³,前者是峰值、后者是 95 分位):
  **T=1.8 是 37.5 / 0.8,T=0.9 是 2.8 / 0.6。**
  **峰值差了一个数量级,但 95 分位几乎一样**——说明差别只发生在急刹那两三秒里。
  **这也提醒一件事:只看 95 分位,会把「偶发的一下猛刹」藏起来。**
  舒适性要报峰值,**因为乘客记住的就是那一下。**
  所以这三行不是「哪个更好」,是**同一个安全余量的三种花法**:
  多留距离、少留距离、或者留距离但加平滑。**三种都要付代价,区别只在付在哪。**

定速巡航第 51 秒撞上——前车第 45 秒开始急刹,6 秒后车距归零。这 6 秒就是「人接管」的窗口, 而人从走神到踩下刹车通常要 1.5 秒以上,再算上制动建立时间,余量非常薄。 车距 18.9 到 9.9 米:看起来「9.9 米还挺宽」, 但那是 25 米/秒下的 0.4 秒——低于人的反应时间。 所以时距小于 1 秒,本质上是在赌「系统永不出错」。 位移只多 15.3 米(0.9%)——这就是「跟得紧」的全部收益。换算成通行量,其实小得可怜。 jerk 峰值 37.5 对 2.8,95 分位都是 0.6~0.8,说明差别只在急刹那一下。 这也是「平均值会骗人」的又一个例子。 要说明:IDM 的参数(A=2.0、B=3.0、s0=2.0)是我设的,前车轨迹也是我造的。 但 IDM 的结构、jerk 的定义、位移统计都是真的,换成实车数据标定参数,流程不变。

30 秒实验

  1. 把前车急刹从 12 米/秒² 加到 20(接近极限),看自适应三行。 T=0.9 那行会撞上——车距不够,减速再快也来不及。
  2. 把加速度下限从 −8 收紧到 −4,看重跑的最大减速和最小车距。 最大减速顶到 −4 就不再降,最小车距会变小——限幅的代价是距离。
  3. 把时距改成 3.0 秒,看位移和车距。 位移会少一截(前车慢时跟得更慢),但车距大到后车会频繁加塞。

常见误区

  1. 「时距越小越先进」。T=0.9 的车距是 9.9 米,不到 0.4 秒,低于人的反应时间。
  2. 「跟得紧能提高通行量」。位移只多 0.9%,代价是车距砍半、减速更狠。
  3. 「时距大就更舒适」。T=1.8 的 jerk 峰值反而最大(37.5),因为期望车距大、急刹时缺得多。
自测三问(点开对答案) 1. 定速巡航为什么会在 Demo 里撞上? —— 它只按自己的目标速度控制,不感知前车距离,所以前车急刹时它不会减速。 2. 时距从 1.8 收到 0.9,换来了什么、付出了什么? —— 位移多 15.3 米(相对效率 +0.9 个点); 代价是最小车距从 18.9 掉到 9.9 米,最大减速从 −3.75 到 −4.03。 3. 为什么舒适性要报 jerk 峰值而不是 95 分位? —— 两者的 95 分位几乎一样(0.6~0.8),差别只在急刹那两三秒——而乘客记住的就是那一下。

车能感知、能决策了,最后一个问题是「怎么证明它可靠」。靠路上跑是不够的——危险场景太稀有。

相关笔记