自动驾驶定位算法:基于多传感器融合的状态估计(muti-Sensors Fusion)

自动驾驶定位算法:基于多传感器融合的状态估计(muti-Sensors Fusion)

image

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

1、传感器(Sensor)选取

自动驾驶系统中用于状态估计(State Estimation)的常用传感器包括GPS/GNSS、IMU、激光雷达(Lidar)。

image

状态估计(State Estimation)选用传感器需要考虑哪些因素:

1)误差不相关性。也就是说,用于Sensor Fusion的传感器其中单个传感器(Sensor Measurement)测量失败,不会导致其它传感器(Sensor)由于相同的原因而同时失败。

2)传感器的相互补充性。 比如IMU可以填充GPS两次定位间隔期间的定位输出,用于平滑GPS/GNSS的定位结果;GPS为IMU提供初值,消除IMU单独使用出现的偏移(Drift)的问题;Lidar可以弥补定位精度的问题,而GNSS可以为Lidar定位地图匹配提供地图范围数据。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

2、传感器的标定(Sensor Calibration)

如果想要各个传感器能够相互协同,无间配合,传感器的标定是必不可少的。传感器的标定通常分为三种: 内参标定(Intrinsic Calibration)、外参标定(Extrinsic Calibration)和时间校准(Temporal Calibration)。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

2.1 内参标定(Intrinsic Calibration)

传感器或者车辆的内参在传感器制造的时候就已经固定下来,传感器模型中的固定参数都是内参,都需要通过Intrinsic Calibration事先确定。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

比如估计车辆运动距离的轮速计模型 �=�� 中,r就一个内参。另外激光雷达(Lidar)中扫描线的角度,在激光雷达计算模型中需要事先知道这个参数,以实现激光雷达扫描线(Scan Line)的拼接。

如何获取传感器的内参呢?实践中有几种方法:

1)从传感器制造商的使用说明书中获取。这种方法往往只能获取大概的参数,每个设备的内参都是不同,所以并不能获取比较精确的参数。

2)手工测量内参。比如车轮的半径,可以通过手工测量的方法获取。但是类似于激光雷达的内参无法通过手工测量获取。

3)Estimate as part of State。这种方式不仅可以获取精确的传感器内参,而且可以解决内参随时间变化的情况。比如汽车的轮胎半径漏气导致半径变小等。

2.2 外参标定(Extrinsic Calibration)

传感器的外参主要表达各个传感器之间的位置相对姿态,它是把各个传感器的数据坐标统一起来的必不可少的参数。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

如何获取传感器的外参呢?实践中有几种方法:

1、CAD图纸。如果你能获取传感器安装的CAD图纸,那你就可以获得比较准确的传感器外参。

2、手动测量。当然手动测量的难度也非常高,因为传感器的中心往往在传感器内部,难以精确测量。

3、Estimate as part of State。这也是一个研究的方向。可以比较好的应对外参标定问题,但难度也比较高。

2.3 时间校准(Temporal Calibration)

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

时间校准对于各个传感器的数据融合至关重要。比如IMU的输出频率是200HZ,Lidar的输出频率是20HZ,只有按照最相近的时间进行对齐,才能将IMU和Lidar数据准确融合起来。

在实际应用中,各个传感器的相对时间误差是未知的,这些误差可能是由于各个传感器的预处理耗时不同导致的,也可能是由于各个传感器的计时器精度不同造成的。

如何校准传感器的时间呢?实践中有几种方法:

1)假设这些传感器的时间相对误差为0。当然忽略这些误差,会导致最终的融合结果比预期要差。

2)硬件同步。在硬件设计上保证各个传感器的时间戳对齐。

3、EKF-多传感器融合(Multi-Sensors Fusion)

image

自动驾驶汽车一般包含多个Camera、3D 激光雷达(Lidar)、惯性测量单元(IMU)、多个Radar、GPS/GNSS Reciver、轮速计(Wheel Odmetry),这些传感器在运行过程中时刻都在以不同的频率发送不同类型的数据,多传感器融合模块需要将这些信息融合起来,不断更新自动驾驶车辆的状态(Vehicle State)。多传感器融合进行状态估计(State Estimation)的流程如下:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

车辆运动模型(Motion Model Input)如下,它的信息一般来自于IMU,包含x、y、z三个方向上的加速度和角速度,是一个6维向量。

image

车辆运动模型的计算过程如下:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

为了应用EKF,我们定义Error State如下,其中 image 是3x1的矩阵。

image

EKF的Motion Model如下:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

EKF中的GNSS测量模型:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

EKF中的Lidar测量模型:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

这里假设激光雷达(Lidar)的测量结果和GNSS的测量结果都在同一个坐标系下(注意,实际情况下,需要经过坐标变换才能达到这种效果)

EKF的IMU+GNSS+Lidar多传感器融合流程如下:

1)Update State With IMU Inputs

image

2、Propagate Uncertainty

image

3、当有GNSS或者LIDAR测量结果到达时,进入步骤4),否则进入步骤1)。

4、计算GNSS/Lidar的卡尔曼增益(Kalman Gain)。

image

4、计算Error State。

image

5、Correct Predicted State。

image

6、Compute Corrected Covariance。

image

4.状态估计(State Estimation)的精度需求(Accuracy Requirements)

不同的应用场景对State Estimation的精度的要求不同,比如高速场景下的Lane Keeping一般要求亚米级级精度。如下图所示的场景,车辆宽度为1.8m,机动车道宽度为3m,所以车辆两侧有约60cm的冗余空间,在这种场景下,如果要实现Lane Keeping的功能,只要状态估计的精度小于60cm就可以满足实际应用的需求。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

但在拥挤的城市道路交通场景下,对State Estimation的精度要求是越高越好,状态估计的精度越高,自动驾驶就越安全。

5、状态估计(State Estimation)的更新频率要求

以人类驾驶汽车为例,一个人开车过程中闭着眼睛,但为了保证行车安全,她每间隔1s睁开一次眼睛,以确定自己所在的位置。在空旷的道路场景下,1HZ的位置确认频率就可以保证,但是在繁忙的交通的道路上,1s确认一次位置的做法就非常不靠谱了。

但是,越高的定位频率带来的越高的计算资源消耗,而车载计算资源是有限的,并且还是感知、控制、决策、路径规划等所有功能共享的,所以在更新频率和计算资源之间需要有一个trade-off。

根据经验,15HZ-30HZ的状态更新的频率就能够满足自动驾驶的应用需求,当然在计算资源允许的情况下,状态更新(State Estimation)频率越高越好。

6、Sensor Failures

自动驾驶使用的传感器系统可能由于外部环境因素而失效,比如恶劣天气状况、硬件故障、系统连接线松了等等;也可能由于传感器自身的短板导致,比如GNSS在隧道场景下无法定位、在城市环境下定位的误差达到数十米,IMU容易收到温度变换的影响等。

即使在没有传感器异常的情况下,我们依然能够从多传感器的使用中收益。如下图所示,各个传感器的功能相互补充,构建安全的自动驾驶系统。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

各个传感器各有所长,比如短距测量传感器可以在停车场景下,检测附近的障碍物,避免发生碰撞;中距测量传感器在车道保持场景下,检测周围的行人、机动/非机动车辆;长距测量传感器帮助我们检测和预测远距离障碍物的运动等等。在实际应用要充分考虑到这些传感器的长处和短板,并增加一定的冗余系统,保证在部分系统无法工作的情况下,仍然可以保证车辆的正常运行。

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

7、多传感器融合的代码实战

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

Couresas上的Multi-Sensors Fusion Project效果如下:

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

image

Coursera Lecture-State Estimation and Localization for Self-Driving Cars

参考链接:

https://medium.com/@wilburdes/sensor-fusion-algorithms-for-autonomous-driving-part-1-the-kalman-filter-and-extended-kalman-a4eab8a833dd​medium.com/@wilburdes/sensor-fusion-algorithms-for-autonomous-driving-part-1-the-kalman-filter-and-extended-kalman-a4eab8a833dd

https://www.coursera.org/learn/state-estimation-localization-self-driving-cars​www.coursera.org/learn/state-estimation-localization-self-driving-cars


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

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

相关文章

Android JNI调试总结

1、确保NDK和CMake已经安装 新建能编译APK的工程,工程中添加相关ndk目录 2、添加C模块 添加完成后,工程目录自动更新,build.gradle导入了so编译器 修改build.gradle中添加相关gcc编译器如下 externalNativeBuild { cmake { abiFilters a…

python学习25:python中的元组(tuple)

python中的元组(tuple) 1.什么是元组? 元组也是容器数据类型的一种,同列表几乎是一样的,都是可以在里面封装多个,不同类型的元素在内;与列表最大的不同就是: 元组一旦被定义,就不能修改 2.元组…

头盔检测 | 基于Caffe-SSD目标检测算法实现的建筑工地头盔检测

项目应用场景 面向建筑工地头盔检测场景,使用深度学习 Caffe SSD 目标检测算法,基于 C 实现。 项目效果 项目细节 > 具体参见项目 README.md (1) 安装 Caffe SSD(2) 执行训练 sh examples/Hardhat/SSD300/train_SSD300.sh (3) 部署算法 项目获取 h…

vitepress系列-05-其他优化设置

其他优化设置 设置底部上一页和下一页 设置: import { defineConfig } from vitepress// https://vitepress.dev/reference/site-config export default defineConfig({lang: en-US,title: "东东爱编码的技术博客",description: "记录日常学习点点…

IO流

一、IO概述 1.什么是IO流? 存储和读取数据的解决方案l: inputo: output流∶像水流一样传输数据 2.IO流的作用? 用于读写数据(本地文件,网络) 3.IO流按照流向可以分类哪两种流? 输出流:程序 - > 文件 输入流:文件 - > 程…

布隆过滤器详解及java实现

什么是布隆过滤器? 布隆过滤器(Bloom Filter)是一种数据结构,用于判断一个元素是否属于一个集合。它的特点是高效地判断一个元素是否可能存在于集合中,但是存在一定的误判率。 布隆过滤器的基本原理是使用一个位数组…

测试工程师求职是选自研公司还是选外包公司呢?

大家好, 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢? 今天来谈谈我的个人看法,作为一个在测试岗位上多年的我来说,自研公司比较好,外包公司其实也不会差。各自都有特点特色,根据…

MIT6.828 Lab1 Xv6 and Unix utilities

2023MIT6.828 lab-1 官方地址 一、sleep 实验内容 调用sleep(系统调用)编写用户级别程序能暂停特定时常的系统滴答程序保存在user/sleep.c 实验过程 xv6的参数传递 查看官方文档提示的文件中,多采用如下定义: int main(in…

Idea打包jar包的多种方式(解决MANIFEST.MF被覆盖的问题)

目录 生成jar文件 方式一:打包成一个总的jar文件 方式二:打包的jar文件和第三方jar文件分开 生成jar文件 打开“文件->项目结构-构建” 点击“”选择“jar->from modules ....” 弹出“从模块创建 jar” 方式一:打包成一个总的jar…

海纳斯删除广告位

找到文件 vim /var/www/html/home.php 删除代码段 <div class"adleft" id"adleftContainer"><button onclick"closeAd()">关闭</button><a href"https://www.ecoo.top/ad.html" target"_blank">&l…

JAVA—抽象—定义抽象类Converter及其子类WeightConverter

同样&#xff0c;我们由这道题引出抽象类&#xff0c;抽象方法这个概念。 按下面要求定义类Converter及其子类WeightConverter 定义抽象类&#xff1a;Converter&#xff1a; 定义一个抽象类Converter&#xff0c;表示换算器&#xff0c;其定义的如下&#xff1a; 一个私有…

海外仓的出入库流程有什么痛点?位像素海外仓系统怎么提高出入库效率?

随着跨境电商的蓬勃发展&#xff0c;海外仓是其中不可或缺的一个关键环节。而货物的出库与入库则是海外仓管理中的一个核心业务流程&#xff0c;它的运作效率直接影响到整个跨境物流的效率和客户体验。今天&#xff0c;让我们具体来看一看关于海外仓出入库的流程&#xff0c;其…

JVM内存性能调优思路之:通过GC log、Thread Dump 、Heap Dump分析内存使用说明

文章目录 一. 各日志概述1. Garbage Collection Log - 找到GC规律2. 线程转储(Thread dump) - 分析&#xff08;快照&#xff09;线程状态3. 堆转储(Heap dump) - APP某刻内存使用全貌 二. 命令1. 程序的gc日志2. 线程转储3. 堆转储 概述 在 Java 虚拟机中&#xff0c;(GC) Gar…

C++ 类和对象(初篇)

类的引入 C语言中&#xff0c;结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 而为了区分C和C我们将结构体重新命名成class去定义 类的定义 标准格式&#xff1a; class className {// 类体&#xff1a;由成员函…

【计算机毕业设计】计算机考试系统设计——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天&#xff0c;遥遥领先&#xff01; 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

【NLP】关于BERT模型的一些认知

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型是由Google在2018年提出的预训练Transformer模型&#xff0c;用于自然语言处理任务。 一. BERT模型的架构 1.1 输入表示 / Encoder模块 BERT中的Encoder模块是由三种Embedding&…

GD32F470_ DS18B20温度传感器模块移植

DS18B20温度传感器 DS18B20数字温度传感器提供9位至12位精度的温度测量&#xff0c;并具有非易失性用户可编程上下触发点报警功能。DS18B20通过单总线通信&#xff0c;根据定义&#xff0c;只需要一条数据线(和地线)即可与单片机通信。此外&#xff0c;DS18B20可以直接从数据线…

vue2开发好还是vue3开发好vue3.0开发路线

Vue 2和Vue 3都是流行的前端框架&#xff0c;它们各自有一些特点和优势。选择Vue 2还是Vue 3进行开发&#xff0c;主要取决于你的项目需求、团队的技术栈、以及对新特性的需求等因素。以下是一些关于Vue 2和Vue 3的比较&#xff0c;帮助你做出决策&#xff1a; Vue 2&#xff1…

docker安装nacos,单例模式(standalone),使用mysql数据库

文章目录 前言安装创建文件夹"假装"安装一下nacos拷贝文件夹删除“假装”安装的nacos容器生成nacos所需的mysql表获取mysql-schema.sql文件创建一个mysql的schema 重新生成新的nacos容器 制作docker-compose.yaml文件查看网站 前言 此处有本人写得简易版本安装&…