高精度地图(英文全称为∶High Definition Map),从字面意义上理解为精度更高的地图(相对于传统地图而言)。
绝对精度高
,自动驾驶要求的精度为10cm以内。数据元素更加丰富
,包括车道线、红绿灯、交通标志等。服务的对象并非仅仅是人类驾驶员,而是人类驾驶员和自动驾驶汽车
。传统地图 | 高精度地图 | |
---|---|---|
精度 | 10米左右精度 | 1米以内 |
车道 | 车道级别 | 车道级别(信息更加丰富) |
元素 | 限速、交通规则等 | 交通基础设施 |
功能 | 导航、搜索 | 定位、路径规划 |
实时性 | 准静态 | 动态 |
精度更高,元素更丰富,更新速度更快!
定位
。需要高精度地图表示当前的位置信息,同时还依赖高精度地图提供的定位图层进行定位。ROI(感兴趣区域)
。感知模块中依赖高精度地图提供ROI。例如,红绿灯的识别(位置&&选择哪个红绿灯)规划
。依赖高精度提供的道路信息,例如车道线,曲率,坡度等信息,还依赖高精度地图提供交通规则信息,如是否能够变道,左转还是右转,当前车道关联的红绿灯等。1.更新频率要求高。需要能够做到星期或者天级别的更新。
2.采集难度大。需要专业的地图采集车和地图采集资质。
3.存储空间要求大。高精度地图目前的大小可能要上百G的存储。
4.成本、格式和规范尚未统一。
由于上述几点要求,高精度地图的制作成本高,并且格式尚未有统一的标准,各家的地图可能会出现不兼容的情况,还有一些法律法规的问题等。
高精度按照功能划分为4个图层:
静态图层
。保存道路的3维建模信息,通常是道路的测绘数据。定位图层
。通过原始的点云地图,提取出一些特征如电线杆、建筑物、交通标志等。用来做点云匹配定位。语义图层
。提供道路的结构化信息,这部分信息定义了车道线、交通标志、交通规则信息等动态图层
。实时动态的更新一些信息如:当前路况、实时交通规则、前方车祸等。 高精度地图的制作流程主要包括,实际上还应该包括地图校验。
1.地图采集
2.地图制作 (对城市进行建模)
3.地图标注(对车道线以及其他语义信息进行标注)
4.地图保存(保存为相应的格式)
地图采集车
·基于激光雷达。能够准确获取位置信息,光照变化影响不大。
·基于视觉。能够提供颜色,纹理信息,对光照变化敏感,得不到准确深度信息。
目前主流的方法是通过SLAM算法对道路进行建模,得到一块区域的地图数据,然后进行标注。
视觉SLAM算法 | 激光雷达SLAM算法 |
---|---|
DSO | Cartographer |
ORB-SLAM | LOAM系列算法 |
SVO |
常见的地图标注工具:
目前还没有统一的高精度地图格式,主流的地图格式包括:
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; //路边的小路, 或者行人走的路,现在的版本已经去掉?但是其他模块有些还有side
}
// Crosswalk is a place des ignated
message Crosswalk {
optional Id id = 1 ; //每个人行横道的编号,用以区分
optional Polygon polygon = 2; //人行横道的形状,一般情况是矩形
repeated Id overlap_ _id = 3;
}
// A junction is the junction at-gr
message Junction {
optional Id id = 1;
optional Polygon polygon = 2;
repeated Id overlap _id = 3;
enum Type {
UNKNOwN = 0
IN_ R0AD = 1
CROSS_ ROAD = 2;
FORK_ R0AD = 3;
MAIN_ SIDE = 4;
DEAD_ END = 5;
};
optional Type type = 4;
}
message Lane{
optional Id id = 1;
// Central Lane as reference trajectory, not neces
//central.
optional Curve central curve = 2;
// Lane boundary curve.
optional LaneBoundary left boundary = 3;
optional LaneBoundary right_ boundary = 4;
// in meters.
optional double length = 5;
// Speed limit of the lane, in meters per second,
optional double speed_ Limit = 6;
repeated Id overlap. _id = 7;
// All lanes can be driving into (or from).
repeated Id predecessor_id = 8;
repeated Id successor_ 1d = 9;
// Neighbor lanes on the same direction.
repeated Id left_neighbor_forward_lane id = 10;
repeated Id right_neighbor_forward_lane_ 1d = 11;
}
message StopSign {
optional Id id = 1;
repeated Curve stop_ line = 2;
repeated Id overlap_ id = 3;
enum StopType{
UNKNOWN = 0;
ONE_ WAY = 1;
TWO_ WAY = 2
THREE_ WAY = 3;
Four_ WAY = 4
ALL_ WAY = 5;
};
optional StopType type = 4;
}
message Signal {
enum Type {
UNKNOWN = 1;
MIX_2_HORIZONTAL=2;
MIX_2_VERTICAL=3;2
MIX_3_HORIZONTAL=4;
MIX_3_VERTICAL=5;
SINGLE=6;
};
optional Id id = 1;
optional Polygon boundary = 2;
repeated Subsignal subsignal = 3;
// TODO: add orientation. now no data support,
repeated Id overlap_id = 4;
optional Type type =5;
//stop line
repeated Curve stop_line = 6;
repeated SignInfo sign_info = 7;
}
// A yield indicates that each driver must prepar
// driver on another approach proceed.
// A driver who stops or slows down to let anothe
// the right of way to that vehicle.
message YieldSign{
optional Id id = 1;
repeated Curve stop_Line = 2;
repeated Id overlap_id = 3;
}
message ClearArea {
optional Id id = 1;
repeated Id overlap _id = 2
optional Polygon polygon = 3;
}
message SpeedBump {
optional Id id = 1;
repeated Id overlap _id = 2;
repeated Curve position = 3;
}
//The road is a collection of traffic e Lements ,
// etc
// It provides general information about the road
message Road {
optional Id id = 1;
repeated RoadSection section = 2;
// if lane road not in the junct ion, j unct ion
optional Id junction _id = 3;
enum Type {
UNKNOWN = 0;
HIGHWAY = 1
CITY_ ROAD = 2;
PARK = 3;
}
optional Type type = 4;
}
message ParkingSpace {
optional Id id = 1;
optional Polygon polygon = 2
repeated Id overlap_ _id = 3;
optional double heading = 4;
//ParkingLot is a place for parking cars.
message ParkingLot {
optional Id id = 1;
optional Polygon polygon = 2;
repeated Id overlap _id = 3;
};
}