目录
前言
一、基础知识
(一)平方根容积卡尔曼滤波
(二)简单凸组合融合
二、模型构建
(一)状态和观测模型构建
(二)单个滤波器仿真
(三)融合滤波
三、结果展示
总结
前言
本博客介绍了一种用于多传感器的平方根容积卡尔曼滤波(SRCKF)算法。首先,介绍了SRCKF的原理及滤波过程。之后,对于多传感器状态值估计中用到的简单凸组合技术进行了讲解。最后,结合一个实例和matlab程序对算法的具体实现过程进行了讲解。仿真结果证明了滤波融合算法的有效性和实用性。
一、基础知识
(一)平方根容积卡尔曼滤波
常用的卡尔曼滤波算法仅能对线性高斯模型做出最优状态估计。实际应用中会存在很多非线性函数,比如平方函数、指数函数以及三角函数等,这就导致普通卡尔曼滤波算法已经不适用。解决非线性滤波问题需要计算条件后验概率分布,但是计算度十分复杂。因此人们提出各种次优方法来解决这个问题,上篇文章中提到的拓展卡尔曼滤波(EKF)算法核心就是利用一阶泰勒技术将非线性问题线性化。但是对于更高精度的非线性滤波问题,EKF的误差太大,可能会使得滤波发散。并且EKF需要计算雅可比行列式,实际情况中很难得到系统的雅可比行列式。因此提出一种基于容积原则的数值积分方法,来计算非线性变换之后的均值和协方差。即容积卡尔曼滤波方法(CKF),又因为平方根滤波的鲁棒性特点,本博客采用平方根容积卡尔曼滤波(SRCKF)方法。
需要注意的一点是SRCKF中状态误差矩阵的传递是基于状态误差协方差的乔列斯基分解因子进行的,不同常规卡尔曼滤波。本博客注重方法的应用,只对于原理做简单介绍。
非线性系统模型可以表示为:
过程噪声:
观测噪声:
非线性函数:和
在讲述滤波过程之前,需要先定义基本的容积点和对应权值。首先。使用三阶容积原则获取的基本容积点和对应的权值为:
其中,,表示容积点数量;表示状态向量维数;表示n维单位向量全排列之后的完整全对称点集,表示点集中的第个点。
滤波过程如下:
第一步:滤波初始化、
第二步:时间更新:
1.计算容积点:
2.计算通过状态方程传播的容积点:
3.计算状态预测和方差预测的乔列斯基分解因子:
其中,表示矩阵进行三角化,矩阵的定义如下:
第三步:观测更新:
1.计算容积点:
2.计算通过非线性观测函数传递的容积点:
3.计算观测的预测、新息方差的乔列斯基分解因子和协方差:
其中,和分别为:
第四步:状态和方差的乔列斯基分解因子更新:
对应示例部分代码为(此实例中状态转移方程为线性方程,未计算线性化状态转移方程):
%平方根容积卡尔曼滤波算法
chol_Q=blkdiag(chol(Q,'lower'));
n=size(X,1);
m=2*n;
kkss=[eye(n);-eye(n)]'*sqrt(n);
for i=1:m
Xix(:,i)=F*(S*kkss(:,i)+X);
end
Xd=sum(Xix,2)/m;
Xx=(Xix-repmat(Xd,1,m))/sqrt(m);
[~,Sda]=qr([Xx,chol_Q]');
Sda=(Sda(1:n,1:n))';
for i=1:m
Xi(:,i)=Sda*kkss(:,i)+Xd;
end
for i =1:m
Zi(1,i)=h(Xi(:,i),A);
end
(二)简单凸组合融合
信息融合具有多种形式,通常分为集中式融合和分布式融合方式。此处运用分布式融合方式对多个传感器的信息进行融合。分布式结构中每个传感器都有自己的处理器,在进行预处理后将滤波结果传送到中心节点进行融合处理。其中比较实用的是简单凸组合融合方法,但是此方法仅适用于互协方差可以忽略不计的场景下。此方法实现简单,应用范围广;并且即使在估计误差相关的情况下也是准最佳的。
假设存在n个传感器。每个传感器的状态估计值为,误差协方差矩阵为,则对应的状态估计值和系统误差为:
系统误差:
状态估计值:
二、模型构建
(一)状态和观测模型构建
假设系统为一维线性变化的向量,状态向量由二维变量组成,分别为位置、速度。因此状态模型为线性模型,可以表示为:
状态转移方程为:
状态转移矩阵:
过程噪声:
之后,状态向量经过非线性变换之后,附加上系统噪声就得到了系统的观测值。
观测方程:
非线性观测函数:
观测噪声:
此处假设有10个滤波器对目标状态进行滤波,则对应的模型程序为:
clc;
clear all;
close all;
%%
B = 10; %陀螺仪个数
M = 1; %状态维数
N_end = 100;%结束点数
N_start = 5;%开始点数
x= N_start:0.5:N_end;
[~,N] = size(x);
Z_1 = zeros(B,N);
nf = 0.0001;%噪声强度
Q = cell(1,N);
Q(:) = {zeros(2,2)};
for i=1:B
Q{i} = nf*diag([1,1]);
end
R = 1000*ones(1,B);
F = [1 1;0 1];
for j = 1:B
X_data = zeros(2,N);
Z_data = zeros(1,N);
for i = 1:N
if i ==1
X_data(:,i) = [N_start,0.5]';
else
X_data(:,i) = F*X_data(:,i-1);
end
end
X_data = X_data + sqrt(Q{j})*randn(2,N);
Z_1(j,:) = X_data(1,:).^2+sqrt(R(j))*randn(1,N);
end
(二)单个滤波器仿真
建立系统模型之后,对单个滤波器进行滤波迭代。首先,设定仿真初值,假设状态初值和协方差初值为:
;
对应的滤波程序为:
%单个传感器滤波
X_all = zeros(B,N);
P_all = zeros(B,N);
for i =1:B
[X_all(i,:),P_all(i,:)] = filter_fusion(Z_cal(i,:),R(1,i),F,Q{i});
end
其中“filter_fusion()”函数为自定义函数,可以对10个滤波器的原始数据进行批量处理。
(三)融合滤波
在得到10个传感器的滤波值之后,根据简单凸组合融合准则对多个传感器的状态估计值进行融合,对应代码为:
%信息融合
X_F = zeros(M,N);
P_F = zeros(M,N);
for i = 1:N
X_mid = X_all(:,i);
P_mid = P_all(:,i);
%融合
P_F_inv = 0;
X_c = 0;
for j = 1:B
P_F_inv = (eye(M)/P_mid(j)) + P_F_inv ;
X_c = (eye(M)/P_mid(j))*X_mid(j) + X_c;
end
P_F(1,i) = eye(M)/P_F_inv;
X_F(1,i) =(eye(M)/P_F_inv)*X_c;
end
三、结果展示
对原始数据进行绘图,可以得到10个滤波器的原始数据图形,对应代码为:
figure(1)
plot(Z_1');
title('原始数据','Fontsize',12);
xlim([1,N]);
将第5个传感器的观测值、滤波后的状态估计值以及融合状态估计值绘制在一张图中,可以直观的感受到滤波效果,对应的代码为:
figure(2)
plot(1:N,sqrt(Z_1(5,:)));
hold on;
plot(1:N,X_all(5,:));
hold on;
plot(1:N,X_F);
legend('观测','单个滤波','融合滤波','Fontsize',12);
xlim([1,N]);
将单个传感器的观测值误差、滤波后的状态估计值误差以及融合状态估计值误差绘制在一张图中,可以直观分析滤波误差,对应的代码为:
figure(3)
error_obser = sqrt(Z_1(5,:))-x;
error_single = X_all(5,:)-x;
error_fusion = X_F-x;
plot(1:N,error_obser);
hold on;
plot(1:N,error_single);
hold on;
plot(1:N,error_fusion);
legend('观测','单个滤波','融合滤波','Fontsize',12);
xlabel('x');
xlim([1,N]);
在状态维数较高的情况下,平方容积卡尔曼滤波(SRCKF)的滤波精度相比与其他滤波方法更高。所以在状态维数比较高的非线性滤波情况下,建议使用SRCKF进行滤波。从最后一张图中可以看出,滤波误差不断减小,说明滤波收敛。并且单个滤波的误差小于观测数据误差,证明滤波算法有效。同时融合后的滤波误差小于单个滤波器的误差,证明融合算法有效。仿真结果表明,所提融合滤波算法能够实现有效滤波跟踪。文章来源:https://www.toymoban.com/news/detail-809874.html
总结
以上就是今天要讲的内容,本文介绍了一种多传感器的平方根容积卡尔曼滤波(SRCKF)算法,结果表明滤波算法能够实现有效滤波跟踪,并且相比于单个传感器滤波,多传感器融合能够有效提升滤波精度。文章来源地址https://www.toymoban.com/news/detail-809874.html
到了这里,关于(三)多传感器平方根容积卡尔曼滤波(SRCKF)算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!