说起自动驾驶感知系统,大家都会谈论到感知融合,这涉及到不同传感器数据在时间、空间的对齐和融合,最终的结果将提升自动驾驶系统的感知能力,因为我们都知道单一的传感器都是有缺陷的。本篇文章梳理 Apollo 6.0 中的感知数据融合基本流程。
感知架构
文章开始前,还是需要先看一看 Apollo 中感知的整体架构。
它有这么多传感器。
那感知融合,最终要融合什么呢?
Apollo 的感知系统的结果要以分为 2 个大类:
- 障碍物检测(车、行人或者其它交通要素)
- 红绿灯检测
借助于激光雷达和深度学习,Apollo 的感知模块能够输出障碍物的 3D 信息。
Fusion 流程
1. Fusion 模块在哪里启动?
之前说过 Apollo 的组件是在 CyberRT 的框架中运行,关键概念是 Component。
Perception 是一个大的 Component,它包含了很多子 Component,而数据融合作为一个子 Component 存在。
这个是在
modules/perception/production/dag/dag_streaming_perception.dag
中定义的。
所以,我们需要去找 FusionComponent。
并且,我们知道了它的配置在 fusion_component_conf.pb.txt 中。
能够得到以下信息:
- 融合方法:ProbabilisticFusion
- 主要参与融合的传感器:Lidar 和 2 个焦距不一样的 Camera
- 融合结果存放到 obstacles 当中。
2. FusionComponent 的初始化
Fusion Component 的地址是这个:
modules/perception/onboard/component/fusion_component.cc
Init 方法也没有几行代码
第一步,加载 config 参数,文章前面刚已经张贴了。
对于融合方法、传感器名称都是直接用 std::string 类型保存。
我们需要关心代码后面部分的 InitAlgorithmPlugin() 方法,这个是用来初始化 Component 涉及的算法的。