3. 道路模型基础:直线模型、曲线模型、分段线性模型
好,咱们进入正题。道路边界约束跟踪,说白了就是让车知道「路在哪」。但路不是直的,也不是一成不变的。那怎么用数学去描述它?这就是道路模型要做的事。
我个人习惯把道路模型分成三类:直线模型、曲线模型、分段线性模型。每种模型都有它的脾气,也有它的用武之地。咱们一个一个聊。
3.1 直线模型:最简单,也最脆弱
直线模型,顾名思义,就是把道路边界当成一条直线来处理。数学表达式很简单:
y = kx + b
或者用极坐标表示:
ρ = x·cosθ + y·sinθ
嗯,这里要注意——直线模型只适用于直道。你想想看,如果前方是个弯道,你还用直线去拟合,那结果肯定偏到姥姥家去了。
我曾经在一个高速场景项目里,直接用直线模型去拟合弯道入口的边界线。结果车辆刚进弯,边界就丢了。后来我加了个曲率检测,发现曲率超过阈值就切换模型。这个教训告诉我:直线模型虽简单,但别滥用。
直线模型的优点很明显:计算量小,参数少,实时性好。缺点也致命:无法描述弯道。所以它一般用在高速公路的直道段,或者作为其他模型的初始化参考。
3.2 曲线模型:弯道场景的救星
弯道怎么办?上曲线模型。这里我重点讲两种:B样条曲线和贝塞尔曲线。这两种我在项目里都用过,各有千秋。
3.2.1 贝塞尔曲线
贝塞尔曲线由一组控制点定义。n阶贝塞尔曲线的公式是:
B(t) = Σᵢ₌₀ⁿ C(n,i) · (1-t)ⁿ⁻ⁱ · tⁱ · Pᵢ
其中t∈[0,1],Pᵢ是控制点。说白了,就是通过控制点去「拉」出一条平滑曲线。
贝塞尔曲线有个特点:曲线一定经过首尾控制点,但不经过中间控制点。中间控制点只是「吸引」曲线靠近它们。
我在做车道线检测时,用三阶贝塞尔曲线拟合弯道。控制点怎么选?我一般取4个:起点、终点、以及两个中间点。中间点根据车道宽度和曲率来调整。效果还不错,但有个坑——控制点多了,曲线容易抖动。
3.2.2 B样条曲线
B样条曲线是贝塞尔曲线的升级版。它解决了贝塞尔曲线的一个大问题:局部修改会影响全局。
B样条曲线的公式稍微复杂一点:
C(t) = Σᵢ₌₀ⁿ Nᵢₚ(t) · Pᵢ
其中Nᵢₚ(t)是B样条基函数,p是阶数。基函数通过递推定义:
Nᵢ₀(t) = 1 if tᵢ ≤ t < tᵢ₊₁, else 0
Nᵢₚ(t) = (t - tᵢ)/(tᵢ₊ₚ - tᵢ) · Nᵢₚ₋₁(t) + (tᵢ₊ₚ₊₁ - t)/(tᵢ₊ₚ₊₁ - tᵢ₊₁) · Nᵢ₊₁ₚ₋₁(t)
看着有点晕是吧?其实核心就一句话:B样条曲线支持局部修改。你改一个控制点,只影响它附近的一段曲线,不会牵一发动全身。
| 特性 | 贝塞尔曲线 | B样条曲线 |
|---|---|---|
| 局部控制 | ❌ 修改一个点影响全局 | ✅ 只影响局部 |
| 计算复杂度 | 低 | 中 |
| 曲线阶数 | 由控制点数量决定 | 可独立设置 |
| 适用场景 | 简单弯道、短距离 | 复杂道路、长距离 |
如果你做的是城市道路感知,弯道多且复杂,我建议用B样条。如果是高速公路,弯道半径大,贝塞尔曲线就够用了。别为了炫技用复杂的模型,够用就好。
3.3 分段线性模型:折中的智慧
直线模型太简单,曲线模型有时又太复杂。有没有折中的方案?有,分段线性模型。
分段线性模型,就是把道路边界分成若干小段,每段用直线近似。数学上就是一组首尾相连的线段:
对于第i段:y = kᵢx + bᵢ, x∈[xᵢ, xᵢ₊₁]
分段线性模型的好处是:
- 计算简单:每段都是直线,没有复杂的曲线运算
- 适应性强:分段足够多,可以近似任意形状
- 实时性好:更新局部线段不影响全局
但缺点也很明显:
- 不光滑:线段连接处有拐角,不够平滑
- 分段数量难定:分太多计算量大,分太少精度不够
我在一个园区自动驾驶项目里用过分段线性模型。园区道路弯弯曲曲,但车速慢(不超过20km/h),分段线性模型完全够用。我每2米分一段,总共分20段,覆盖40米范围。效果出奇的好,而且计算量比B样条小了一个数量级。
3.4 三种模型的对比与选择
说了这么多,到底该用哪个?我整理了一个对比表:
| 模型 | 精度 | 计算量 | 平滑度 | 适用场景 |
|---|---|---|---|---|
| 直线模型 | 低 | 极低 | 高 | 直道、初始化 |
| 贝塞尔曲线 | 中 | 低 | 高 | 简单弯道 |
| B样条曲线 | 高 | 中 | 高 | 复杂道路 |
| 分段线性 | 中 | 低 | 低 | 低速、园区 |
我的经验是:没有最好的模型,只有最合适的模型。你想想看,高速上跑120km/h,你用分段线性模型,拐角处的抖动就够你喝一壶的。反过来,园区里慢慢开,你用B样条曲线,纯属杀鸡用牛刀。
3.5 知识体系总览
下面这张图,是我画的道路模型知识体系。你可以看到三种模型之间的关系,以及它们各自的应用场景。
这张图把三种模型的关系理清楚了。你可以看到,直线模型在最左边,最简单;曲线模型在中间,最灵活;分段线性模型在右边,最实用。实际项目中,我经常把三种模型组合使用——直道用直线模型,弯道用曲线模型,复杂路段用分段线性模型。这样既保证了精度,又控制了计算量。
好了,道路模型基础就聊到这儿。记住一句话:模型是工具,不是目的。选模型的时候,多想想你的场景、你的算力、你的精度要求。别为了用曲线模型而用曲线模型,也别因为直线模型简单就死抱着不放。灵活一点,你的系统才能跑得稳。
- 直线模型:y=kx+b,简单但只适用于直道
- 贝塞尔曲线:由控制点定义,适合简单弯道
- B样条曲线:支持局部修改,适合复杂道路
- 分段线性模型:折中方案,适合低速场景
- 选模型要综合考虑场景、算力、精度
可可精品资料库