1. 碰撞检测基础:自动驾驶仿真中的碰撞检测概述、重要性、基本数学原理
1.1 什么是碰撞检测?
碰撞检测,说白了就是判断两个物体有没有「碰在一起」。
在自动驾驶仿真里,这个任务更具体:我们要实时判断自车(Ego Vehicle)与周围交通参与者——比如其他车、行人、自行车、路障——之间是否存在接触或重叠。
我刚开始做仿真时,觉得这玩意儿不就是「两个矩形有没有相交」吗?后来才发现,事情远没那么简单。你想想看,一辆车每秒可能移动几十米,传感器有延迟,控制有滞后,碰撞检测的精度和速度直接决定了仿真结果的可信度。
1.2 为什么碰撞检测如此重要?
这个问题我问过不少新人,答案五花八门。有人说是为了「让车不撞上」,有人说是为了「测试感知算法」。都对,但不够全面。
我个人习惯把碰撞检测的重要性归纳为三个层面:
- 安全性验证——这是最直接的。仿真中如果碰撞检测不准,你可能会误判一个危险场景为安全,或者反过来。我在项目中遇到过这样的情况:一个紧急避障场景,仿真显示车辆「擦肩而过」没撞上,但实际路测时却发生了剐蹭。查了半天,发现是碰撞检测的包围盒精度不够,把车尾的突出部分忽略了。
- 算法评价的基石——规划、控制、感知模块的好坏,最终都要看「有没有撞」。如果碰撞检测本身有漏洞,那整个评价体系就失去了意义。说白了,你拿一把不准的尺子去量东西,量出来的数据谁敢信?
- 仿真效率的瓶颈——嗯,这里要注意。碰撞检测往往是仿真循环中最耗时的环节之一。尤其是场景中有几十上百个物体时,两两检测的计算量会爆炸式增长。我见过一个团队,仿真跑一帧要花两秒,其中1.5秒都在做碰撞检测。这显然不行。
1.3 基本数学原理
好,接下来我们聊聊数学。别怕,我不会堆公式。你只需要理解几个核心概念。
1.3.1 包围盒(Bounding Box)
实际车辆的几何形状非常复杂,有后视镜、保险杠、轮拱……如果直接用原始网格做碰撞检测,计算量太大了。所以我们用「包围盒」来近似。
最常见的两种:
- AABB(轴对齐包围盒)——盒子的边与坐标轴平行。优点是检测速度快,缺点是如果车辆旋转了,包围盒会变大,不够精确。
- OBB(有向包围盒)——盒子的边与车辆自身的朝向对齐。精度更高,但检测计算稍复杂一些。
我个人习惯在低速场景(如泊车)用OBB,高速场景(如高速公路)用AABB。为什么?因为高速场景下车辆姿态变化相对平缓,AABB的误差可以接受,但计算速度更快。
1.3.2 分离轴定理(SAT)
这是碰撞检测里最经典的算法之一。原理很简单:
如果两个凸多边形没有碰撞,那么一定存在一条直线(分离轴),使得两个多边形在这条直线上的投影不重叠。
反过来,如果所有可能的分离轴上投影都重叠,那它们一定碰撞了。
听起来有点绕?我举个例子。你把手电筒从不同角度照向两个物体,看它们的影子有没有分开。只要有一个角度下影子是分开的,那它们就没碰上。
// 伪代码:AABB碰撞检测
function checkAABBCollision(boxA, boxB):
// 检查X轴投影是否重叠
if boxA.maxX < boxB.minX or boxA.minX > boxB.maxX:
return false
// 检查Y轴投影是否重叠
if boxA.maxY < boxB.minY or boxA.minY > boxB.maxY:
return false
// 两个轴都重叠,则碰撞
return true
你看,AABB的检测就这么简单。两个轴一检查,完事。
1.3.3 距离计算与碰撞阈值
实际仿真中,我们很少要求「恰好接触」才算碰撞。因为数值计算有精度误差,而且真实物理世界中,车辆之间需要保持安全距离。
所以我们会设置一个碰撞阈值:当两个物体之间的距离小于某个值(比如0.1米)时,就认为发生了碰撞。
1.3.4 时间步与连续碰撞检测
这里有个坑。如果你只在每个时间步结束时检测碰撞,可能会漏掉「中间时刻」的碰撞。比如一辆高速行驶的车,在一个时间步内穿过了另一辆车,但两个时间步的采样点都没有重叠。
这就是所谓的「隧道效应」。解决办法是使用连续碰撞检测(CCD),它会计算物体在时间步内的运动轨迹,判断轨迹之间是否有交集。
我曾经在一个高速变道场景中被这个问题坑过。仿真显示没撞,但实际物理模拟中车辆已经「穿模」了。后来加了CCD,问题才解决。当然,CCD的计算量更大,需要权衡。
1.4 小结
这一章我们聊了碰撞检测的基本概念、为什么重要,以及背后的数学原理。说白了,碰撞检测就是「用几何方法判断两个物体有没有接触」,但实际工程中要考虑精度、效率、阈值、时间步等一系列问题。
下一章我会深入讲具体的碰撞检测算法实现,包括如何优化计算效率、如何处理非凸物体等。到时候我会分享一些我踩过的坑和总结出来的实用技巧。
记住一句话:碰撞检测不是「有没有撞」的问题,而是「在什么精度下、以什么代价、判断有没有撞」的问题。