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…

[软技能] png-8和png-24有什么区别?

[软技能] 第682天 png-8和png-24有什么区别? 1、“PNG8”是bai指8位索引色位图du,“PNG24”是24位索引色位图;2、png8:每一张“png8”图像,都最多只能展示256种颜色,所以“png8”格式更适合那些颜色比较单一…

Window7

IE8开发人员工具 在运行栏中输入“Winver”即可查看版本 Windows7 PowerShell UNIX系统一直有着功能强大的壳程序(shell),Windows PowerShell的诞生就是要提供功能相当于UNIX系统BASH的命令列壳程序,同时也内建脚本语言以及辅助…

[软技能] 你认为计算专业和非计算机专业的差别在哪?为什么?

[软技能] 你认为计算专业和非计算机专业的差别在哪?为什么? 非计科,说一下自我所了解到的 在我们学校计科专业不算很强,他们的专业课就是四大套,我们专业会学习其中的数据结构与算法,大学时期的课程我个人…

python 动态规划 数塔_数塔问题,简单的动态规划算法

/*数塔问题:912 1510 6 82 18 9 519 7 10 4 16有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。这道题如果用枚举法,在数…

一位软件工程师的7年总结(转)

勉励下自己... 1、分享第一条经验:“学历代表过去、能力代表现在、学习力代表未来。” 其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:“重要的道理明白太晚将抱憾终生&…

[软技能] 现如今面对如层出不穷的类库,说说你的感受

[软技能] 现如今面对如层出不穷的类库,说说你的感受 百花齐放,百家争鸣的感觉。 说明社区活跃,这一片欣欣尚荣的风景,蛮好!个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚…

maven集成命令-U -B -P -e -X

maven -U clean compile install -e -X -Dmaven.test.skiptrue 在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结&…

String、StringBuffer与StringBuilder之间区别

最近学习到StringBuffer,心中有好些疑问,搜索了一些关于String,StringBuffer,StringBuilder的东西,现在整理一下。 关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什…

java 异步框架_基于Java的轻量级异步编程框架

# **DActor**## IntroductionDActor框架可同时支持同步和异步代码,简化在线异步代码的开发,用同步代码的思维来开发异步代码,兼顾异步代码的高并发、无阻塞和同步代码的易读性,可维护性。基于协程思想设计最大程度的降低阻塞&…

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

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

比拼浮点运算速度,超算排行榜是这样“算”出来的

6月17日,新一期全球超算500强榜单出炉,入选500强的所有超算浮点运算速度都突破每秒千万亿次,中国超算也在前四占有两席位置。 普通计算机用指令运算速度衡量计算性能,而超算通常用浮点运算速度来衡量其性能。那么,什么…

[软技能] 在前后端分离项目里,请说说前端传递的token的流程?

[软技能] 在前后端分离项目里,请说说前端传递的token的流程? (一):cookie前端 post 账号密码,后端 response header: set-cookie, 将 token 插入 cookie 内,之后每次针对该域名下的请求都会带上…

java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼你学一个东西 先学会他的定义java语法是这样定义的 类型修饰符 变量名 值其中左边是被赋值的 右边是赋值的 类型修饰符有 八种 int boolean char short long float double byte当你声明 一个变量时 的语法是类型修饰符 变量名; 也…

[html] 使用svg画一个爱心

[html] 使用svg画一个爱心 <head><style>*,*:before,*:after {box-sizing: border-box;margin: 0;padding: 0;}.heart-loader {position: absolute;display: block;left: 50%;top: 50%;margin-top: -90px;width: 180px;height: 180px;overflow: visible;transform…

webkit

#ifndef MAINWINDOW_H #define MAINWINDOW_H .pro文件QT core gui webenginewidgets #include <QMainWindow>Qt5 不支持webkit #include <QWebEngineView> #include <QUrl> namespace Ui { class MainWindow; } class MainWindow : public QMainWin…

java args eclipse_不会在eclipse中运行含有args[]参数的Java代码,求指导

这不还是上次那个东西吗&#xff1f;我没准备PC上的java开发环境&#xff0c;所以在Raspberry Pi的命令行上&#xff0c;给你从编译到执行尝试了一下&#xff0c;供参考。编辑源代码&#xff1a;pirpi ~ $ nano SequenceDemo.java文件内容填入&#xff1a;import java.lang.Mat…

[html] 使用svg画一个三角形

[html] 使用svg画一个三角形 效果 Screen Shot 2020-11-13 at 14 39 20 说明 svg 定义svg元素 viewBox 定义svg的画布大小&#xff0c;0 0 100 100指的是x、y偏移为0&#xff0c;宽高为100(相对单位) <path /> 定义一个路径元素 fill"..." 定义路径的填充颜色…

数据库连接和异常处理的几种常用方法

一.数据库连接 1.在需要数据库连接的地方连接数据库。比如说&#xff1a; 1 publicclassSQLHleper2 {3 publicintExecuteNonQuery(stringsql)4 {5 connstr"server.;databasenewssystem;uidsa;pwd123";6 SqlConnection conn newSqlConnection(strconn);7 conn.…

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

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