3. 场景工程基础
场景要素建模,说白了就是把真实世界的各种元素,翻译成自动驾驶系统能理解的数学语言。我做了这么多年SOTIF,发现很多团队在场景库上栽跟头,问题往往就出在这个「翻译」环节——要么漏了关键要素,要么建模精度跟传感器对不上。
今天咱们就拆开揉碎了讲。我把场景要素分成三大类:静态要素、动态要素和环境要素。每一类怎么建模、有哪些坑,我结合项目经验跟你聊透。
核心原则:要素建模的粒度,必须跟你的传感器感知能力和规控算法需求对齐。建模太粗,场景失去区分度;建模太细,计算开销爆炸,而且容易过拟合。
3.1 静态要素建模
静态要素,就是那些在场景中位置相对固定、不会频繁变化的东西。道路、车道线、交通标志、路沿、护栏、固定建筑物,都算。你想想看,如果连路在哪都描述不清楚,后面的感知验证和规控测试就全没根基了。
我个人习惯把静态要素建模分成三个层次:几何层、拓扑层和语义层。
3.1.1 几何层建模
几何层解决的是「路长什么样」的问题。核心参数包括:
| 参数 | 描述 | 典型精度要求 |
|---|---|---|
| 道路中心线 | 用三次样条或贝塞尔曲线拟合 | ±0.1m(高精地图级) |
| 车道宽度 | 标准车道3.5m,窄车道2.8m | ±0.05m |
| 曲率 | 最小转弯半径,高速匝道通常≥50m | 连续曲率变化 |
| 坡度/超高 | 纵坡≤6%,横坡2%~4% | ±0.5° |
| 路沿高度 | 标准路沿15cm,低路沿5cm | ±2cm |
我的经验:几何层建模最容易犯的错误是「过度平滑」。有一次我检查一个团队的高速场景,他们把匝道曲率用三次样条拟合得特别漂亮,结果实际路面上有一段水泥接缝导致的微小起伏被平滑掉了。后来自车在那个位置做Lane Keeping时,方向盘出现了一次异常抖动。所以,几何层要保留关键特征点,别为了好看丢掉真实路感。
3.1.2 拓扑层建模
拓扑层描述的是「路怎么连」的问题。说白了就是路口、分叉、合流、环岛这些连接关系。我建议用有向图来表示:
- 节点(Node):代表路口、车道起点/终点、变道点
- 边(Edge):代表车道段,包含几何引用和通行规则
- 连接关系:左转、右转、直行、掉头的允许性
举个例子,一个十字路口,至少需要4个入口节点、4个出口节点,以及12条可能的转向边(每个入口3个方向)。
// 拓扑层建模示例(伪代码)
struct LaneSegment {
id: string;
geometry_ref: string; // 引用几何层曲线ID
predecessor: [string]; // 前驱车道段
successor: [string]; // 后继车道段
left_neighbor: string; // 左侧相邻车道
right_neighbor: string; // 右侧相邻车道
speed_limit: float; // 限速 (km/h)
lane_type: enum; // 直行/左转/右转/混合
}
3.1.3 语义层建模
语义层给静态要素「贴标签」。交通标志的类型、限速值、信号灯相位、停止线位置、人行横道范围,都属于语义信息。我见过不少团队把限速标志只存一个「限速」标签,结果测试时发现系统分不清「限速40」和「限速80」——这俩在SOTIF分析里完全是两个风险等级。
避坑指南:我曾经在一个项目中,交通标志的语义建模只存了类型(如「限速标志」),没存具体数值。结果仿真时自车看到限速标志就减速到30km/h,不管上面写的是40还是60。后来我们强制要求:所有限速类标志必须包含数值属性,且数值范围要校验(比如限速值不能超过120km/h)。
3.2 动态要素建模
动态要素就复杂多了。车辆、行人、骑行者、动物,甚至路上滚落的轮胎,都算。动态要素的核心难点在于:状态空间大、行为不确定、交互关系复杂。
3.2.1 车辆建模
车辆是动态要素里最重要的。我一般把车辆模型拆成三块:
- 运动学模型:位置(x,y)、航向角(yaw)、速度、加速度、横摆角速度。常用自行车模型或阿克曼模型。
- 尺寸模型:长宽高、轴距、轮距、最小转弯半径。不同车型(轿车/SUV/卡车/公交车)参数差异很大。
- 行为模型:跟车、换道、加速、减速、转向意图。这个最难,后面章节会专门讲。
你想想看,一辆卡车和一辆轿车在同一个弯道上的表现完全不同。卡车转弯需要更大的内轮差,如果建模时只用轿车参数,那场景里卡车「压线」的测试就全废了。
| 参数 | 轿车 | SUV | 卡车 | 公交车 |
|---|---|---|---|---|
| 车长(m) | 4.5~5.0 | 4.7~5.2 | 6.0~12.0 | 10.0~12.0 |
| 车宽(m) | 1.8~1.9 | 1.9~2.0 | 2.5~2.6 | 2.5~2.6 |
| 轴距(m) | 2.7~2.9 | 2.8~3.0 | 3.5~6.0 | 5.0~6.0 |
| 最小转弯半径(m) | 5.0~5.5 | 5.5~6.0 | 8.0~12.0 | 10.0~12.0 |
| 最大加速度(m/s²) | 3.0~4.0 | 2.5~3.5 | 1.0~2.0 | 1.0~1.5 |
| 最大减速度(m/s²) | 7.0~8.0 | 6.0~7.0 | 4.0~5.0 | 4.0~5.0 |
3.2.2 行人建模
行人比车辆更难建模。为什么?因为行人的运动自由度太高了。车辆基本沿着车道走,行人可以360°任意方向移动,速度变化也快。
我建议用社会力模型(Social Force Model)来建模行人行为。核心思想是:行人受到目标吸引力、障碍物排斥力、其他行人排斥力的共同作用。
// 行人社会力模型简化示例
F_total = F_goal + F_obstacle + F_pedestrian
F_goal = k_goal * (v_desired - v_current) // 目标吸引力
F_obstacle = k_obs * exp(-d_obs / r_obs) // 障碍物排斥力
F_pedestrian = k_ped * exp(-d_ped / r_ped) // 行人之间排斥力
我的经验:行人建模里最容易忽略的是「群体行为」。比如一群人站在路边聊天,突然一个人横穿马路——这个「突然」的时机和速度变化,如果只用随机数生成,场景会显得很假。我后来在模型里加了「注意力场」:当行人朝向道路方向时,横穿概率提高3倍。这样生成的场景才跟真实路口更像。
3.2.3 其他动态要素
除了车辆和行人,还有一些「特殊动态要素」:
- 骑行者:速度介于行人和车辆之间(15~25km/h),运动轨迹不稳定,容易突然变向
- 动物:猫狗、鹿等,运动完全不可预测,尺寸小,传感器容易漏检
- 抛落物:从卡车上掉落的货物、轮胎碎片,初始速度与卡车相同,减速过程复杂
3.3 环境要素建模
环境要素是「背景板」,但千万别小看它。光照和天气直接影响传感器的感知能力,是SOTIF分析里触发功能不足的常见原因。
3.3.1 光照建模
光照条件对摄像头的影响最大。我一般用这几个维度来描述:
| 光照参数 | 取值范围 | 对感知的影响 |
|---|---|---|
| 光照强度(lux) | 0~100000 | 低光照下检测距离下降 |
| 光照方向 | 顺光/逆光/侧光 | 逆光导致目标对比度下降 |
| 色温(K) | 2000~10000 | 白平衡算法可能失效 |
| 阴影强度 | 0~1 | 阴影区域目标分割困难 |
| 频闪频率(Hz) | 50/60/100/120 | LED灯频闪导致图像条纹 |
我记得有一次做隧道场景测试,光照强度从隧道外的80000lux瞬间降到隧道内的200lux。摄像头花了将近2秒才完成曝光调整,这2秒里几乎就是「盲开」。后来我们在场景库里专门加了一类「光照突变」场景,用来验证HDR算法的响应速度。
3.3.2 天气建模
天气要素对激光雷达和摄像头影响最大。雨、雪、雾、霾,每种天气的物理特性不同,建模方式也不同。
- 雨:降雨强度(mm/h)、雨滴大小分布、能见度降低程度。大雨时激光雷达点云会出现大量噪点。
- 雾:能见度(m)、雾滴密度。摄像头在雾天对比度下降,激光雷达回波强度衰减。
- 雪:降雪强度、积雪厚度。雪天路面反射率变化,车道线被覆盖。
- 霾/烟尘:颗粒物浓度(PM2.5/PM10)。对激光雷达的衰减作用明显。
避坑指南:我曾经见过一个团队,在仿真里把「雾」建模成均匀的能见度降低。但真实世界的雾往往是不均匀的——路边雾浓、路中间雾淡,或者雾团飘移。均匀雾场景测出来的系统,到了真实团雾路段照样出问题。所以,天气建模一定要考虑空间不均匀性和时间动态性。
3.3.3 路面附着系数
这个参数经常被忽略,但它对车辆动力学影响巨大。干燥沥青路面附着系数约0.8~0.9,湿滑路面降到0.4~0.6,冰雪路面可能只有0.1~0.3。
我建议在场景建模时,把路面附着系数作为一个全局参数,而不是固定值。同一个弯道场景,干燥路面和冰雪路面下,自车的过弯速度和侧向加速度完全不同,触发的SOTIF风险也不一样。
3.4 要素建模的关联性
最后说一个容易被忽视的点:要素之间的关联性。静态、动态、环境三大要素不是孤立的,它们之间存在耦合关系。
- 光照 + 静态:逆光时,交通标志的反光特性变化,OCR识别率下降
- 天气 + 动态:雨天行人打伞,行人轮廓变化,检测模型可能漏检
- 路面 + 动态:湿滑路面下,他车的制动距离变长,跟车场景的TTC阈值需要调整
核心观点:好的场景要素建模,不是把每个要素单独做到极致,而是把要素之间的耦合关系建模清楚。一个「雨天 + 夜间 + 湿滑路面 + 行人横穿」的组合场景,比四个单独场景加起来更有SOTIF验证价值。
嗯,要素建模这块内容比较多,但都是基本功。你把这些建模方法吃透了,后面做场景库复用和迭代的时候,就会发现底子打得越扎实,上层工作越顺手。