一直觉得“数据融合”这个翻译有点怪,不过也想不到更好的代替
这方面的资料也是多如牛毛,最常见的三种模型是NNDF,PDAF和JPDAF。当然MHT也属于这个范畴,不过MHT同时解决了跟踪的问题(初始化,终止等判断)
现有的一些资料(包括两份代码)好像关键公式都有细微但致命的区别,所以想找最原始的资料。
这份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
先运行Generate2DTrajectories 生成一个轨迹,利用返回值得到返回矩阵的大小,扩展成18个随机轨迹矩阵
随机选取其中6个,再运行Generate2DTrajectories 替换成真实轨迹
所有数据再加上随机噪声干扰 Par.Nv = 0.005
从代码看,运动方程考虑了加速度,但状态模型只包含了位置和速度,所以加速度的影响转化到过程噪声协方差矩阵Q中
参考 the wikipedia example on one dimensional position and velocity
根据事先设置的滤波器数目,把跟踪器的起始位置均匀的分布到【0,1】检测平面上。用到了meshgrid
所有初始状态都设为Par.State_FisrtInit
其中ObservInd 是指观测变量在状态模型中的序号,对例子中[X位置 X速度 Y位置 Y速度 ]而言,ObservInd就是[1 3]
下面开始时间片循环
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)