前车第 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 秒实验
- 把前车急刹从 12 米/秒² 加到 20(接近极限),看自适应三行。 T=0.9 那行会撞上——车距不够,减速再快也来不及。
- 把加速度下限从 −8 收紧到 −4,看重跑的最大减速和最小车距。 最大减速顶到 −4 就不再降,最小车距会变小——限幅的代价是距离。
- 把时距改成 3.0 秒,看位移和车距。 位移会少一截(前车慢时跟得更慢),但车距大到后车会频繁加塞。
常见误区
- 「时距越小越先进」。T=0.9 的车距是 9.9 米,不到 0.4 秒,低于人的反应时间。
- 「跟得紧能提高通行量」。位移只多 0.9%,代价是车距砍半、减速更狠。
- 「时距大就更舒适」。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),差别只在急刹那两三秒——而乘客记住的就是那一下。车能感知、能决策了,最后一个问题是「怎么证明它可靠」。靠路上跑是不够的——危险场景太稀有。
- ☐ (本节完,下一节 10.3.3 仿真测试革新)