当前位置: 首页 > 工具软件 > DataFusion > 使用案例 >

数据融合算法(data fusion)

阎作人
2023-12-01

1. 前言

一直觉得“数据融合”这个翻译有点怪,不过也想不到更好的代替


这方面的资料也是多如牛毛,最常见的三种模型是NNDF,PDAF和JPDAF。当然MHT也属于这个范畴,不过MHT同时解决了跟踪的问题(初始化,终止等判断)


2. 资料

现有的一些资料(包括两份代码)好像关键公式都有细微但致命的区别,所以想找最原始的资料。

Adaptive nonlinear filtering for tracking with measurements of uncertain origin, Y. Bar-Shalom, 1972

下不到啊。。。

找到这些,等真要具体实现了再去慢慢比较/推敲吧

Sonar tracking of multiple targets using joint probabilistic data association

Fortmann, Thomas E.  ; Bolt Beranek and Newman, Inc., Cambridge, MA, USA ;  Bar-Shalom, Y.  ;  Scheffe, M.
1983


Joint Probabilistic Data Association for Multitarget Tracking with Possibly Unresolved Measurements and Maneuvers
KUO-CHU CHANG, STUDENT MEMBER, IEEE, AND YAAKOV BAR-SHALOM, FELLOW, IEEE, 1984

 Probabilistic Data Association Techniques for Target Tracking in Clutter
THIAGALINGAM KIRUBARAJAN, SENIOR MEMBER, IEEE, AND
YAAKOV BAR-SHALOM, FELLOW, IEEE
2004

A Review of Statistical Data Association Techniques for Motion Correspondence (1993)

by Ingemar J. Cox



Handbook of Multisensor Data Fusion (Liggins, Hall, Llinas), also co-written by Bar-Shalom


3. 源代码解读

3.1 Probabilistic Data Association Filters (PDAF) - a tracking demo


这份MATLAB code结构清楚,逻辑清晰,注释也详细。

  • 概述

在这个例子中,真正的轨迹叫做Trajectory,一共6个,参数:Par.TrajIndex

观测到的数据点一共有18个,包括真实轨迹(6)和观测噪声(12)。参数:Par.PointNum

一共用到了12个Kalman 滤波器。注意这个12和上面的12个观测噪声没有关系!! 参数:Par.TrackNum

整个检测空间分布在一个正方形二维平面上,X,Y都限制在【0,1】范围内

  • 真实轨迹

原程序中一共可以生成12种不同的轨迹。 [12 11 8 8 8 1]

1: circle

2: jump in x

3: spiral

4: 8

5: exp

6: triang

9 & 11: straight line from left upper to right lower, with different moving ranges

10 & 12: straight line from left lower to right high corners, with different moving ranges


生成数据 function AllTheData = Structure_PDAF_Init_Data(Par)

先运行Generate2DTrajectories 生成一个轨迹,利用返回值得到返回矩阵的大小,扩展成18个随机轨迹矩阵

随机选取其中6个,再运行Generate2DTrajectories 替换成真实轨迹

所有数据再加上随机噪声干扰 Par.Nv = 0.005


产生卡尔曼跟踪器(12个)function TrackList = Structure_PDAF_Init_Track(Par)

从代码看,运动方程考虑了加速度,但状态模型只包含了位置和速度,所以加速度的影响转化到过程噪声协方差矩阵Q中

参考 the wikipedia example on one dimensional position and velocity

根据事先设置的滤波器数目,把跟踪器的起始位置均匀的分布到【0,1】检测平面上。用到了meshgrid

所有初始状态都设为Par.State_FisrtInit

其中ObservInd 是指观测变量在状态模型中的序号,对例子中[X位置 X速度 Y位置 Y速度 ]而言,ObservInd就是[1 3]



下面开始时间片循环

计算验证门限(validation gate)和联合(association)

function TrackList = Structure_PDAF_Association(TrackList,DataList,Par)

确认当前观测数据的数值有效(没有NAN的情况)

计算每个跟踪器下一步预测值,根据门限(Par.GateLevel       = 9;    % - 98.9 percent)和上一步得到的数值有效的观测值,得到有效观测值

有效观测值的序号保存在TrackObj.DataInd中。比如对第一个跟踪器,在k=10时刻,落在validation gate内的观测值可以是[3 5 18]三个。


跟踪器主要状态跟新

function TrackList = Structure_PDAF_Track_Update(TrackList,DataList,Par)

没太看懂。。。

首先,Kalman更新,是用x坐标值去更新y坐标值??

% make prediction
    xpred   = F*x;
    Ppred   = F*P*F' + Q;
    
    ypred   = H*xpred;
    S       = H*Ppred*H' + R;
    Sinv    = inv(S);


然后,最最关键的落在门限内的多个观测变量的概率计算没有找到。只有一个直接套用公式的代码,好像很简单的样子。。。。


跟踪器分离

function TrackList = Structure_PDAF_Track_Separation(TrackList,DataList,Par)


产生新的跟踪

function TrackList = Structure_PDAF_Track_Start(TrackList,DataList,Par)

找出这一轮经过Association之后还没有关联的观测数据序号和还未有效定义状态的跟踪器(状态为State_Undefined)

如果没使用的track比未关联的观测数据多,则

如果数据比track多,那么就利用这些数据来初始化新的Kalman滤波器(比如k=1时往往出现18个未关联数据和12个未使用的track--除非随机产生的观测数据正好落在均匀分配的Kalman 滤波器附近--这时就直接用前12个数据来初始化tracks)




 类似资料: