本章主要介绍下apollo代码的map模块,map的代码目录结构如下
├── data // 生成好的地图
│ └── demo
├── hdmap // 高精度地图
│ ├── adapter // 从xml文件读取地图(opendrive保存格式为xml)
│ │ └── xml_parser
│ └── test-data
├── pnc_map // 给规划控制模块用的地图
│ └── testdata
├── proto // 地图各元素的消息格式(人行横道,车道线等)
├── relative_map // 相对地图
│ ├── common
│ ├── conf
│ ├── dag
│ ├── launch
│ ├── proto
│ ├── testdata
│ │ └── multi_lane_map
│ └── tools
├── testdata // 测试数据?
│ └── navigation_dummy
└── tools // 工具
apollo的高精度地图采用了opendrive格式,opendrive是一个统一的地图标准,这样保证了地图的通用性。其中map模块主要提供的功能是读取高精度地图,并且转换成apollo程序中的Map对象。直白一点就是说把xml格式的opendrive高精度地图,读取为程序能够识别的格式。
map模块没有实现的功能是高精度地图的制作,简略的制图过程可以[参考](王方浩:高精度地图制作)。
由于opendrive格式是一个标准,可以它的参考官方网站。下面主要介绍下apollo是如何读取xml地图,并且使用的。
地图的读取在adapter中,其中xml_parser目录提供解析xml的能力。而http://opendrive_adapter.cc则实现了地图的加载,转换为程序中的Map对象。然后地图在http://hdmap_impl.cc中提供一系列api接口给其他模块使用。
下面先介绍下地图消息格式,主要在proto目录
map.proto 分为地图头部信息和结构体,头部信息主要介绍了地图的基本信息“版本,时间,投影方法,地图大小,厂家等”。结构体主要是道路的不同组成部分,包括“人行横道,路口区域,车道,停车观察,信号灯,让路标志,重叠区域,禁止停车,减速带,道路,停车区域,路边的小路,或者行人走的路”。
首先是地图的基本信息
message Header {
optional bytes version = 1; //地图版本
optional bytes date = 2; //地图时间
optional Projection projection = 3; //投影方法
optional bytes district = 4; //区
optional bytes generation = 5; //
optional bytes rev_major = 6; //
optional bytes rev_minor = 7; //
optional double left = 8; //左
optional double top = 9; //上
optional double right = 10; //右
optional double bottom = 11; //底
optional bytes vendor = 12; //供应商
}
下面是地图的道路信息,其中有2个标志(StopSign,YieldSign)是美国才有的,后来查看了下知乎发现对应到国内是(停,让),具体的含义都是一样,停车的意思是到路口先停止,看下有没有车,然后再开始启动,让车就是先让行,比如交汇路口,理应让直行的车辆先通过,然后再汇入道路。[参考](国内为什么不能采用美国的stop sign制度在很多路口设置呢?)
下面在介绍下overlap,overlap在注释里的解释是“任何一对在地图上重合的东西,包括(车道,路口,人行横道)”,比如路口的人行横道和道路是重叠的,还有一些交通标志和道路也是重叠的,这是创造的一个逻辑概念。(不知道这样理解是否正确)
message Map {
optional Header header = 1; //上面所说的地图基本信息
repeated Crosswalk crosswalk = 2; //人行横道
repeated Junction junction = 3; //交叉路口
repeated Lane lane = 4; //车道
repeated StopSign stop_sign = 5; //停车标志
repeated Signal signal = 6; //信号灯
repeated YieldSign yield = 7; //让车标志
repeated Overlap overlap = 8; //重叠区域
repeated ClearArea clear_area = 9; //禁止停车区域
repeated SpeedBump speed_bump = 10; //减速带
repeated Road road = 11; //道路
repeated ParkingSpace parking_space = 12; //停车区域
repeated Sidewalk sidewalk = 13; //路边的小路,或者行人走的路,现在的版本已经去掉?但是其他模块有些还有sidewalk
}
map_crosswalk.proto 人行横道(