赞
踩
前一篇文章讲了,Apollo 6.0 中融合的代码逻辑流程,但那是基于软件的角度进行梳理和分析的,这一篇文章基于上篇的成果进一步对算法进行更详细的分析,因为代码量奇大,所以本文重点讨论数据关联的一些细节。
为保持文章内容由浅入深,先做一些基础的概念介绍。
数据融合最常见的算法是卡尔曼滤波及其变种。
卡尔曼滤波是一个多次迭代的算法,一个周期内的工作如图所示:
一个目标初始状态,经过 T 时间后,调用 Predict() 方法,初始状态会移植到预测状态,一般 Predict() 方法都是基于特定运动公式进行计算的,比如手机上的 GPS,5s 更新一次 GPS 位置,但 5s 颗粒度太粗了,就将 1s 切分成 10 段,每一段 100ms 自己调用公式推断一次位置,这就是 Predict 过程。
大家会发现问题,这样的结果虽然凑合着可用,但毕竟是理论上推断出来的,不会怎么靠谱。
那就需要一个靠谱的东西,将结果及时纠偏。
比如,你每隔 100ms 自行推断的位置,我每隔 5s 收到 GPS 数据时,用这个数据来更新数据。
这就涉及到融合的过程了,这一过程称为 Update 或者是 Measure,融合可以简单理解为加权,就是一个比例,相信历史数据多一些还是相信检测到的数据多一些。
然后,融合得到的值传递给下一周期的状态值,这样一轮一轮进行下去。
讲完滤波算法,讲讲单目标跟踪和多目标跟踪的区别。
多目标比单目标难。
假设,车辆前方只有一个目标需要跟踪,比如 ACC 功能。
蓝色正方形是融合系统每次推断的结果值。
橙色三角形是每次传感器检测到的结果。
绿色圆形则是融合的数据。
这是单个目标跟踪,基本上是 1 对 1 的关系,也就是一个目标状态值对应一个观测值。
当然,也许传感器有杂波可能产生多个观测值,但我们同样可以通过算法进行筛选或者做加权融合最终得到一个观测值,总之在单目标跟踪中观测值和状态值一般是 1 对 1 的。
再来看多目标跟踪问题。
紫色正方形是另外一个目标的状态值,大家很容易发现问题。
上图标记红色问题的地方会存在一个困惑,那个橙色三角形代表的观测数据究竟属于哪个目标真实的检测信号呢?
因为传感器本身也存在抖动,所以,你不能简单说左边,因为左边更近吧?
这涉及到一个多目标匹配的问题,需要靠谱的数据关联(data associate)技术解决。
目标跟踪领域,一般用 Track 来代表一个被稳定跟踪的对象,
但 Track 是有生命周期状态变换的。
上面这张图已经跟踪清晰了,对应到代码中其实就是 3 个:
讲了目标的状态后,我们需要解决一个问题:
将检测信号和正确的 Track 进行匹配。
在代码中如何表示新检测的目标和历史 Track 的关系呢?
比如,上图中左侧代表 Tracks,右侧代表新检测到的 Objects。
两个节点之间有连线,说明这个object 和对应的 Track 可能是同一个对象,线段上可以保存距离值,如果没有连接,距离值就为 -1。
但大家可以看到,会出现一些多对多的情况,这个时候就需要我们用一个矩阵将objects和tracks之间的距离值保存下来。
比如,上图的关系完全可以用一个 4x5 的数组来表示ÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。