Apollo 无人驾驶平台中多传感器标定

传感器标定是无人车最基础也是最核心的模块之一。作为软件层提供的第一项服务,标定质量和准确度极大地影响着感知、定位地图、PNC 等模块。在 Apollo 开源自动驾驶平台中,我们提供了丰富的多传感器标定服务,如激光雷达、惯导、摄像头、多普勒雷达等多种传感器之间的标定。算法覆盖常规 Level 2-Level 4 级别自动驾驶的传感器配置和标定需求。

在本文中,我们将从 L4 传感器标定中两项核心服务(激光雷达到惯导的标定,摄像头到激光雷达的标定)入手,详细介绍 Apollo 标定服务的流程、相关注意事项和常见问题分析,希望 Apollo 开发者和合作伙伴可以参考学习并顺利完成高质量的传感器标定。

多传感器标定

enter image description here

多传感器标定是指对于拥有不同特性和不同观测范围的传感器,去准确地找到它们之间的相对位置关系。以上图为例,虽然它们分别来自于不同的传感器(摄像头和激光雷达),拥有不同的观测角度和不同的数据表达形式, 但是我们也可以设计相应的算法,来准确找到他们的相对位置关系。

enter image description here

传感器之间的相对位置关系,我们通常会用一个 4×4 的转换矩阵 M 来表示。通过这个转换矩阵 M,我们可以将一个传感器坐标系下的点 x 转换成另一个传感器坐标系下的点y。在一个典型的 3D 空间中,传感器的位移、旋转、尺寸变化都可以用一个 4×4 的转换矩阵来表示。以上图为例,左上角 3*3 的矩阵 R,表示传感器的旋转尺寸变化等。右上角的 3×1 的向量 T,表示传感器之间的位移关系。

enter image description here

对于左上角 3×3 的矩阵 R,基于它的正交性和行列值为 1,我们可以将 3×3 共 9 个参数的 R,转换成 4 维的四元素向量。所以,传感器的标定问题,可以简化成寻找 7 个未知的参数,包括 4 维的 4 元数向量和3维的位移向量。和动辄上百万参数的深度学习相比,寻找 7 位未知的参数,听起来像是小菜一碟。

多传感器标定可能遇到的困难

enter image description here

但实际中,多传感器标定会遇到各种各样的问题,它们可能来自于硬件、车载 OS 和通信系统,这就导致多传感器标定成为了无人车中一个问题“黑洞”。

enter image description here

那么,多传感器标定为什么会有这么多困难呢?简单来说,因为不同传感器的特性和不同的观测角度,会导致标定算法有巨大的差异。例如,摄像机可以提供丰富的像素信息,但缺乏有用的 3D 信息,而激光点云可以提供非常准确的 3D 信息,但是信号比较稀疏,并且噪音较大。而不同传感器的观测范围,观测角度不同,导致标定时不能充分的使用所有传感器的信号。另外,传感器标定是硬件和车载 OS 准备充分后的第一个模块,因此它需要容忍传感器的噪音,并对传感器的状态有足够灵敏的反应。

Apollo 将多传感器标定变的简单可依靠

enter image description here

为了解决这些困难,Apollo 开源平台通过任务分解和算法设计,将多传感器标定变的简单可依靠。首先需要粗略的手量传感器之间的相对位置;其次需要采集有用的传感器标定数据;最后通过 Apollo 平台的多传感器标定服务产生准确的标定参数。如同为标定任务建立一个“虫洞”,使得标定变得更高效。

enter image description here

在本次分享中,我们将依次介绍以上所描述的各个步骤。在最后一个步骤中,外参的优化主要由 Apollo 服务提供,不在本次分享中叙述。

粗略估计标定参数

enter image description here

图中是一个典型的 Apollo3.5 传感器方案示例图。我们可以看到多个激光雷达、摄像头以及多普勒雷达被安装在不同的位置,所以需要我们对传感器进行不同的标定服务。

enter image description here

这一张图是一个 Apollo3.5 中多传感器安装位置和坐标系的俯视图。不同颜色的箭头代表着不同的方向。例如,红色代表 x 轴方向,绿色代表 y 轴方向,蓝色代表 z 轴方向;实心圆代表垂直于纸面向外,空心圆代表垂直于纸面向里。我们可以发现,不同的传感器会有不同的坐标系,而相同的传感器在不同的位置也会有不同的坐标系。

enter image description here

在手量传感器标定初值时,一定要分清楚从哪一个源传感器到哪一个目标传感器。生成传感器参数时,一定要注意,这些数值是在目标传感器坐标系下,位移向量以米为单位,转换矩阵 4 元素以弧度值为单位。

采集有效的传感器标定数据

enter image description here

完成初值丈量之后,下一步就是采集有用的标定数据。它主要有两个步骤,分别是通过 Apollo Cyber RT 录取有用的数据,并用新开发的 Apollo 数据提取工具,从录取的数据中提取产生有用的信息。下面,我们为大家详解如何通过 Apollo Cyber RT 录取有用的数据。

录取数据之前的先行检测

enter image description here

在录取数据之前,我们有一些先行的效验步骤来检测传感器状态。在进入 Apollo Docker 之后,我们可以使用 cyber_monitor 命令来检查安装的传感器,有对应的 cyber 信息。在图中 cyber_monitor 显示中,左右两列分别是 cyber 消息名称和对应的帧率。绿色代表消息正常收发,红色代表该消息没有出现。

enter image description here

通过 cyber_monitor,我们可以检查相应传感器的帧率是否正常。例如,激光雷达的帧率是 10 赫兹,而摄像机的帧率最低不能低于 15 赫兹,GPS 和惯导的信号帧率为 100 赫兹。

enter image description here

我们还要特别注意,GPS 的信号是否正常,质量是否够高。如图红色框中,Narrow_INT 是正常状态,而三个方向上的标准方差应该处于 1~2 厘米级别。

enter image description here

在安装 Apollo 平台的车辆上,我们还可以通过 cyber_visualizer 命令来查看传感器的原始数据,保证数据质量,例如,图像是否模糊,激光雷达点云是否噪音过多。如果上述的检查有各种问题,通常是由于其硬件安装和 EOS 系统的配置不正确导致的。

按照 Apollo 的建议进行数据采集

enter image description here

在通过上述初步检查之后,我们可以按照 Apollo 的建议采集有用的传感器标定数据。对于激光雷达,我们只需采集原始点云数据;对于摄像头,我们建议采集未压缩的原始图像信息;对于惯导和 GPS 需采集它的 odometry 信息。右图三个红框分别展示了典型的图像信息、点云信息以及 GPS 和惯导信息。在使用 Apollo Dreamview 进行数据采集前,大家可以通过上述步骤修改相应脚本里消息列表,以适配你的传感器方案。

enter image description here

例如激光雷达到惯导的标定,无人车以数字 8 的行车轨迹,进行数据采集。行驶速度在 5~10 英里每小时,需要行驶大概 8 圈。因为激光雷达到惯导的标定不需要摄像头图像信息,因此可以通过上一段中介绍的方法,更改脚本里消息列表来过滤掉图像消息,以减小采集数据包的大小。更详细的激光雷达到惯导的标定手册,请参照图中链接(https://github.com/ApolloAuto/apollo/blob/master/docs/specs/lidar_calibration.pdf)。

在采集时,我们希望场景中没有过多的动态障碍物,且地面基本平整,而且场景中有类似于树木、电线杆、隔离墩、少量停放的汽车之类的静态障碍物。

enter image description here

而对于摄像头到激光雷达的标定,我们可以通过简单的“4 个 5”来进行开车模式的指导。在一个较为空旷的、拥有大量静态障碍物的场景中,无人车以大约 5 英里每小时的速度直线行驶大约5米后刹车,之后完全停止大约 5 秒。重复上述步骤 5 到 6 次。

enter image description here

如果不能找到上述那样的数据采集场景,也可以在一个停放较多车辆的停车场里完成数据采集。只需注意不要有过多的动态障碍物,例如行人和行驶的车辆。

数据采集之后的检测

enter image description here

当完成数据采集之后,可以运用图中的命令来查看每一个采集下来的数据包。通过计算每秒钟采集数据的帧率,可以大致了解数据是否完整的被存放下来。例如 GPS 惯导信号,我们可以看到 4 秒左右的数据包中,大约有 430 个数据消息,它的帧率基本在 100 赫兹,符合预期。而红框中所标示的摄像头,它的消息数量为 0,如果我们需要完成该摄像头的标定,那说明数据采集不成功,这多半是由于硬件和车载 OS 系统没有按照 Apollo 平台的要求来安装和配置。

通过 Apollo 工具提取有效数据

enter image description here

当完成数据采集之后,我们可以通过近期开发的 Apollo 平台中数据分析提取工具,来提取有用的标定信息。它是开源的提取工具,只需一行命令,就可以自动完成数据提取和数据压缩。在 Apollo 的 GitHub 上,这个工具相对应的目录如右图所示。

enter image description here

和以前的一些工具相比,这个工具更加智能,而且会极大的减少标定所需上传的数据。

enter image description here

这个工具相应的命令和配置如图所示。它的配置主要包括三个部分,第 1 个是 IO 配置,主要是指定标定任务名称,以及相应的输出路径。第 2 个配置,主要为指定输入的数据包路径,它可以是完整的数据包路径列表,也可以是一个包含多个数据包的文件夹路径。最后一部分主要是指定所需要提取的消息名称以及采样率。对于小容量消息,我们建议完整的保留它,因此采样率为 1。

通过 Apollo 产生准确的标定参数

enter image description here

而对于摄像头的内参标定,在这里给大家一些基本的建议。 摄像头内参标定需要采集棋盘格的图像,要求棋盘格的成像能够覆盖图像的各个区域,并且图片中的棋盘格必须完整。采集步骤如下:将设备固定在三脚架上,开启摄像头,观察标定板在摄像头上的成像。将图像分为图中所示 5 个区域,将标定板正对摄像头并移动标定板将成像置于这 5 个区域内。在每个区域内,分别绕标定板的 X、Y 轴旋转正负 30 度左右各一次,绕Z轴旋转正负 45 度左右各一次,并采集图像。

enter image description here

采集完相应的棋盘格图像之后,可以使用 OpenCV 自带的摄像头内参标定工具完成标定。步骤如图所示。完成内参标定后,请按照 Apollo 建议内参文件格式,生成相应的内参文件。

enter image description here

当完成上述步骤后,可以将数据提取工具产生的压缩包以及摄像头的内参文件,发给 Apollo 服务团队,完成传感器的标定。

Apollo 的需要和反馈

enter image description here

在这里,我们总结了一些 Apollo 传感器标定服务所需要的数据等,并给出了两个示例的传感器标定数据提取工具配置文件。

短期内的预期

enter image description here

在不久的将来,我们将陆续开放更多的传感器工具和服务,并进一步优化算法,完成更精准的标定,同时降低传感器标定上传所需数据量,提高标定数据质量。

posted on 2019-06-20 09:55  程十三  阅读(7622)  评论(0编辑  收藏  举报

导航