本周在研究地图,主要做了以下工作
在相对地图中,车道线数据是通过基于摄像头的车道感知而生成的,并且包含基于云端的导航线NavigationLine
基于高精地图在无人车系统中的地位,apollo给出了在不依赖高精地图情况下,提出基于相对地图的导航模式,解决以下三大场景。
1.纯摄像头(无GPS) 完全不依赖定位
沿车道线走,无车道线则人工接管
2.纯摄像头+GPS 依赖定位
有车道线 + 指引线(建立实时相对地图)
无车道线,沿指引线走(纯GPS)
3.摄像头+GPS+高精地图 依赖GPS定位+高精地图定位
L4级
1.人工驾驶采集导航线,覆盖几乎搜有可能的车道及行车可能,传到云端或者离线,过滤数据,平滑轨迹,生成车道级别的指引线存储到云端。(包含车道之间的连接)
2.请求普通导航地图,请求道路级别的routing,生成A到B的轨迹。
3.拿道路级别的routing和之前生成的指引线进行匹配,得到A到B点的多条指引线,根据横向距离越接近终点的指引线优先级越高
4.在无人车行驶的时候,相对地图模块根据指引线和实时车道线生成相对地图,并以10hz的频率实时更新。指引线会转化到车道坐标系,作为道路参考线。感知模块的车道线作为左右边界,生成相对地图。
Navigator是一个云端服务,能够处理上传的驾驶数据,存储指引线、并在前段发来导航请求的时候进行指引线匹配,如果有相应的高清地图数据存在,指引线会和周边的高清地图进行关联,传给下游模块。
Navigator也有离线的处理工具,路径抽取、路径平滑、指引线生产。
录制包含location,gps,can bus的bag包
用/tools/navigatorpython extractor.py提取裸数据,
smooth.sh进行平滑处理,
编译Dreamview前端,
打开导航模式,发送参考线..
Apollo高精地图是以opendrive的格式存在xml文件中,它有base_map(完整), routing_map(道路拓扑图)和sim_map(最减版,用于可视化)三种级别,可以用apollo里面的脚本生成。不管原始数据格式为什么,在Apollo内部的数据地图的格式为proto格式,二进制文件或txt文件。
map模块下面有一个hdmap引擎,主要完成两个工作,它有一个opendrive adpter,主要是读取xml格式的原始地图,完成地图数据解析,并重新组织,封装成提前定义好的proto格式的map。解析的过程主要分为以下四个过程:根目录、header、道路、路口等节点。
第二个是为下游提供访问高精地图的数据元素的接口,比如可以通过ID或者空间位置去检索高精地图的所有元素,比如给定一个点和半径,可以把这个范围之内所有的红绿灯都提出来。
pnc_map暂时没有看明白,相对地图的代码实现也还没有完全理解。
构建实时里程计的难点在于点云不是相同时间获得的,点云中的点随着激光雷达运动会产生漂移,造成点云在匹配时发生错误,不能正确获得两帧点云的相对位置关系也就无法获得正确的里程计信息。
相对于其它直接匹配两个点云,loam是通过提取特征点匹配后计算坐标变换。
文章的做法是将定位与建图分割开来,用scan to scan (帧间匹配)匹配来做运动估计,获得一个高频低精度的里程计,用获取的结果用于去除匀速运动造成的运动畸变。有了里程计校正后的点云数据。接下来做一个低频高精度的map-to-map的地图匹配,保证了实时性的同时又兼具了精度。
LOAM源码主要由四个节点构成,分别完成特征点提取,高频低精度odom, 低频高精度odom, 双频odom融合的功能,
ScanRegistration针对单个scan提取两种特征点(corner 两个点确定直线和surface 三个点确定平面),形成特征点云。一次扫描的点通过曲率值来分类,特征点曲率大于阈值的为边缘点;特征点曲率小于阈值的为平面点。为了使特征点均匀的分布在环境中,将一次扫描划分为4个独立的子区域。每个子区域最多提供2个边缘点和4个平面点。此外,将不稳定的特征点(瑕点)排除。
laserOdometry实现运动补偿和帧间配准,得到一个精度较差的ODOM。获两帧点云之间做处理,将上一帧点云中的所有points投影到同一个时刻tk+1,完成对点云的运动补偿,消除点云畸变,然后与逐渐增长的下一帧点云Pk+1,进行特征匹配,估计lidar的运动,实现里程计功能,最后将Pk+1点云利用估计的运行投影到tk+2时刻。帧与帧配准的初始POSE可以由IMU得到,或者在没有IMU的时候由匀速运动模型。
laserMapping实现了一个较为完整的SLAM过程,也就是同时建图和定位,建立了两种特征点云地图,将k+1时刻的没有畸变帧与地图作匹配,得到更精准的POSE。匹配原则是,对特征点周围的点云簇做主成分分析,来找到对应边和对应面。
在transformMaintenance中为laserMapping输出的低频ODOM提供插值,以获得高频高精度(10HZ)的ODOM.
比如没有回环检测,这时候可以参考LeGO-LOAM
这些算法目前一般针对多线激光,具体效果还需要真车录制的数据包建图校验。
论文的细节及代码实现还需要仔细研究
slam建高精地图,然后可以在Tier.IV网站上在线标注。
3D点云地图提取矢量点及边界,形成矢量地图(ADADS地图)。
定位完成之后配合感知,实时读取地面障碍物点云+VectorMap,提取道路区域的3D位置,
投影到网格中,创建GridMap,生成二维costmap。每一个网格包含四种可能状态,可行驶区域、未知区域、障碍物、不可行驶区域。
vector map生成器,着重看了以下他的RoadSurfaceMark roadslide边界是如何进行标注的。
目前还是一个粗浅的理解,后续需要继续深入阅读这部分的源码。
6.24相对地图采集流程
1、1、驾驶员将车辆驶入待测试路段起点;
2、Module Controller按钮,进入模块控制页面,选中GPS、Localization、Record Bag选项,注意:如果采集的数据包需用于线下模拟测试,还需加上CAN Bus选项。
3、驾驶员从起点启动车辆并按预定路线行驶至终点;
4、操作员关闭Dreamview界面中的Record Bag选项,此时会在/apollo/data/bag目录(这是Docker中的目录,宿主机上对应的目录为[你的apollo根目录]/data/bag)中生成一个类似于2018-04-01-09-58-00的目录,该目录中保存着类似于2018-04-01-09-58-00.bag的数据包。这就是我们所需的数据包,请记住它的路径及名称。注意:单个数据包文件的默认录制时长为1分钟,默认文件大小为2048MB,可通过修改文件/apollo/scripts/record_bag.sh来改变默认值。
从原始数据包提取裸数据 tools/navigatorpython extractor.py
对裸数据进行平滑处理 smooth.sh
Dreamview前端的编译及配置、更改导航地图
重新编译Dreamview前端、配置UTM区域ID