无人驾驶定位地图调度
我们清楚地认识到,在无人驾驶技术中定位问题仍需进一步完善。具体而言,在实现无人驾驶的过程中定位精度需要通过以下步骤来提升:首先将实时获取的地图数据进行适当的形式化处理,并将其与预存的离线地图数据进行对比分析;确定相对于当前初始位置的更加精确的相对位置信息。以3D激光雷达为例用于建图时,在这种情况下其中一种方法采用二维到二维的数据融合策略来提高定位精度。
- 2D - 2D的匹配
可将slam后获取到的空间信息转化为二维图像形式。其中每个像素代表当前网格区域内信号的能量水平。接着可对实时获取的三维点云数据进行图像化处理。由于实时采集到的数据可能存在信息不足的问题,在线生成的数据可能不够完善。为了解决这一问题,在分析过程中采用了多帧数据融合的方法。进而构建完整二维图像表示并完成数据填充工作。通过获取当前帧的姿态信息,并结合预先训练好的模型进行匹配分析在此基础上实现两种地图信息的有效结合与优化可以选择SSDM或NCC算法来计算两者的相对位置关系最终输出的结果能够辅助后续多传感器融合定位过程
- 3D - 3D的匹配
这里以NDT匹配为例。首先采用了Simultaneous Localization and Mapping技术(SLAM)。这里的地图有两种不同的表示形式:其中一种方式是直接存储离线对应位置处的三维点云数据;随后将在线获取的三维点云与预先保存好的离线三维点云进行配准处理;具体配准过程中可以通过PCL库中的Normal Distributions Transform算法实现
另外一种方法是,在实际运行阶段进行实时NDT匹配时只需关注实时区域内的变换即可,在这种情况下运算效率会得到显著提升。当然必须自行开发适用于实时场景的NDT匹配算法。
无论怎样,在场景规模扩大后, 将几百公里范围内的地图一次性加载到内存中都是不可行的. 为此, 我们采取了一种更为合理的划分策略: 将地图按照200米乘200米的区域划分块状结构(暂且不考虑立交桥的影响)。在程序运行过程中, 当车辆行驶至某一位置时, 系统会自动加载该位置附近的地理数据. 然而, 这种方法也存在局限性: 由于地理数据以二进制文件形式存储于硬盘, 同时加载多块数据会导致较大的时间开销; 此外, 对于实时定位运算而言, 只能在保证基本精度的前提下进行粗略计算是没有实际意义的. 因此, 我们提出了一种新的解决方案: 通过多线程机制实现地图数据的预加载. 这不仅能够提高资源利用率, 而且还能为后续可能需要用到的地图区域提前做好准备. 另一个需要解决的问题是如何实现对这些区域的地图数据进行选择级调度管理. 接下来我们将详细讨论如何对这些区域进行二级调度管理.


图中每个方块对应一块地图。其中预加载的地图数量应当依据车辆的最大行驶速度来决定。
加载地图分为两步,
第一步是加载当前姿态对应的地图及其周边区域的地图到缓存区 cache1,默认将其称为九宫格地图;
第二步是预加载可能在后续步骤中需要用到的地图到缓存区 cache2。
这里的两个 cache 是典型实例 LRU (Least Recently Used, 最近最少使用)类型的。
当发现当前地图块存在于缓存中时,
应将该条目提升至最前方位置以提高访问效率。
若缓存大小超过指定容量,
则会自动删除最后未被频繁访问的地图块以释放空间。
下面给出流程图

上图为实时加载离线地图并与在线地图匹配,输出相对位姿的流程图。

这张图清晰地展示了二级缓存的工作原理。多个线程通过磁盘加载数据,以便预先配置一个合适的线程池。
