一、仿真地图导入概述
什么是仿真地图
仿真地图,说白了就是给自动驾驶算法「跑路」用的虚拟世界。它不是我们手机里那种导航地图,而是一个包含了道路几何、车道线、交通标志、红绿灯等信息的结构化数据集合。
我个人习惯把仿真地图比作「剧本」—— 算法是演员,地图就是舞台。舞台搭得不对,演员再厉害也演不出好戏。
举个例子,你在仿真里测试自动变道功能。如果地图里车道宽度、曲率、坡度这些数据不准,那算法学到的「变道能力」就是错的。等真车上路,后果可想而知。
地图数据格式介绍
目前主流的仿真地图格式有三种。我一个个说,你记好。
1. OpenDrive 格式
这是行业标准,也是我最常用的格式。OpenDrive 用 XML 描述道路网络,精度能达到厘米级。
它的核心逻辑是「道路参考线」—— 每条路都有一条中心线,车道、路肩、标线都基于这条线定义。
<road name="测试路段A" length="500.0" id="1" junction="-1">
<planView>
<geometry s="0.0" x="0.0" y="0.0" hdg="0.0" length="500.0">
<line/>
</geometry>
</planView>
<lanes>
<laneSection s="0.0">
<left>
<lane id="-1" type="driving" level="false">
<width sOffset="0.0" a="3.5" b="0.0" c="0.0" d="0.0"/>
</lane>
</left>
</laneSection>
</lanes>
</road>
这段代码定义了一条 500 米长的直路,左侧有一条 3.5 米宽的车道。嗯,看着简单,但实际项目中一个路口可能就要写上千行 XML。
2. GeoJSON 格式
GeoJSON 是地理信息领域的通用格式。它用 JSON 描述点、线、面,非常适合表达道路边界、停车位、障碍物等几何信息。
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"type": "lane_boundary"},
"geometry": {
"type": "LineString",
"coordinates": [
[116.397, 39.908],
[116.398, 39.909],
[116.399, 39.910]
]
}
}
]
}
GeoJSON 的好处是轻量、易读。但缺点也很明显 —— 它没有车道拓扑关系。说白了,它只告诉你「线在哪」,不告诉你「线之间怎么连接」。
我在项目中通常把 GeoJSON 当「中间格式」用。从采集车拿到原始数据是 GeoJSON,转成 OpenDrive 后再导入仿真器。
3. PNG 栅格图
这个最简单,也最容易被忽视。PNG 栅格图就是一张普通的图片,用像素颜色代表不同区域。
比如:黑色是道路,白色是路肩,灰色是建筑物。仿真器读取图片后,根据像素颜色生成障碍物和可行驶区域。
| 格式 | 精度 | 语义信息 | 适用场景 |
|---|---|---|---|
| OpenDrive | 厘米级 | 完整 | 自动驾驶算法测试 |
| GeoJSON | 米级 | 部分 | 数据交换、可视化 |
| PNG 栅格图 | 像素级 | 无 | 快速原型、展示 |
仿真场景与地图的关系
这个问题我问过很多新人,十个有八个答不上来。其实很简单:地图是静态的,场景是动态的。
地图提供「基础设施」—— 路在哪、车道怎么划、限速多少。场景提供「剧情」—— 前面有辆车急刹、右边有行人横穿、天气突然下雨。
我曾经犯过一个错:在一个没有红绿灯的地图上测试「红灯停」算法。结果算法永远不停车,我还以为是代码写错了。查了半天才发现,地图里根本没定义红绿灯位置。
所以,导入地图后第一件事:检查地图里有什么,缺什么。缺的东西要么补上,要么在场景里手动添加。
知识体系总览
下面这张图,是我自己梳理的。你看完应该能明白这一章在讲什么。
这张图把本章的知识结构串起来了。你从「仿真地图导入」出发,先搞清楚它是什么,再了解三种格式的区别,最后理解它和场景的关系。嗯,逻辑就这么顺。
好了,这一章就到这里。记住我说的:地图是舞台,场景是剧本。下一章我们聊聊怎么把 OpenDrive 地图真正导入到仿真器里,以及导入过程中那些让人头疼的坑。