一、基于粒子滤波污染源定位简介

粒子滤波定位算法是目前最精准定位可移动物体的位置,由于水域的流动,工业固体废物污染源很可能随着水流移动位置,基于粒子滤波算法将污染物定位分为预测、测量以及重新采样可大大提高定位准确率[10]。粒子滤波算法的定位过程首先根据水流速度以及前一时刻水域的污染浓度预测出目前水域污染浓度最高的区域,其次对每个可能为污染源的位置进行权重计算,最后将所有污染源权重进行筛选,剔除权值较小的污染源,留下权值最高的污染源,并重复训练直到获取唯一一个权值最高的污染源,即实现工业固体废物污染定位。

1 预测阶段

在此阶段中首先设置出所需粒子个数,并将所有粒子平分到受到污染的水域中,基于粒子滤波算法得出提议分布,当污染源在时间t-1中的定位是Xt-1(xt-1,yt-1,θt-1),则时间t的污染源定位是Xt(xt,yt,θt),污染源的运动速度即为水流速度,则工业固体废物污染源在时间t到t-1之间位置的变化表达式(5)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_权重


首先利用摄像机和激光扫描仪在水域污染浓度较高的区域进行扫描,假设摄像机以及激光扫描仪获取到的固体点特征角度表达式(6)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_权重_02


为将激光扫描仪角度数据与摄像机中的物体角度信息进行中和,需要对摄像机中的物体点角度数据进行旋转变换根据角度信息公式将两种设备之间的角度信息进行转换,且转换时必须满足误差正态分布,则转换表达式(7)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_粒子群_03


根据式(9)将两种设备的废物样本集成到提议分布内,进而使得提议分布函数更加集中,即样本范围更小,更容易对污染源进行定位,此时的提议分布函数表达式(9)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_粒子群_04


上式即为根据状态转移函数得出的粒子滤波状态提议分布。2 测量阶段

在此阶段直接将激光扫描数据当成输入,进而获取工业固体废物的位置信息,则通过激光扫描仪位置转换生成设备与工业固体废物之间的几何关系表达式(10)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_权重_05


式中,xt代表设备的具体位置,θ代表设备扫描物体的角度,d代表设备与观测到的物体之间的直线距离,β代表物体的角度。在激光数据中获取疑似为工业固体废物污染源的观测值,并对其中的各个粒子进行权重评价,其表达式(11)为:

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_权重_06


根据粒子的权重判断粒子是否为真的工业固体废物。

3 重采样阶段
根据每个粒子的权重大小决定是否保留该粒子,设置一个可接受范围,判断粒子是否在此范围内,为保证粒子不变,复制权重较大的粒子填补空缺位置,重组粒子后将所有粒子输入状态转移函数内,并反复进行训练,保证最终污染源定位的准确性,实现工业固体废物污染源的定位。

二、部分源代码

%粒子滤波(定位运动轨迹)
%在二维空间,假设运动物体的一组(非线性)运动位置、速度、加速度数据,用粒子滤波方法进行处理
clc,clear,close all
%% 参数设置
N = 200; %粒子总数
Q = 5; %过程噪声(控制误差) 状态转移方程中使用
R = 5; %测量噪声 由真实位置叠加测量噪声得到测量位置
T = 10; %测量时间(总步数)
theta = pi/T; %旋转角度
distance = 80/T; %每次走的距离(步长)
WorldSize = 100; %世界大小
均值为0且距离大于0 因此权重随着距离增加沿高斯曲线右侧递减
w(i) = (1 / sqrt® / sqrt(2 * pi)) * exp(-(dist)^2 / 2 / R);
end
PCenter(:, 1) = sum(P, 2) / N;%t=1时刻(初始时刻)所有粒子的几何中心位置
% 初始状态(t=1)画图
err(1,1) = norm(X(:, 1) - PCenter(:, 1));%粒子群几何中心与系统真实状态的误差
err(2,1) = wgn(1, 1, 10log10®);
figure(1);
hold on
set(0,‘defaultfigurecolor’,‘w’)
plot(X(1, 1), X(2, 1), ‘r.’, ‘markersize’,30) %真实的初始状态位置(红点表示)
%grid on
axis([0 100 0 100]);
set(gca,‘XTick’,0:10:100) %改变x轴坐标间隔显示 这里间隔为10
set(gca,‘YTick’,0:10:100) %改变y轴坐标间隔显示 这里间隔为10
plot(P(1, 😃, P(2, 😃, ‘k.’, ‘markersize’,5); %各个粒子位置(N个黑点)
plot(PCenter(1, 1), PCenter(2, 1), ‘b.’, ‘markersize’,25); %所有粒子的中心位置(蓝点表示)
legend(‘真实位置’, ‘粒子群’, ‘粒子群的几何中心’);
title(‘初始状态’);
hold off
%% 开始运动
for k = 2 : T %从t=2到T
%模拟一个弧线运动的状态
X(:, k) = X(:, k-1) + distance * [(-cos(k * theta)); sin(k * theta)] + wgn(2, 1, 10log10(Q)); %状态方程
Z(:, k) = X(:, k) + wgn(2, 1, 10log10®); %观测方程(状态上叠加测量的高斯噪声)
%粒子滤波
%预测
for i = 1 : N
P(:, i) = P(:, i) + distance * [-cos(k * theta); sin(k * theta)] + wgn(2, 1, 10log10(Q));%粒子群带入状态方程
dist = norm(P(:, i)-Z(:, k)); %粒子群中各粒子 与 测量位置 的距离
w(i) = (1 / sqrt® / sqrt(2 * pi)) * exp(-(dist)^2 / 2 / R); %求权重(距离近权重大)
end
%归一化权重
wsum = sum(w);
for i = 1 : N
w(i) = w(i) / wsum;
end
%重采样(更新)
for i = 1 : N
wmax = 2 * max(w) * rand; %另一种重采样规则
index = randi(N, 1);%生成一个在[1(默认值),N]之间均匀分布的伪随机整数
while(wmax > w(index))
wmax = wmax - w(index);
index = index + 1;
if index > N
index = 1;
end
end
Pnext(:, i) = P(:, index); %得到新粒子放入临时集Pnext
end
P=Pnext;%用临时集Pnext更新粒子集P
PCenter(:, k) = sum(P, 2) / N; %重采样后所有粒子的中心位置
%计算误差
err(1,k) = norm(X(:, k) - PCenter(:, k)); %粒子几何中心与系统真实状态的误差
err(2,k) = norm(X(:, k) - Z(:, k));
%画图
figure(2);
set(0,‘defaultfigurecolor’,‘w’)
clf;%清空figure(2)中的图像 以便循环重新画
hold on
plot(X(1, k), X(2, k), ‘r.’, ‘markersize’,30); %系统状态位置
plot(P(1, 😃, P(2, 😃, ‘k.’, ‘markersize’,5); %各个粒子位置
plot(PCenter(1, k), PCenter(2, k), ‘b.’, ‘markersize’,25); %所有粒子的中心位置
axis([0 100 0 100]);
title(‘运动过程’);
legend(‘真实状态’, ‘粒子群’, ‘粒子群的几何中心’);
hold off
pause(0.1);%停0.1s开始下次迭代
end
%% 绘制轨迹
figure(3);
set(0,‘defaultfigurecolor’,‘w’)
plot(X(1,:), X(2,:), ‘r.-’, Z(1,:), Z(2,:), ‘g.-’, PCenter(1,:), PCenter(2,:), ‘b.-’);
axis([0 100 0 100]);
set(gca,‘XTick’,0:10:100) %改变x轴坐标间隔显示 这里间隔为10
set(gca,‘YTick’,0:10:100) %改变y轴坐标间隔显示 这里间隔为10
legend(‘真实轨迹’, ‘测量轨迹’, ‘粒子群几何中心轨迹’);
xlabel(‘横坐标 x’); ylabel(‘纵坐标 y’);
%% 绘制误差
figure(4);
set(0,‘defaultfigurecolor’,‘w’)
%set(gca,‘FontSize’,12);%设置图标字体大小
plot(err(1,:),‘b.-’);%err1为各时刻 真实位置与粒子群中心的几何距离
hold on
plot(err(2,:),‘r.-’);%err2为各时刻 真实位置与测量位置的几何距离
hold off
xlabel(‘步数 t’);
legend(‘粒子群误差’, ‘测量误差’);
title(‘真实位置与粒子群中心的集合距离’);

三、运行结果

【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_权重_07


【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_算法_08


【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_开发语言_09


【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】_粒子群_10

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 高勇.粒子滤波算法的工业固体废物污染源定位方法研究[J].环境科学与管理. 2021,46(12)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除