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

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

转载于:https://www.cnblogs.com/liuzubing/p/11056936.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库的数据类型转换_MySQL 和Server 2000 数据库中数据类型的转换

问题阐述在某些特殊的时候,可能要将MySQL 数据库转换为SQL Server 2000 数据库,这时问题也就随之而来。例如,在MySQL 数据库中,创建的字段使用varchar 类型,该类型的数据可以进行聚合运算,其返回的值是stri…

【Silverlight】Bing Maps开发应用与技巧二:自定义图钉标注控件和动态ToolPanel

在Bing Maps Silverlight Control中以及为我们提供了地图图钉控件Pushpin,我曾经在《使用图钉层(Pushpin layer)及地图图层(MapLayer)》一文中介绍过他的使用方法,本篇主要介绍如何自定义图钉标注控件以及对…

java 创建线程的三种方法_java 创建线程的几种方式

说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class MyThread extends Thread {public void run() {System.out.println("这是MyThread线程");}}然后在调用处,执行start方法…

【iOS】从实际出发理解多线程(二)--NSThread基础操作

简介 NSthread是苹果官方提供面向对象操作线程的技术,简单方便,可以直接操作线程对象,不过需要自己控制线程的生命周期。在平时使用较少,常用的就是下面的方法来获取当前线程。 [NSThread currentThread] 使用 1.实例初始化、属性…

双绞线制作方法和标准

双绞线的制作方法: 标准568B:橙白--1,橙--2,绿白--3,蓝--4,蓝白--5,绿--6,棕白--7,棕--8 (如图2) 标准568A:绿白--1,绿--2&#xff0c…

深入理解Java枚举类型(enum)

理解枚举类型 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看什么是枚举…

Flash/Flex学习笔记(47):反向运动学(上)

先回顾上篇所说的"正向运动学":以人行走的例子来说,基本上可以理解为大腿驱动小腿,小腿驱动脚,从而引发的一系列姿态调整和运动。再举一个例子,我们用着拿一根软鞭或链条的一端挥舞,被手挥舞的这…

java tomcat jms_JavaWeb之使用Tomcat、JNDI与ActiveMQ实现JMS消息通信服务

前言之所以使用JNDI 是出于通用性考虑,该例子使用JMS规范提供的通用接口,没有使用具体JMS提供者的接口,这样可以保证我们编写的程序适用于任何一种JMS实现(ActiveMQ、HornetQ等)。什么是JNDI:JNDI(Java Naming and Directory Inte…

你是第几名:Excel 中 Large 和 Small 的用法

类似于 SQL 语言中的 TOP X, Large 和Small 有2个参数 Large(Array,k) Array 可以为一个单元格区域,k 为第k各最大值,Small 与之对应返回第k个最小值。 注意:单元格区域中的非数字会被忽略掉。 例子如下: 可以类比Rank的用法&…

mac系统下android studio创建手机模拟器

打开android studio,点击右上角的模拟器图标,打开“Android Virtual Device Manager” 窗口,如下图 点击“Create Virtual Device”,在打开的设备定义列表中,选择“Phone -> Nexus 5X”,右边列出了改机型…

如何设置Hyper-V的虚拟机快捷方式

在Windows Server 2008中,提供的Hyper-V功能,可以很方便地在企业环境中部署多个虚拟机,以适应不同的开发需要。一般我们都是通过下面的方式 1. 打开服务器管理器 2.打开Hyper-V管理器,找到有关的虚拟机,然后右键点击“…

java跨函数跳转_VS code 函数无法跨文件跳转到定义

现状:本文件函数通过this打点调用的函数,引入绝对路径的文件,调用的函数都可以通过Ctrl 点击 实现跳转到定义处。而如果在 webpack 通过alias 设置了别名,无法跳转成功。解决方案: 新建文件 jsconfig.json,配置如下。…

python enumerate()

描述 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 语法 以下是 enumerate() 方法的语法: enumerate(sequence, [start0]) 参数 sequence -- 一个序列、迭代器…

java 怎么页面授权访问_Java调用Linkedin接口API之:获取授权

配置领英应用配置地址:https://www.linkedin.com/secure/developer?newapp强烈建议您使用 HTTPS网址必须是绝对网址 (例如: “https://example.com/auth/callbac”,而不是“/auth/callback”)网址参数会被忽略 (即 https://example.com/?id1 与 https:…