从零开始做自动驾驶定位(十三)_ 关于建图的讨论

从零开始做自动驾驶定位(十三): 关于建图的讨论

配套代码和测试数据:联系作者获取

image

附赠自动驾驶学习资料和量产经验:链接

代码在后续可能会有调整,如和文章有出入,以实际代码为准

========================================

系列文章进行到这里,建图部分算是基本完工了。

但是关于建图这件事倒还有几句话想说。

现在是早上7:25,在熬了一个通宵debug之后,打了这些字,浑浑噩噩,乱七八糟,胡说八道。

所以,对各位只有一个请求,就是读完这篇之后如果觉得浪费时间,别骂人就行了。

关于是否需要地图这个问题,高翔博士已经在别的文章里回答过了(文章链接),而且答得非常好,反正比我好,在观点上我和大佬是一致的,这里我想补充谈一些我的想法。

我想往这个问题的背后走一走,所以就不局限于城市自动驾驶场景,而是着眼于多场景的定位需求。

其实要不要建图的问题在不同场景的定位需求下确实有不同的答案,也即在不同场景的任务中要适应性地改变方案。

作为融合定位工程师,为了能够准确给出匹配的方案,我们首先要明白定位方案设计的核心思想是什么,各种不同的方案其实只是核心思想在不同场景下的应用而已。

我总结的核心其实就三个字:“互补性”。

1. 什么是互补性

“互补性”这三个字怎么强调都不为过,定位方案中传感器选择的过程,就是**“寻找互补性”的过程,而融合的过程,就是“执行互补性”**的过程。

不妨举几个例子。

第一个是IMU和GNSS的例子,前者有累计误差,但是没有位姿跳变,后者没有累计误差,但受干扰或遮挡时会跳变。二者融合,既能消除累计误差,又能避免跳变。可以抽象表述为,误差在“累积性”和“噪声性”上都有互补,那么融合既消除了累计性,又消除了噪声性。

第二个是GNSS和点云地图定位的例子,二者均不随时间累计,均有位姿跳变,前者在场景稀疏的情况下定位良好,但受高楼和树木遮挡时表现不好,后者在空旷处无法定位,但是就喜欢稠密的地方,二者融合,两种场景皆可解决。可以总结为在“异常场景”上有互补,融合使其场景适应性增强。

第三个是IMU和激光里程计的例子,二者均有累计误差,但是前者随时间累计,后者随距离累计。二者融合,速度快时,经过同样距离,imu累计误差比激光里程计小,应以imu定位结果为主,速度慢时,经过同样距离,imu累计误差更大,应以里程计定位为主。这样融合后的累计误差均比单一传感器时要小。可以总结为在“误差累计方式”上存在互补,融合使其累计误差减小。但是“累计性”仍然存在,并没有被消除。

这样的例子太多了,但是从上面三个例子中已经足以发现一个规律,融合消除或者减弱的是其有差异的那部分特性,具体包括IMU误差累积性与GNSS误差不累计性之间的差异,GNSS喜空旷与点云地图定位喜稠密之间的差异,IMU随时间累计与激光里程计随距离累计之间的差异,融合使他们的性能都有大幅度提升。但是我们同时也注意到,他们共同具有的那部分特性并没有被消除,比如IMU和激光里程计均具有累计性,融合之后仍有累计误差,虽然误差减小了。可以想见,即使再拿一万个具有累计误差的传感器和他们融合,融合结果的误差仍然是有累计的。

所以,我们有必要强调:只有差异性才能在融合中得到补偿。

这句话也可以换一种表述方式:通过融合消除误差的过程,就是为该误差寻找差异性信息的过程。

这个差异性就是互补性。

《机器人学中的状态估计》有这样一句话“状态估计的过程,是理解传感器本质的过程”。在我的理解里,与其他传感器的互补性就是这个“本质”的重要组成部分。

2. 要寻找的是什么样的差异性?

差异性无处不在,我们面对一个系统,为了提高它的性能,应该怎样从众多的差异性中找到最重要的那个?

举个例子,在IMU和GNSS组合的方案中,融合结果之所以既不累计又不跳变,是因为GNSS的“不累计性”跟IMU“累计性”形成了一对差异性。现在把它放在城市环境下,有很大概率GNSS信号受遮挡,无法定位,这时这一对差异性就消失了,无法形成互补,那么融合结果就又重新具有了“累积性”。

要解决这个问题,就要从差异性消失的原因入手。

因为GNSS被稠密环境遮挡,导致我们需要的“不累计性”消失了,那么就要提供一个同样具有“不累计性”,并且在“遮挡性”上和GNSS能形成互补的信息,比如基于点云地图的定位就具备这个要求,所以加上这个信息之后,不仅提供了另一个“不累计型”,而且它和GNSS有形成了场景的互补性,那么这个融合系统就同时具备了“不累计性”和“稠密环境适应性”。

所以,解决故障时最缺失的那个差异性,就是我们最需要寻找的差异性。

这好像是一句废话。

为了证明这句废话并没有完全非废,我们举一个反例。

在上面这个故障中,如果我不添加点云地图定位,而是再添加一个轮速计,跟添加点云地图定位比,它是更好了,还是更坏了呢?(我们这里的讨论以性能为目的,暂不考虑复杂度、成本、数据下发等运营相关事项)。

添加轮速计以后,IMU+轮速计的组合把里程精度提高了,但是“累计性”仍然存在,它会让你不超差的时间长一些,能在指标内保持行走更远的距离。如果这个自动驾驶车就是在一个区域内来回清扫,这个区域两边都是楼,RTK几乎没有固定解,虽然区域并不是很大,但是车辆来回走,总路程很长,所以仍然会导致超差。所以这种做法只是给他续了命,并没有给他看好病。

我再举一个例子,同样是IMU和GNSS的组合方案,这次是在高速路场景下,用在卡车上,遇到的问题是高速路上偶尔会有一些隧道,进入隧道以后GNSS信号消失,IMU的位置保持精度又不足以保证在出隧道之前不超差,这时应该怎么办?

如果我们仍像上一个例子那样加一个点云地图定位可以吗?如果做过这方面工作的应该都知道,隧道内随着距离推进,点云是无差异性的,也就是说点云和地图匹配容易匹配不上。

反过来,如果我加一个轮速计呢,加上轮速计以后虽然有累计误差,但是累计误差减小了,而且车是单方向通过隧道,不会像清扫车那样在一个没信号的区域里来回走,所以需要保持的距离没那么长,在这种情况下,添加轮速计反而比添加点云地图定位要好。

我们把这两个例子在一起看,能发现什么呢?

我们能够发现同一套组合方案,出现同样的故障,同样的原因,但是解决方案不一样。而且在上一个例子中被抛弃的方案反而成了这个例子中的优选,而上一个例子中的优选,却在这个例子中被抛弃。

所以,我们把刚才的那句废话再说一遍:解决故障时最缺失的那个差异性,就是我们最需要寻找的差异性。

并且,在它的后面再追加一句:缺失程度是由目标任务决定的。

3. 系统性能的短板是由最缺失的那个差异性决定的

这一点其实是上一点的延续,之所以单独作为一个点来说,是因为它很重要。

我们或许见过这样的例子,有一个项目,需要在一个城市环境下,完成20cm以内的定位需求,而目前的方案中GNSS+IMU+轮速计精度不行,经常超差,原因就是城市中高楼和树木太多,导致观测信息有效率和质量都很差。

如果我们按照刚才的思路分析原因,这里的故障状态就是GNSS“非累计性”消失,导致融合系统重新出现“累积性”,解决故障就是要重新给这个“累积性”寻找差异信息,并且要和GNSS的“稠密遮挡性”形成差异。

而有些做法却是再添加一个具有“累计性”的东西,比如添加一个激光里程计,像loam那样。虽然它也和IMU与轮速计提供了差异性,但是这个不是最缺失的那个差异性,“累计性”是他们的共性,是消除不了的。所以这样的差异性再加一万个过来,也无法解决问题。如果是刚才清扫车的任务,那么超差是必然的。

既然这个系统里,性能的短板是由“累积性”决定的,不给它提供差异性信息,性能永远不会有本质上的提高。

4. 怎样利用互补性的原则设计方案

上面几个部分我们分析了什么是互补性、找什么样的互补性、以及怎样找(瞄准短板)。

这就是我们一开始提到的定位方案设计的核心思想。

定位方案设计的过程,就是核心思想在不同场景下的运用过程,即抽象问题具象化。

列几个常见场景:

1)城市环境清扫车

a. GNSS和IMU是基础,二者融合消除了“累积性”

b. 由于经常出现GNSS长时间受遮挡,所以要寻找同样具有“非累积性”且“遮挡性”与GNSS互补的方案,即点云地图定位

c. 有些区域雷达容易受遮挡,比如人流量大,此时可低速或停车,IMU随时间累计,需增加不随时间累计的信息,即轮速计

d. 轮速计打滑、GNSS位姿跳变、点云地图位姿跳变均与IMU噪声特性形成互补

2)港口卡车

a. GNSS+IMU组合,GNSS信号有效率和质量均较高

b. 偶尔有起重架遮挡,正常通行可依赖IMU

c. 若在起重架下行驶慢,甚至停留,IMU随时间累计,误差增大,需要加轮速计

3)矿区

a. GNSS+IMU组合,GNSS信号有效率和质量均较高,基本够用

b. 偶尔有信号不好路段,需要增加额外里程计,因为矿区环境多变,点云地图方案不合理,而轮速计在坑洼路面表现不好,所以加激光里程计

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

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

相关文章

详细分析Vuex中的mapGetters

目录 1. 基本知识2. Demo13. Demo2 1. 基本知识 优势和用途 简化代码:用 mapGetters 和 mapState,可以简化组件中对于 Vuex 中状态和 getter 的映射工作,减少了重复的代码书写更易读:组件中直接使用映射的计算属性,使…

CSS设置文本

目录 概述: text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述: 在CSS中我们可以设置文本的属性,就像Word文…

20 Games101 - 笔记 - 光场、颜色与感知

**20 ** 光场、颜色与感知 光场 眼睛成像 眼睛成像:我们看到这个三维世界,在眼睛里类似就是一幅二维的图。如果直接看到一幅记录了看到的光线信息的图,也能得到同样效果(虚拟现实)。 全光函数 全光函数可以描述…

Jupyter Notbook如何安装配置并结合内网穿透实现无公网IP远程连接使用

文章目录 推荐1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂&am…

java swing个人财务收支管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 个人财务收支管理系统 是一套完善的窗体设计系统,对理解SWING java 编程开发语言有帮助,系统具有完整的源代码和数据库,,系统主要采用C/S模式开发。 应用技术:javamysql 开发工具&#xf…

web APIs总结(1)

1. 根据CSS选择器来获取DOM元素 (重点) 获取一个DOM元素我们使用谁?能直接操作修改吗?querySelector() 可以返回值:CSS选择器匹配的第一个元素,一个 HTMLElement对象。如果没有匹配到,则返null 获取多个DOM元素我们使…

有时导数据代码比写SQL要快很多

一、背景 接到一个数据需求,是从我们的Mongo中导出的,但要取的值得到很深的层级,尝试写了半天Mongo的查询查不出来,问了半天大模型给的也不对,于是考虑写代码的方式 二、数据格式 // 1 {"_id": ObjectId(&…

考研数学|张宇《1000题》做不下来怎么办?

不要害怕,你绝对可以做下来! 1000题分为基础题和难题,基础题做题来还好,但是难题就有点偏和怪了,这是大部分考研人对于1000题的一致评价。 我觉得你可以这么做: 基础阶段可以做1000里面比较基础,简单的题…

ReLU Strikes Back: Exploiting Activation Sparsity in Large Language Models

iclr 2024 oral reviewer 评分 688 1 intro 目前LLM社区中通常使用GELU和SiLU来作为替代激活函数,它们在某些情况下可以提高LLM的预测准确率 但从节省模型计算量的角度考虑,论文认为经典的ReLU函数对模型收敛和性能的影响可以忽略不计,同时…

SAP SD学习笔记03 - SD模块中的主数据

上一章讲了SD中的组织单位和SD的简单流程。 SAP SD学习笔记02 - 销售流程中的组织单位-CSDN博客 SAP SD学习笔记01 - 简单走一遍SD的流程:受注,出荷,请求-CSDN博客 这一章讲SD中的主数据: - 得意先Master(客户&…

LeetCode404:左叶子之和

题目描述 给定二叉树的根节点 root ,返回所有左叶子之和。 代码 class Solution { public:int getLeftSum(TreeNode* node, int& sum) {if (node nullptr || (node->leftnullptr &&node->rightnullptr)) return 0;if (node->left) getLeftS…

企业营销线索溯源:拒绝合规风险!

天眼销的线索溯源功能已经上线一段时间了。 溯源功能主要是查找从天眼销下载的企业营销线索的来源,通过输入相应的数据,就能查到该营销线索的来源网站。 虽然我们在所有的宣传介绍都表明我们的数据都是从公开渠道获取的,但是还是有很多用户会…

electron的webview和内嵌网页如何通信

在 Electron 的世界里,webview 标签相当于一个小盒子,里面可以装一个完整的网页,就像一个迷你浏览器。当你想和这个小盒子里的内容说话时(也就是进行通信),这里有几个方法可以帮你做到: 这里只写…

golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新

1.因为业务需要查询父文档以及其下子文档,搞了很久才理清楚。 首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面 {"query": {"nested": {"path": "comments","query": {"match…

损失函数篇 | YOLOv8更换损失函数之Powerful-IoU(2024年最新IoU)

前言:Hello大家好,我是小哥谈。损失函数是机器学习中用来衡量模型预测值与真实值之间差异的函数。在训练模型时,我们希望通过不断调整模型参数,使得损失函数的值最小化,从而使得模型的预测值更加接近真实值。不同的损失函数适用于不同的问题,例如均方误差损失函数适用于回…

【随笔】Git 高级篇 -- 相对引用1 main^(十二)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

lomobok源码编译学习笔记(1)

lomobok学习笔记(1) 项目导入 lombok的github地址 GitHub - projectlombok/lombok: Very spicy additions to the Java programming language. 开发工具 idea不知道为啥,装上ant工具也不好用,eclipse默认自带有ant,不需要装。…

基于SpringBoot+vue网上点餐系统包含万字文档

基于SpringBoot的网上点餐系统包含万字文档 项目视频演示: springboot027网上点餐系统包含万字文档 开发系统:Windows 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要…

这一次,阿里能完成变革么

更多精彩内容在公众号。 马云在阿里内网发表题为《致改革 致创新》的帖子。释放支持继续改革信号。全文参考下图 马云在最近的发言中首先引用了阿里巴巴集团董事局主席蔡崇信的一次采访,表示对蔡崇信坦率地承认过去错误的勇敢态度表示赞赏。马云强调,犯错…

Python - 深度学习系列32 - glm2接口部署实践

说明 前阵子,已经对glm2的接口部署做了镜像化。本次的目的是: 1 测试在隔了一阵子(忘记)的情况下,快速部署时是否有障碍,是不是足够方便2 在算网机环境下,能否快速的实现部署。仅考虑文件方式…