粒子滤波原理和MATLAB代码实现

粒子滤波(Particle filter)matlab实现 粒子滤波是以贝叶斯推理和重要性采样为基本框架的。因此,想要掌握粒子滤波,对于上述两个基本内容必须有一个初步的了解。贝叶斯公式非常perfect,但是在实际问题中,由于变量维数很高,被积函数很难积分,常常会给粒子滤波带来很大的麻烦。为了克服这个问题,它引入了重要性采样。即先设计一个重要性密度,根据重要性密度与实际分布之间的关系,给采样得到的粒子分配权重。再利用时变贝叶斯公式,给出粒子权重的更新公式及 阅读详情

理论基础1:

(a) Prediction

  • Use the transition equation to propagate the particles:

在这里插入图片描述

(b) Update

  • Use the measurement equation to obtain measurements of the propagated particles and their standard deviations:

在这里插入图片描述

(in the case of our program, ym is obtained via simulation of the system, in real-time applications this value could be just the average of measurements).

  • Evaluate the measurement PDF at the propagated particles. Then, normalize to obtain the weights. For instance:

在这里插入图片描述

(the weights have been denoted as pq(n) in the program)

  • Resampling. Obtain new p ‾ x ( n + 1 ) \overline{p}x(n + 1) p​x(n+1) from a p ‾ x ( n + 1 ) a\overline{p}x (n + 1) ap​x(n+1)using the normalized weights.

Note: Several resampling methods:

1、Multinomial Resampling

%Resampling (multinomial)
acq=cumsum(pq);
mm=1;
nr=sort(rand(1,Np)); %ordered random numbers (0, 1]
for ip=1:Np
    while(acq(mm)<nr(ip))
        mm=mm+1;
    end
    aux=apx(:,mm);
    Mpx(:,ip)=aux+(sig.*rn(:,ip)); %roughening
end

2、Systematic Resampling

%Resampling (systematic)
acq=cumsum(pq);
cmb=linspace(0,1-(1/Np),Np)+(rand(1)/Np); %the "comb"
cmb(Np+1)=1;
ip=1; mm=1;
while(ip<=Np)
    if (cmb(ip)<acq(mm))
        aux=apx(:,mm);
        Spx(:,ip)=aux+(sig.*rn(:,ip)); %roughening
        ip=ip+1;
    else
    	mm=mm+1;
    end
end

3、 Stratified Resampling

%Resampling (stratified)
acq=cumsum(pq);
stf=zeros(1,Np);
nr=rand(1,Np)/Np;
j=1:Np;
stf(j)=nr(j)+((j-1)/Np); %(vectorized code)
stf(Np+1)=1;
ip=1; mm=1;
while(ip<=Np)
	if (stf(ip)<acq(mm))
        aux=apx(:,mm);
        Fpx(:,ip)=aux+(sig.*rn(:,ip)); %roughening
        ip=ip+1;
    else
        mm=mm+1;
    end
end

4、Residual Resampling

%Resampling (residual)
acq=cumsum(pq);
mm=1;
%preparation
na=floor(Np*pq); %repetition counts
NR=sum(na); %total count
Npr=Np-NR; %number of non-repeated particles
rpq=((Np*pq)-na)/Npr; %modified weights
acq=cumsum(rpq); %for the monomial part
%deterministic part
mm=1;
for j=1:Np
    for nn=1:na(j)
        Rpx(:,mm)=apx(:,j);
        mm=mm+1;
    end
end
%multinomial part:
nr=sort(rand(1,Npr)); %ordered random numbers (0, 1]
for j=1:Npr
    while(acq(mm)<nr(j))
    	mm=mm+1;
    end
    aux=apx(:,mm);
    Rpx(:,NR+j)=aux+(sig.*rn(:,j)); %roughening
end

一些比较研究表明,分层和系统重采样在滤波器估计和计算复杂度方面优于多项重采样。在残差重采样的情况下,大约一半的副本是确定的,另一半是随机的:这意味着更少的计算,但可以通过重新计算权重和算法的其他方面来补偿。部分实验证明,残差重采样的结果方差更小。

  • Roughening

为了防止样本贫化,对后验粒子进行粗化处理[21,96]。添加一个零均值噪声,其方差正比于:

在这里插入图片描述

where n is the dimension of the space, k is a tuning parameter, and the j-th element of the vector M is:

在这里插入图片描述

where xm k (j) is the j-th component of the posterior particle xm k (which is a vector).

  • Evaluate the mean of the set p ‾ x ( n + 1 ) \overline{p}x(n + 1) p​x(n+1) This is the estimated state

代码实现1:

%Particle filter example
%Radar monitoring of falling body
disp('please wait a bit');
%------------------------------------------
%Prepare for the simulation of the falling body
T=0.4; %sampling period
g=-9.81;
rho0=1.225; %air density, sea level
k=6705.6; %density vs. altitude constant
L=100; %horizontal distance radar<->object
L2=L^2;
Nf=100; %maximum number of steps
rx=zeros(3,Nf); %space for state record
tim=0:T:(Nf-1)*T; %time
%process noise
Sw=[10^5 0 0; 0 10^3 0; 0 0 10^2]; %cov
w11=sqrt(Sw(1,1)); w22=sqrt(Sw(2,2)); w33=sqrt(Sw(3,3));
w=[w11; w22; w33];
%observation noise
Sv=10^6; %cov.
v11=sqrt(Sv);
%------------------------------------------
%Prepare for filtering
%space for recording er(n), xe(n)
rer=zeros(3,Nf); rxe=zeros(3,Nf);
%------------------------------------------
%Behaviour of the system and the filter after initial state
x=[10^5; -5000; 400]; %initial state
xe=x; %initial estimation
%prepare particles
Np=1000; %number of particles
%reserve space
px=zeros(3,Np); %particles
apx=zeros(3,Np); %a priori particles
ny=zeros(1,Np); %particle measurements
vy=zeros(1,Np); %meas. dif.
pq=zeros(1,Np); %particle likelihoods
%particle generation
wnp=randn(3,Np); %noise (initial particles)
for ip=1:Np,
px(:,ip)=x+(w.*wnp(:,ip)); %initial particles
end
%system noises
wx=randn(3,Nf); %process
wy=randn(1,Nf); %output
nn=1;
while nn<Nf+1
    %estimation recording
    rxe(:,nn)=xe; %state
    rer(:,nn)=x-xe; %error
    %Simulation of the system
    %system
    rx(:,nn)=x; %state recording
    rho=rho0*exp(-x(1)/k); %air density
    d=(rho*(x(2)^2))/(2*x(3)); %drag
    rd(nn)=d; %drag recording
    %next system state
    x(1)=x(1)+(x(2)*T);
    x(2)=x(2)+((g+d)*T);
    x(3)=x(3);
    x=x+(w.*wx(:,nn)); %additive noise
    %system output
    y=sqrt(L2+(x(1)^2))+(v11*wy(nn)); %additive noise
    ym=y; %measurement
    %Particle propagation
    wp=randn(3,Np); %noise (process)
    vm=randn(1,Np); %noise (measurement)
    for ip=1:Np
        rho=rho0*exp(-px(1,ip)/k); %air density
        d=(rho*(px(2,ip)^2))/(2*px(3,ip)); %drag
        %next state
        apx(1,ip)=px(1,ip)+(px(2,ip)*T);
        apx(2,ip)=px(2,ip)+((g+d)*T);
        apx(3,ip)=px(3,ip);
        apx(:,ip)=apx(:,ip)+(w.*wp(:,ip)); %additive noise
        %measurement (for next state)
        ny(ip)=sqrt(L2+(apx(1,ip)^2))+(v11*vm(ip)); %additive noise
        vy(ip)=ym-ny(ip);
    end
    %Likelihood
    %(vectorized part)
    %scaling
    vs=max(abs(vy))/4;
    ip=1:Np;
    pq(ip)=exp(-((vy(ip)/vs).^2));
    spq=sum(pq);
    %normalization
    pq(ip)=pq(ip)/spq;
    %Prepare for roughening
    A=(max(apx')-min(apx'))';
    sig=0.2*A*Np^(-1/3);
    rn=randn(3,Np); %random numbers
    %================================
    %Resampling (systematic)
    acq=cumsum(pq);
    cmb=linspace(0,1-(1/Np),Np)+(rand(1)/Np); %the "comb"
    cmb(Np+1)=1;
    ip=1; mm=1;
    while(ip<=Np)
        if (cmb(ip)<acq(mm))
            aux=apx(:,mm);
            px(:,ip)=aux+(sig.*rn(:,ip)); %roughening
            ip=ip+1;
        else
            mm=mm+1;
        end
    end
    %=================================
    %Results
    %estimated state (the particle mean)
    xe=sum(px,2)/Np;
    nn=nn+1;
end
%------------------------------------------
%display
figure(1)
subplot(1,2,1)
plot(tim,rx(1,1:Nf),'kx'); hold on;
plot(tim,rxe(1,1:Nf),'r');
title('altitude'); xlabel('seconds')
axis([0 Nf*T 0 12*10^4]);
subplot(1,2,2)
plot(tim,rx(2,1:Nf),'kx'); hold on;
plot(tim,rxe(2,1:Nf),'r');
title('velocity'); xlabel('seconds');
axis([0 Nf*T -6000 1000]);

结果:
在这里插入图片描述

参考:


  1. Kalman Filter, Particle Filter and Other Bayesian Filters ↩︎ ↩︎

matlab粒子滤波程序,粒子滤波(Particle filter)算法简介及MATLAB实现 粒子滤波是以贝叶斯推理(点击打开链接)和重要性采样为基本框架的。因此,想要掌握粒子滤波,对于上述两个基本内容必须有一个初步的了解。重要性采样呢,其实就是根据对粒子的信任程度添加不同的权重,添加权重的规则就是:对于我们信任度高的粒子,给它们添加的权重就相对大一些;否则,就加的权重小一些。根据权重的分布形式,实际上就是它与目标的相似程度。粒子滤波的结构实际上就是加一层重要性采样思想在里面的蒙特卡罗方法... 阅读详情

相关推荐

粒子滤波的MATLAB实现

粒子滤波算法源于Montecarlo的思想,即以某事件出现的频率来指代该事件的概率。因此在滤波过程中,需要用到概率如P(x)的地方,一概对变量x采样,以大量采样的分布近似来表示P(x)。因此,采用此一思想,在滤波过程中粒子滤波可以处理任意形式的概率,而不像Kalman滤波只能处理高斯分布的概率问题。他的一大优势也在于此。 再来看对任意如下的状态方程: x(t)为t时刻状态       x(t)

当世豪杰专栏 4127

粒子滤波算法(Matlab代码实现)

1]黄国兴,杨泽铭,卢为党,彭宏,王静文.利用粒子滤波方法求解数据包络分析问题[J].计算机科学,2022,49(S1):159-164.plot(k,X,'m->',k,Xmean_pf,'r-*',k,Xmap_pf,'c--');legend('系统真实状态值','后验均值估计','最大后验概率估计');本文将数据包络优化问题的最优解的寻找过程转化为粒子滤波的系统状态估计问题,Xmap_pf(k,1)=pos(map(1));

weixin_46039719的博客 3624

粒子滤波 MATLAB 实现:目标跟踪

然后,我们将权重进行归一化处理。总结:粒子滤波是一种常用的目标跟踪算法,通过随机采样的粒子来近似目标的状态概率分布。在算法的主循环中,我们依次执行预测步骤、更新步骤和重采样步骤,最后通过计算粒子的平均值来估计目标的状态。它基于一组随机采样的粒子来近似目标的状态概率分布,并通过逐步迭代的方式来更新粒子的权重,从而实现对目标状态的估计。需要注意的是,上述代码中的状态转移函数和观测函数只是示例,实际应用中需要根据具体的问题进行定义。另外,粒子滤波的性能和效果受到参数的选择和调整的影响,需要根据具体情况进行调优。

ZgnObjectivec的博客 613

一篇博客彻底掌握:粒子滤波 particle filter (PF) 的理论及实践(matlab版)

粒子滤波 —从贝叶斯滤波到粒子滤波理论到实践 粒子滤波在目标跟踪中的应用:粒子滤波VS无迹卡尔曼滤波 粒子滤波—从贝叶斯滤波到粒子滤波理论到实践 1、问题描述 2、递推贝叶斯滤波 3、 标准的粒子滤波PF 5、粒子滤波PF的在目标跟踪应用: 5.1、 仿真参数 5.2、 跟踪轨迹和误差 6、粒子滤波PF的标准验证模型 6.1、 模型参数 6.2、 基于随机重采样粒子滤波PF 6.3、 基于多项式重采样粒子滤波PF 6.4、 基于残差重采样粒子滤波PF 6.5、 基于系统重采样粒子滤波PF 6.6、 基于系统

主要从事定位、估计、滤波、多传感器融合等研究,主要应用于雷达、红外、声纳、传感器网络等的目标(如无人驾驶、智能终端、移动机器人、传感器节点、飞机等)跟踪、定位和导航 4万+

基于粒子滤波SLAM算法的二维地图建图及成像Matlab仿真

不过需要注意的是,在实际应用中,除了粒子滤波外,还需要考虑环境的复杂性、传感器噪声等因素。权值更新则根据传感器数据来更新,具体方法为计算每个粒子在当前位置的权值,并将所有粒子的权值进行归一化处理。它利用粒子滤波方法实现对机器人当前位置的估计,同时利用概率模型建立机器人与周围环境之间的联系,从而实现地图构建。下图是本文采用KITTI数据集进行的一次二维地图建图的结果,其中白色区域表示空房间,黑色区域表示障碍物。以下是本文的MATLAB源代码,包括数据读取、系统初始化、粒子滤波定位和地图构建。

qq_39605374的博客 1311

MATLAB实现目标跟踪的粒子滤波代码详解

滤波理论是信号处理和控制系统中的核心问题,主要用于估计或预测系统的状态。其核心在于如何从含有噪声的信号中提取有效的信息。在时变和非线性系统中,传统的滤波方法如卡尔曼滤波可能难以直接应用。粒子滤波作为一种基于蒙特卡洛方法的非线性滤波器,近年来越来越受到重视。目标检测是计算机视觉中的一项核心技术,旨在确定图像或视频中物体的位置并识别它们的类别。在目标检测过程中,需要准确地定位和分类图像中的多个对象,使得在复杂场景下也能准确地检测出目标。

weixin_35815766的博客 929

粒子滤波实现MATLAB目标追踪

粒子滤波(Particle Filter)是一种基于蒙特卡罗方法的非线性滤波技术,适用于目标跟踪中的状态估计问题。:实际应用中需根据目标运动特性(如加速度模型)修改状态转移函数,并根据传感器特性(如雷达/视觉数据)调整观测似然函数。,包含位置和速度分量。

487

MATLAB粒子滤波算法实战教程三部曲

在现代信号处理和数据分析中,粒子滤波算法因其在处理非线性非高斯噪声环境下的强大能力而备受瞩目。本章节将从三个维度为您揭开粒子滤波的神秘面纱。MATLAB提供了丰富的内置函数和工具箱(Toolbox),以便用户能够更高效地完成特定任务。在粒子滤波的实现过程中,我们会用到信号处理工具箱(Signal Processing Toolbox)、统计和机器学习工具箱(Statistics and Machine Learning Toolbox)等。

weixin_33245447的博客 996

粒子滤波算法理解及实现

粒子滤波算法是一种非线性的滤波方法。 其大致思路如下(这里以图像目标(人)跟踪为例): 1、 首先在整个图像中随机初始化一些粒子点,并对每个粒子点分配权值 2、 在视频中框出待跟踪目标 3、 更新权值,增加靠近框出的目标粒子权值 4、 根据状态转移矩阵和测量数据,对粒子权重,对粒子进行重采样 粒子滤波示过程示意图 初始化图像粒子点和权重 框出待跟踪目标 更新权重,其中权重较小的直接舍弃,权值较...

Joemt 1万+

MATLAB仿真:基于粒子滤波的无人机三维航迹预测

粒子滤波是蒙特卡洛方法在动态系统状态估计中的一个应用,它通过一组随机样本(粒子)来代表概率分布,并利用这些粒子进行递归贝叶斯估计。这种方法尤其适用于处理非线性和非高斯噪声的动态系统,是现代信号处理领域的一个重要技术。MATLAB提供了一系列内置函数用于粒子滤波仿真,其中包括::生成粒子并初始化。resample:进行粒子重采样。filter:对粒子进行状态估计。使用这些函数时,需要正确设置参数。例如,当使用函数时,需要指定粒子数、状态初始范围等参数。% 粒子数量。

weixin_35649491的博客 682

粒子滤波算法matlab程序

粒子滤波算法matlab程序,文件格式为txt格式,方便复制粘贴使用,每条语句都有注释,非常适合粒子滤波方法初学者

【预测】改进粒子滤波的无人机三维航迹预测方法(Matlab代码实现)

改进粒子滤波的无人机三维航迹预测方法是一种用于无人机轨迹预测的高效技术,它结合了粒子滤波算法和其他改进策略,以提高预测准确性和鲁棒性。:通过优化粒子的重新采样策略,如重采样时的权重更新规则和采样数量,可以改善滤波器的收敛性和稳定性。改进粒子滤波的无人机三维航迹预测方法通过结合粒子滤波算法和其他改进策略,实现了对无人机轨迹的准确、鲁棒和实时预测,具有广泛的应用前景,可在航空领域和其他相关领域中得到有效应用。

2301_77414277的博客 1234

避坑指南:Livox Mid-360双雷达SLAM配置中,那些官方文档没说的细节(IP设置、话题分离与时间同步)

本文详细解析了Livox Mid-360双雷达SLAM配置中的关键优化点,包括IP设置、话题分离与时间同步等官方文档未提及的细节。通过实战案例和代码示例,帮助开发者解决点云错位、IMU数据混乱等问题,提升SLAM系统的稳定性和精度。特别针对网络架构设计、驱动修改和时间同步机制提供了专业指导。

weixin_29745609的博客 425

【EKF、EPF、UKF、PF、EPF、UPF】【改进粒子滤波算法】粒子滤波EKF、扩展粒子滤波EPF和无迹粒子滤波UPF等比较、并分析了这些算法在提高滤波精度和效率方面的优势(Matlab代码实现)

💥💥💞💞❤️❤️💥💥博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️行百里者,半于九十。📋📋📋🎁🎁🎁。

m0_73907476的博客 1085

从CTF到实战:Frida Hook无导出SO函数的3种特殊姿势

本文深入探讨了在移动安全逆向工程中,如何利用Frida Hook无导出SO函数的三种高级技巧:字符串引用定位法、调用栈回溯法和内存特征码扫描。针对安卓So层加固和混淆场景,文章结合CTF赛题与实战案例,详细解析了每种方法的原理、实现步骤与适用场景,为安全研究人员提供了从理论到实践的完整解决方案。

jenkins8butler的博客 515

PhoenixSuit全志刷机实战:从驱动安装到固件烧录的完整避坑指南

本文提供全志芯片设备使用PhoenixSuit进行线刷的完整实战指南。详细介绍了从驱动安装、双公头USB线连接、强制刷机模式进入,到固件烧录全过程的核心步骤与常见错误排查。重点解析了如何避免驱动安装失败、正确触发刷机模式以及应对烧录卡顿等关键问题,帮助用户顺利完成刷机或救砖操作。

algae的博客 1686

蒙特卡洛粒子滤波定位算法_粒子滤波和蒙特卡洛定位

1 function [] =PF ()2 %Just call PF (without any arguments) to run the animation3 %4 % This is the matlab code behind the movie "Particle Filter Explained5 % without Equations", which can be found at ...

weixin_39673471的博客 429

AI大模型学习(13)小白也能学会的10分钟豆包大模型的python教程1

豆包AI大模型API是字节跳动推出的智能对话接口服务,开发者可以通过简单的HTTP请求调用强大的AI能力,实现智能问答、内容生成等功能。

isoft888的专栏,致力于C#/python分享物联网、大数据,神经网络的等领域,欢迎讨论交流! 1001

【电池容量预测】粒子滤波电池容量预测【含Matlab源码 3610期】

粒子滤波电池容量预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1323

jemalloc实战:5分钟搞定C程序内存泄漏检测(附PDF报告生成技巧)

本文详细介绍了使用jemalloc的heap profiling功能快速检测C/C++程序内存泄漏的实战方法。通过预编译库和LD_PRELOAD注入,无需修改代码即可启动低开销剖析,并利用jeprof工具进行深度分析和生成可视化PDF报告,帮助开发者高效定位线上或开发环境中的内存问题。

i3j4k5的博客 224

166、电流环带宽测试

本文分享了电流环带宽测试的实战经验,揭示了常见误区:误将系统其他环节(如PWM、ADC、传感器)的延迟当作电流环性能。强调带宽测试需先断开速度/位置环,采用扫频法注入正弦信号,结合伯德图分析幅值与相位响应。关键点包括:控制频率步进为对数、确保采样时序精准、避免传感器带宽限制影响结果。文中指出“假带宽”现象(如鼓包、增益超0dB)多源于非线性或机械共振,建议遵循“先开环后闭环”“带宽非越高越好”“阶跃验证”三原则,并建立出厂基准曲线以支持后期故障诊断。

2401_88858637的博客 174

非线性非高斯模型的改进粒子滤波算法(Matlab代码实现)

由于红外、被动声纳等被动传感器具有隐蔽性好、抗干扰性强等特点,因此在现代战争中纯方位跟踪有着广泛的应用前景,吸引了许多学者进行研究。但是,纯方位跟踪又是跟踪问题的一个难点,主要是因为同主动跟踪问题相比,纯方位跟踪具有不可观测性,滤波非线性等特点。目前,针对纯方位跟踪研究多采用局部线性化的近似方法。扩展卡尔曼滤波( EKF) 是比较普遍适用的算法,此算法仅利用非线性函数 Taylor 展开的一阶项,只适用于弱非线性系统,在缺少距离量测信息的条件下容易引起滤波的不稳定,甚至发散;

weixin_46039719的博客 737

uniapp+coze制作app智能体

使用 UniApp 配合 Coze 平台来开发一个具备 AI 智能体的 App,是一个高效且实用的选择。其核心思路主要有两种:一种是通过,另一种则是通过实现更自主的集成。下面的流程图可以帮你快速了解这两种方案的全貌。下面,我们来详细看看这两种方案分别如何操作。

suny8的专栏 573
上一篇: Extended kalman算法原理和开源代码阅读
下一篇: UKF 无迹卡尔曼滤波
KPer_Yang
博客等级 码龄4年 281粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KPer_Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值