引言
内容概要,学习目标
- 了解自动驾驶定位的作用
- 熟悉常见的自动驾驶定位方法
- 掌握整个Apollo定位模块框架
- 独立开发定位模块
1. 定位的作用
1.1 定位及其相关知识点
定位: 获取当前的地理位置信息,通常要通过地图来记录和表示。
一般情况下通过定位来绘制地图,而通过地图来表示车辆当前的位置。
参考系:
- 相对位置:通过标示目标物与其他事物之间的关系以表达事物位置的标示法。
- 绝对位置:表达标记事物在空间中单一、不会因观察者所在位置改变而更改的标示法,一般基于特定的地理坐标(例如经纬度)来引用地球表面的某个位置
1.2 自动驾驶定位模块的作用
如图所示,定位模块在自动驾驶系统中需要明确汽车当前位置,以及车辆当前运动状态(车的航向、速度、加速度、角速度等)信息。
1.3 本章小节
- 为什么要定位?
- 定位和地图的关系,以及参考系
- 定位在自动驾驶中的作用
2. 定位用到的算法
2.1 全球定位系统
概念: 全球定位系统(Global Positioning System, GPS)是一种以人造地球卫星为基础的高精度无线电导航的定位系统,可以在全球任何地方以及近地空间能够提供准确的地理位置、车辆行驶速度及精确的时间信息。用户可以凭借(手机、智能手环或智能汽车)通过无线电和卫星进行实时通讯,从而得到自身准确的位置信息,即经纬度信息。
GPS的特点: 高精度、全天候、全球覆盖、方便灵活
全球四大导航系统:
- 美国全球定位系统
- 欧盟“伽利略”系统
- 俄罗斯“格洛纳斯”系统
- 中国北斗卫星导航系统
GPS的组成部分: 空间部分(GPS卫星)、地面监测部分和用户部分
GPS定位的基本原理: 至少测出当前位置与4颗卫星(这里至少四颗是因为需要三颗卫星来确定(x, y, z)三个位置信息,第四颗卫星提供相对零点时间从而消除时间误差)的距离和对应时间,通过解方程即可求得当前位置在地球坐标系下的位置。
2.2 GPS的扩展(RTK)
RTK(Real-time kinematic, 实时动态) 载波相位差分技术是实时处理两个测量站载波相位观测量的差分方法,将基准站采集的载波相位机发给用户接收机,进行求差解算坐标。
卫星定位误差:卫星信号穿透电离层和对流层产生误差、卫星高速移动产生的多普勒效应引起误差、多径效应误差、通道误差、卫星钟误差、星历误差、内部噪声误差等
RTK 技术流程:
- 基准站观测和接收卫星数据
- 基准站通过无线电台,将观测数据实时发送给流动站
- 六段站收到基准站数据,同时观测和接收卫星数据
- 流动站在两者基础上,根据相对定位原理进行实时差分运算,从而解算出流动站的三维坐标和精度
2.3 惯性测量单元
惯性测量单元(Inertial measurement unit, IMU)是测量物体三轴姿态角(或角速率)以及加速度的装置
IMU内会装有三轴陀螺仪和三个方向的加速度计来测量物体在三维空间的角速度和加速度,以此解算出物体姿态。
2.4 组合导航(GNSS)
GPS+IMU的局限性:在一些特殊场景,例如城市高楼、树荫以及比较长的隧道等,定位精度会受到影响
2.5 先验地图定位
由于GNSS的局限性,引入了先验地图定位,通过离线方式,事先建好当前区域的三维地图,即高精度地图定位图层。
先验地图的两大核心问题:
(1)特征提取和特征匹配:寻找下一个时刻可能的位置
- ICP(iterative closest point)
- NDT(Normal Distributions Transform):快速和准确,适合大规模数据;但是初始化敏感,需要足够准确的初始猜测,通常应用于从粗到细的对齐策略。三种特征类型:球形特征、线性特征、面型特征
- 基于优化的方法
(2)重定位:在环境中找到自己的初始坐标
2.6 实时定位和建图
随着周围的环境变化,地图没有更新,则会得到错误的定位信息,因此需要进行SLAM(Simultaneous locatization and mapping, 同步定位与建图)。
SLAM 类型: 视觉SLAM算法、激光SLAM算法
视觉SLAM算法:
- ORB-SLAM
- LSD-SLAM
- VINS-Mono
激光SLAM算法:
- Cartographer
- LOAM系列
上图是SLAM的大体框架,前端接收传感器数据后进行一些特征提取与特征匹配,后端根据算法做一些优化。
SLAM特点: 精度足够、鲁棒性有待加强、可用于大规模分布式实施建图
2.7 本章小结
目前定位的主流方法:
- GPS + IMU组合导航
- 先验地图
- SLAM
目前主流的方法是GPS + IMU,结合先验地图实现复杂场景定位,SLAM不依赖事先建好的地图,是未来发展的方向。
3. Apollo定位框架介绍
RTK模块作用: RTK模块接收GPS+IMU的消息,发布定位消息和定位状态给其他模块使用
输入:
- Iocalization::Gps
- localization:CorrectedImu
- drivers::gnss:InsStat
输出:
- LocalizationEstimate
- LocalizationStatus
RTK模块底层逻辑: 模块的核心在于GPS+IMU设备给出结果的精度,信息的解算由GPS和IMU设备提供,也可以直接用GPS和IMU原始数据解算。
NDT 模块作用: 接收GPS、IMU和借光雷达点云信息,通过和事先建好的NDT地图进行匹配,得到车辆当前的定位消息和定位状态发布给其他模块使用。
输入:
- localization:Gps
- drivers::gnss::InsStat
- drivers::PointCloud
输出:
- LocalizationEstimate
- LocalizationStatus
NDT 模块底层逻辑:
- NDT模块依赖实现建好的定位地图,地图构建可以通过SLAM框架得到,之后保存到本地,根据车当前位置加载地图,进行NDT匹配得到当前的位置信息
- 当前的NDT模块对GPS和NDT做了简单融合,在NDT失效的情况下,输出GPS的定位结果
- 定位地图的制作通过nde_map_creator来完成
NDT 地图构建
准备工作:准备录制好的数据包,从包中解压出点云和点云当前的pose, 对pose进行校正,保存在指定的文件夹中
- 从文件中读取点云和pose
- 根据点云位置选择对应的node
- 对点云强度信息采样并且放入对应的node
MSF 模块作用: 接收GPS、IMU和激光雷达点云消息,通过NDT输出的结果和组合导航输出的结果进行融合,得到当前的定位消息和定位状态,发布给其他模块使用
输入:
- grivers::gnss::GnssBestPose
- drivers::gnss::Heading
- gnss::Imu
- drivers::PointCloud
输出:
- LocalizationEstimate
- LocalizationStatus
MSF模块底层逻辑: MSF模块对GPS和NDT的结果进行融合,从而提高系统的鲁棒性,因此如何融合是MSF的关键。
本章小节
- Apollo定位模块的目录结构
- Apollo中三种定位算法的输入、输出以及原理
4. 实践案例
云实验室地址:Apollo Studio云实验室
参考文章及视频
星火第四讲 Part2——Apollo 定位模块详解与实践