IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> # 粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波) -> 正文阅读

[人工智能]# 粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波)

粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波)

对于该博客跟踪代码以及问题探讨可以联系:WX:ZB823618313
对于其他跟踪定位问题的代码及探讨也可以联系

原创不易,路过的各位大佬请点个赞

一、问题描述(离散时间非线性系统描述)

考虑一般非线性系统模型,
x k = f ( x k ? 1 , w k ? 1 ) z k = h ( x k , v k ) (1) x_k=f(x_{k-1},w_{k-1}) \\ z_k=h(x_k,v_k ) \tag{1} xk?=f(xk?1?,wk?1?)zk?=h(xk?,vk?)(1)
其中 x k x_k xk? k k k时刻的目标状态向量。 z k z_k zk? k k k时刻量测向量(传感器数据)。这里不考虑控制器 u k u_k uk? w k {w_k} wk? v k {v_k} vk?分别是过程噪声序列和量测噪声序列,并假设 w k w_k wk? v k v_k vk?为零均值高斯白噪声,其方差分别为 Q k Q_k Qk? R k R_k Rk?的高斯白噪声,即 w k ~ ( 0 , Q k ) w_k\sim(0,Q_k) wk?(0,Qk?), v k ~ ( 0 , R k ) v_k\sim(0,R_k) vk?(0,Rk?),且满足如下关系(线性高斯假设)为:
E [ w i v j ′ ] = 0 E [ w i w j ′ ] = 0 i ≠ j E [ v i v j ′ ] = 0 i ≠ j \begin{aligned} E[w_iv_j'] &=0\\ E[w_iw_j'] &=0\quad i\neq j \\ E[v_iv_j'] &=0\quad i\neq j \end{aligned} E[wi?vj?]E[wi?wj?]E[vi?vj?]?=0=0i?=j=0i?=j?

二、贝叶斯滤波

定义 1 1 1 ~ k k k时刻对状态 x k x_k xk?的所有测量数据为
z k = [ z 1 T , z 2 T , ? ? , z k T ] T z^k=[z_1^T,z_2^T,\cdots,z_k^T]^T zk=[z1T?,z2T?,?,zkT?]T

贝叶斯滤波问题就是计算对 k k k时刻状态 x x x估计的置信程度,为此构造概率密度函数 p ( x k ∣ z k ) p(x_k |z^k) p(xk?zk),在给定初始分布 p ( x 0 ∣ z 0 ) = p ( x 0 ) p(x_0|z_0)= p(x_0) p(x0?z0?)=p(x0?)后,从理论上看,可以通过预测和更新两个步骤递推得到概率密度函数 p ( x k ∣ z k ) p(x_k |z^k) p(xk?zk)的值。

是不是卡尔曼滤波的雏形出现了,哈哈哈,预测、更新也存在KF中。

2.1、 预测

现假定 k ? 1 k- 1 k?1时刻的概率密度函数已知,则通过将Chapman-Kolmogorov等式应用
于动态方程(1),即可预测 k k k时刻状态的先验概率密度函数为
p ( x k ∣ z k ? 1 ) = ∫ p ( x k ∣ x k ? 1 ) p ( k ? 1 ∣ z k ? 1 ) d x k ? 1 ) (2) p(x_k |z^{k-1})=\int p(x_k |x_{k-1})p({k-1} |z^{k-1}) dx_{k-1}) \tag{2} p(xk?zk?1)=p(xk?xk?1?)p(k?1zk?1)dxk?1?)(2)

实际上,状态转移方程写为概率密度的形式即为: x k = f ( x k ? 1 , w k ? 1 ) = 等价 p ( x k ∣ x k ? 1 ) x_k=f(x_{k-1},w_{k-1}) \underset{\text{等价}}= p(x_k |x_{k-1}) xk?=f(xk?1?,wk?1?)等价=?p(xk?xk?1?)
式(2)中隐含假定了 p ( x k ∣ x k ? 1 ) = p ( x k ∣ x k ? 1 , z k ? 1 ) p(x_k |x_{k-1})= p(x_k |x_{k-1}, z^{k-1}) p(xk?xk?1?)=p(xk?xk?1?,zk?1),实际上这本身在这里就是成立的,基于(1)式的马尔可夫过程。

2.2、 更新

在获得 p ( x k ∣ z k ? 1 ) p(x_k |z^{k-1}) p(xk?zk?1)的基础上,结合 k k k时刻得到的新的量测值,基于贝叶斯公式,可以计算 k k k时刻状态的后验概率密度函数:
p ( x k ∣ z k ) = p ( z k ∣ x k ) p ( x k ∣ z k ? 1 ) p ( z k ∣ z k ? 1 ) (3) p(x_k |z^{k})=\frac{p(z_k |x_k)p(x_k |z^{k-1})}{p(z_k |z^{k-1})} \tag{3} p(xk?zk)=p(zk?zk?1)p(zk?xk?)p(xk?zk?1)?(3)
式中分子 p ( z k ∣ z k ? 1 ) p(z_k |z^{k-1}) p(zk?zk?1)有全概率公式得到
p ( z k ∣ z k ? 1 ) = ∫ p ( z k ∣ x k ) p ( x k ∣ z k ? 1 ) d x k (4) p(z_k |z^{k-1})=\int p(z_k |x_k)p(x_k |z^{k-1}) dx_{k} \tag{4} p(zk?zk?1)=p(zk?xk?)p(xk?zk?1)dxk?(4)

我就说吧,上述过程实际上贝叶斯后燕推断的公式,哈哈哈哈啊哈

实际上这也是卡尔曼滤波的更新思想:在 k k k时刻得到测量 z k z_k zk?后,利用测量 z k z_k zk?修正先验概率,进而获得当前时刻状态的后验概率。我正是太机智了,哈哈啊哈

三、粒子滤波 PF(贝叶斯滤波的MC实现)

粒子滤波实际上是递推贝叶斯滤波的蒙特卡洛实现的一种算法,即一种近似的贝叶斯滤波。

核心思想:是使用一组具有相应权值的随机样本(粒子)来表示状态的后验分布。该方法的基本思路是选取一个重要性概率密度并从中进行随机抽样,得到一些带有相应权值的随机样本后,在状态观测的基础上调节权值的大小。和粒子的位置,再使用这些样本来逼近状态后验分布,最后将这组样本的加权求和作为状态的估计值。粒子滤波不受系统模型的线性和高斯假设约束,采用样本形式而不是函数形式对状态概率密度进行描述,使其不需要对状态变量的概率分布进行过多的约束,因而在非线性非高斯动态系统中广泛应用。尽管如此,粒子滤波目前仍存在计算量过大、粒子退化等关键问题亟待突破。

通常情况下选择先验分布作为重要性密度函数、即
q ( x k ∣ x k ? 1 ( i ) , z k ) = p ( x k ∣ x k ? 1 ( i ) ) q(x_k |x_{k-1}^{(i)}, z_{k})=p(x_k |x_{k-1}^{(i)}) q(xk?xk?1(i)?,zk?)=p(xk?xk?1(i)?)
对该函数取重要性权值为
w k ( i ) = w k ? 1 ( i ) p ( z k ∣ x k ( i ) ) w_k^{(i)}=w_{k-1}^{(i)}p(z_k |x_{k}^{(i)}) wk(i)?=wk?1(i)?p(zk?xk(i)?)
同样 w k ( i ) w_k^{(i)} wk(i)?需要归一化得到 w ~ k ( i ) \tilde{w}_k^{(i)} w~k(i)?

标准的粒子滤波算法步骤为:

粒子滤波PF:
Step 1: 根据 p ( x 0 ) p(x_{0}) p(x0?)采样得到 N N N个粒子 x 0 ( i ) ~ p ( x 0 ) x_0^{(i)} \sim p(x_{0}) x0(i)?p(x0?)
For i = 2 : N i=2:N i=2:N
??Step 2: 根据状态转移函数产生新的粒子为:$ x k ( i ) ~ p ( x k ∣ x k ? 1 ( i ) ) x_k^{(i)} \sim p(x_{k} |x_{k-1}^{(i)}) xk(i)?p(xk?xk?1(i)?)
??Step 3: 计算重要性权值: w k ( i ) = w k ? 1 ( i ) p ( z k ∣ x k ( i ) ) w_k^{(i)}=w_{k-1}^{(i)}p(z_k |x_{k}^{(i)}) wk(i)?=wk?1(i)?p(zk?xk(i)?)
??Step 4: 归一化重要性权值: w ~ k ( i ) = w k ( i ) ∑ j = 1 N w k ( j ) \tilde{w}_k^{(i)}=\frac{w_k^{(i)}}{\sum_{j=1}^Nw_k^{(j)}} w~k(i)?=j=1N?wk(j)?wk(i)??
??Step 5: 使用重采样方法对粒子进行重采样(以随机重采样和系统重采样为例)
??Step 6: 得到 k k k时刻的后验状态估计:
E [ x ^ k ] = ∑ i = 1 N x k ( i ) w ~ k ( i ) E[\hat{x}_{k}]= \sum_{i=1}^Nx_{k}^{(i)}\tilde{w}_k^{(i)} E[x^k?]=i=1N?xk(i)?w~k(i)?
End For

算法:系统重采样 (systematic resampling)
For i = 1 : N i=1:N i=1:N
??Step 1: 初始化累积概率密度函数CDF: c 1 = 0 c_1=0 c1?=0
For i = 2 : N i=2:N i=2:N
??Step 2: 构造CDF: c i = c i ? 1 + w k ( i ) c_i=c_{i-1}+w_k^{(i)} ci?=ci?1?+wk(i)?
??Step 3: 从CDF的底部开始: i = 1 i=1 i=1
??Step 4: 采样起始点: u 1 = U [ 0 , 1 / N ] u_1=\mathcal{U}[0,1/N] u1?=U[0,1/N]
End For
For j = 1 : N j=1:N j=1:N
??Step 5: 沿CDF移动: u j = u 1 + ( j ? 1 ) / N u_j=u_{1}+(j-1)/N uj?=u1?+(j?1)/N
??Step 6: While u j > c i u_j>c_i uj?>ci?
?????? i = i + 1 i=i+1 i=i+1
?????End While
??Step 7: 赋值粒子: x k ( j ) = x k ( i ) x_k^{(j)}=x_k^{(i)} xk(j)?=xk(i)?
??Step 8: 赋值权值: w k ( j ) = 1 / N w_k^{(j)}=1/N wk(j)?=1/N
??Step 9: 赋值父代: i ( j ) = i i^{(j)}=i i(j)=i
End For

四、仿真场景:三维雷达目标跟踪

4.1 仿真场景(三维匀速目标)

目标模型
考虑一各三维的匀速运动目标(CV 模型):
x k + 1 = F k x k + G k w k x_{k+1}=F_kx_k+G _kw_k xk+1?=Fk?xk?+Gk?wk?
其中状态向量 x k = [ x k , x ˙ k , y k , y ˙ k , z k , z ˙ k ] ′ x_k=[x_k,\dot{x}_k,y_k,\dot{y}_k,z_k,\dot{z}_k]' xk?=[xk?,x˙k?,yk?,y˙?k?,zk?,z˙k?];噪声为 w k = [ w x , w y , w z ] ′ w_k=[w_x,w_y,w_z]' wk?=[wx?,wy?,wz?];状态转移矩阵 F k F_k Fk?和噪声驱动矩阵 G k G_k Gk?如下
F k = [ 1 T 0 0 0 0 0 1 0 0 0 0 0 0 1 T 0 0 0 0 0 1 0 0 0 0 0 0 1 T 0 0 0 0 0 1 ] Γ k = [ 1 / 2 T 2 0 0 T 0 0 0 1 / 2 T 2 0 0 T 0 0 1 / 2 T 2 0 0 T ] F_k=\begin{bmatrix}1 & T & 0 & 0 & 0 & 0\\0 & 1 & 0 & 0 & 0 & 0 \\0 & 0 & 1 & T & 0 & 0\\0 & 0 & 0 & 1 & 0 & 0\\0 & 0 & 0 & 0 & 1 & T\\0 & 0 & 0 & 0 & 0 & 1\end{bmatrix} \qquad\varGamma_k=\begin{bmatrix}1/2T^2 & 0 & 0 \\T & 0 & 0 \\0 & 1/2T^2 & 0 \\0 & T & \\0 & 0 & 1/2T^2 \\0 & 0 & T\end{bmatrix} Fk?=?????????100000?T10000?001000?00T100?000010?0000T1??????????Γk?=?????????1/2T2T0000?001/2T2T00?0001/2T2T??????????
采样时间 T = 1 s T=1s T=1s. 初始状态为 x 0 ~ ( x ˉ 0 , P 0 ) x ˉ 0 = [ 1 km , 20 m/s , 1 km , 20 m/s , 1 km , 20 m/s ] ′ P 0 = diag ( 1 0 5 m 2 , 1 0 2 m 2 / s 2 , 1 0 5 m 2 , 1 0 2 m 2 / s 2 , 1 0 5 m 2 , 1 0 2 m 2 / s 2 ) x_0\sim(\bar{x}_0,P_0)\\\bar{x}_{0}=[1\text{km}, 20\text{m/s} ,1\text{km}, 20\text{m/s} ,1\text{km}, 20\text{m/s}]'\\P_{0}=\text{diag}(10^5\text{m}^2, 10^2\text{m}^2/\text{s}^2, 10^5\text{m}^2, 10^2\text{m}^2/\text{s}^2, 10^5\text{m}^2, 10^2\text{m}^2/\text{s}^2) x0?(xˉ0?,P0?)xˉ0?=[1km,20m/s1km,20m/s,1km,20m/s]P0?=diag(105m2,102m2/s2,105m2,102m2/s2105m2,102m2/s2)
过程噪声均值和方差分别为 q = 10 q=10 q=10
w ˉ k = [ 0 , 0 , 0 ] ′ Q k = [ q 2 0 0 0 q 2 0 0 0 q 2 ] \bar{w}_k=[0,0, 0]'\\Q_k=\begin{bmatrix}q^2 & 0& 0 \\0 & q^2 & 0\\0&0 & q^2 \end{bmatrix} wˉk?=[000]Qk?=???q200?0q20?00q2????

如果为非线性目标,则将状态转移矩阵 F k F_k Fk?代替为雅可比矩阵即可。为了不是一般性这里采用线性模型进行仿真。主要处理目标跟踪,雷达量测存在的非线性滤波问题。

雷达量测模型
在三维情况下,雷达量测为距离和角度
r k m = r k + r ~ k b k m = b k + b ~ k e k m = e k + e ~ k {r}_k^m=r_k+\tilde{r}_k\\ b^m_k=b_k+\tilde{b}_k\\ e^m_k=e_k+\tilde{e}_k rkm?=rk?+r~k?bkm?=bk?+b~k?ekm?=ek?+e~k?
其中
r k = ( x k ? x 0 ) + ( y k ? y 0 ) 2 ) b k = tan ? ? 1 y k ? y 0 x k ? x 0 e k = tan ? ? 1 z k ? z 0 ( x k ? x 0 ) 2 + ( y k ? y 0 ) 2 r_k=\sqrt{(x_k-x_0)^+(y_k-y_0)^2)}\\ b_k=\tan^{-1}{\frac{y_k-y_0}{x_k-x_0}}\\ e_k=\tan^{-1}{\frac{z_k-z_0}{\sqrt{(x_k-x_0)^2+(y_k-y_0)^2}}}\\ rk?=(xk??x0?)+(yk??y0?)2) ?bk?=tan?1xk??x0?yk??y0??ek?=tan?1(xk??x0?)2+(yk??y0?)2 ?zk??z0??
[ x 0 , y 0 , z 0 ] [x_0,y_0,z_0] [x0?,y0?,z0?]为雷达坐标,一般情况为0。雷达量测为 z k = [ r k , b k , e k ] ′ z_k=[r_k,b_k,e_k]' zk?=[rk?,bk?,ek?]。雷达量测方差为
R k = cov ( v k ) = [ σ r 2 0 0 0 σ b 2 0 0 0 σ e 2 ] R_k=\text{cov}(v_k)=\begin{bmatrix}\sigma_r^2 & 0 &0\\0 & \sigma_b^2 &0\\0&0& \sigma_e^2 \end{bmatrix} Rk?=cov(vk?)=???σr2?00?0σb2?0?00σe2????? σ r = 20 m \sigma_r=20m σr?=20m σ b = 20 m r a d \sigma_b=20mrad σb?=20mrad, σ e = 15 m r a d \sigma_e=15mrad σe?=15mrad

4.2 跟踪轨迹

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3 跟踪误差

在这里插入图片描述
在这里插入图片描述

五、部分代码

对于该博客跟踪代码以及问题探讨可以联系:WX:ZB823618313
对于其他跟踪定位问题的代码及探讨也可以联系

5.1、主函数部分代码

clear all; close all; clc;
%% initial parameter
n=6; %状态维数 ;
T=1; %采样时间
M=1; %雷达数目
N=100; %运行总时刻
MC=10; %蒙特卡洛次数
global N_pf
N_pf=5000;% 采样点数PF
chan=1; %滤波器通道,这里只有一个滤波器
w_mu=[0,0,0]';% mean of process noise 
v_mu=[0,0,0]';% mean of measurement noise
%% target model
%covariance of process noise
q=10; %m/s^2
Qk=q^2*eye(3); 
% state matrix
% CV
Fk=[1,T,0,0,0,0;
      0,1,0,0,0,0;
      0,0,1,T,0,0;
      0,0,0,1,0,0;
      0,0,0,0,1,T;
      0,0,0,0,0,1 ];

Gk=[  T^2/2,    0,    0;
          T,    0,    0;
          0,T^2/2,    0;
          0,    T,    0;
          0,    0,T^2/2;
          0,    0,    T ];
%量测模型
sigma_r(1)=20;  sigma_b(1)=20e-3; sigma_e(1)=15e-3; % covariance of measurement noise (radar)
% sigma_r=300; sigma_b=200e-3; sigma_e=100e-3;
Rk=diag([sigma_r(1)^2, sigma_b(1)^2,sigma_e(1)^2]);
xp=[0,0,0,0,0,0];%雷达位置
%% 定义存储空间
sV=zeros(n,N,MC); % 状态
eV=zeros(n,N,MC,chan); %估计
PV=zeros(n,n,N,MC,chan);%协方差
rV=zeros(3,N,MC,M); % %量测
for i=1:MC
    sprintf('rate of process:%3.1f%%',(2*i)/(4*MC)*100)
    % 初始状态的均值和方差
    x=[1000,500,1000,0,100,100]';
    P_0=diag([1e4,10^2,1e4,10^2, 1e4,10^2]); 
    x=[1000,80,1000,50,100,10]';
    P_0=diag([1e5,10^2,1e5,10^2, 1e5,10^2]); 
%     x=[100,50,100,50,100,50]';
%     P_0=diag([5e5,1e3,5e5,1e3,5e5,1e3]); %initial covariance
    xk_EKF=x;    Pk_EKF=P_0;   % P0|0 x0|0 
    xk_pf=x;     Pk_pf=P_0;   % P0|0 x0|0 
    %产生N个粒子
    for ii = 1 : N_pf
        xpart(:,ii) = x+ sqrtm(P_0) * randn(6,1);
    end

5.2、PF部分代码

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%函数功能:实现随机重采样算法
%输入参数:weight为原始数据对应的权重大小
%输出参数:outIndex是根据weight对inIndex筛选和复制结果
function outIndex=randomR(weight)
%获得数据的长度
L=length(weight);
%初始化输出索引向量,长度与输入索引向量相等
outIndex=zeros(1,L);
%第一步:产生[0,1]上均匀分布的随机数组,并升序排序
u=unifrnd(0,1,1,L);
u=sort(u);
%u=(1:L)/L%这个是完全均匀
%第二步:计算粒子权重积累函数cdf
cdf=cumsum(weight);
%第三步:核心计算
i=1;
for j=1:L
	%此处的基本原理是:u是均匀的,必然是权值大的地方
	%有更多的随机数落入该区间,因此会被多次复制
	while(i<=L)&(u(i)<=cdf(j))
		%复制权值大的粒子
		outIndex(i)=j;
		%继续考察下一个随机数,看它落在哪个区间
		i=i+1;
	end
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 系统重采样子函数
% 输入参数:weight为原始数据对应的权重大小
% 输出参数:outIndex是根据weight筛选和复制结果
function outIndex = systematicR(weight);
N=length(weight);
N_children=zeros(1,N);
label=zeros(1,N);
label=1:1:N;
s=1/N;
auxw=0;
auxl=0;
li=0;
T=s*rand(1);
j=1;
Q=0;
i=0;
u=rand(1,N);
while (T<1)
    if (Q>T)
        T=T+s;
        N_children(1,li)=N_children(1,li)+1;
    else
        i=fix((N-j+1)*u(1,j))+j;
        auxw=weight(1,i);
        li=label(1,i);
        Q=Q+auxw;
        weight(1,i)=weight(1,j);
        label(1,i)=label(1,j);
        j=j+1;
    end
end
index=1;
for i=1:N
    if (N_children(1,i)>0)
        for j=index:index+N_children(1,i)-1
            outIndex(j) = i;
        end;
    end;
    index= index+N_children(1,i);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-25 18:06:59  更:2022-06-25 18:08:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 2:21:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码