(转)Apollo 2.0 框架及源码分析(三) | 感知模块 | Radar Fusion

2023-11-23 00:08

本文主要是介绍(转)Apollo 2.0 框架及源码分析(三) | 感知模块 | Radar Fusion,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://zhuanlan.zhihu.com/p/33852112

preview

文章提到了几个点:

一、雷达radar部分:

Apollo 2.0 的坐标体系是以 Lidar 为基准的。Apollo 可能认为 Velodyne 的位置是最准确的,因此 Camera 的位置标定参考 Velodyne, Radar 的标定参考 Camera。

阿波罗的感知几乎都依赖高精地图预先做ROI处理,以减少传感器数据处理的计算量浪费。

radar部分的代码,用到了一些方法来判断radar返回的对象是不是背景杂波。

Apollo 推荐使用的毫米波为Continental 的 ARS 408-21。ARS 408-21的介绍文档里也有简单提到,它可以对障碍物进行分类。但可靠性未知。该radar能追踪120个objects:大陆的Radar能够detect到超过120个object(没有进行过fusion的只有一点的cluster single point cluster)。 这种量产的Radar一般自带简单的detection和tracking算法。所以raw_object会有id,一般自带的算法会有 id, heading, velocity,object size, distance这些信息。在实际的测试过程中,该ID号是不能够作为跟踪关联的依据的,因为ID号在障碍物交叉的时候会出错。因此还应该再做一次关联!

preview

二、融合部分(radar 和 lidar):

object-level 的数据融合,该部分的输入为各传感器处理后的得到的object。

preview

 

多源信息的数据融合中,根据数据抽象层次,融合可分为三个级别:

  • 数据级融合 传感器裸数据融合,精度高、实时性差,要求传感器是同类的
  • 特征级融合 融合传感器抽象的特征向量(速度,方向等),数据量小、损失部分信息
  • 决策级融合 传感器自身先做出决策,融合决策结果,精度低、通信量小、抗干扰强

Apollo 应该是在特征层面对 objects 进行了融合。每当节点收到新的一帧数据的时候,融合部分就被调用。融合部分的输入为 SensorObjects, 输出为融合后的 object, 其大体的流程如下图所示。

preview

传感器的数据融合有两部分内容比较重要,即 数据关联 和 动态预估

数据关联用的是基于几何距离的HM匈牙利算法。

动态预估用的是:使用了非简化的估计误差协方差矩阵 \mathbf {P} _{k|k} 更新公式:

  • 标准卡尔曼滤波:{\displaystyle \mathbf {P} _{k|k}=(\mathbf{I-\mathbf {K} _{k}\mathbf {H} _{k}})\mathbf {P} _{k|k-1}}
  • Apollo:{\displaystyle \mathbf {P} _{k|k}=(\mathbf{I-\mathbf {K} _{k}\mathbf {H} _{k}})\mathbf {P} _{k|k-1}}(\mathbf{I-\mathbf {K} _{k}\mathbf {H} _{k}})^{\mathbf{T}}+ \mathbf{K}_{k}\mathbf{R}_{k}\mathbf {K} _{k}^{\mathrm {T}}

结合 Wikipedia 上关于卡尔曼滤波的介绍,我先总结下该问题的背景:

  1. Apollo 使用的估计误差协方差矩阵 \mathbf {P} _{k|k} 的更新公式是所谓的 Joseph form,而标准卡尔曼滤波通常使用的是简化版的更新公式
  2. 简化版的更新公式计算量小,实践中应用广,但只在 卡尔曼增益为最优 时有效
  3. 必须使用 Joseph form 的两种情况:
  • 使用了非最优卡尔曼增益
  • 算法精度过低,造成了数值稳定性相关的问题

阿波罗平台的计算力强大,因此为了算法精度,选择了非简化的P

 

 

三、总结:

preview

 

这篇关于(转)Apollo 2.0 框架及源码分析(三) | 感知模块 | Radar Fusion的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/413892

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python中的Walrus运算符分析示例详解

《Python中的Walrus运算符分析示例详解》Python中的Walrus运算符(:=)是Python3.8引入的一个新特性,允许在表达式中同时赋值和返回值,它的核心作用是减少重复计算,提升代码简... 目录1. 在循环中避免重复计算2. 在条件判断中同时赋值变量3. 在列表推导式或字典推导式中简化逻辑

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo