(三)多传感器平方根容积卡尔曼滤波(SRCKF)算法

目录

前言

一、基础知识

(一)平方根容积卡尔曼滤波

(二)简单凸组合融合

二、模型构建

(一)状态和观测模型构建

(二)单个滤波器仿真

(三)融合滤波

三、结果展示

总结


前言

        本博客介绍了一种用于多传感器的平方根容积卡尔曼滤波(SRCKF)算法。首先,介绍了SRCKF的原理及滤波过程。之后,对于多传感器状态值估计中用到的简单凸组合技术进行了讲解。最后,结合一个实例和matlab程序对算法的具体实现过程进行了讲解。仿真结果证明了滤波融合算法的有效性和实用性。


一、基础知识

(一)平方根容积卡尔曼滤波

        常用的卡尔曼滤波算法仅能对线性高斯模型做出最优状态估计。实际应用中会存在很多非线性函数,比如平方函数、指数函数以及三角函数等,这就导致普通卡尔曼滤波算法已经不适用。解决非线性滤波问题需要计算条件后验概率分布,但是计算度十分复杂。因此人们提出各种次优方法来解决这个问题,上篇文章中提到的拓展卡尔曼滤波(EKF)算法核心就是利用一阶泰勒技术将非线性问题线性化。但是对于更高精度的非线性滤波问题,EKF的误差太大,可能会使得滤波发散。并且EKF需要计算雅可比行列式,实际情况中很难得到系统的雅可比行列式。因此提出一种基于容积原则的数值积分方法,来计算非线性变换之后的均值和协方差。即容积卡尔曼滤波方法(CKF),又因为平方根滤波的鲁棒性特点,本博客采用平方根容积卡尔曼滤波(SRCKF)方法。

        需要注意的一点是SRCKF中状态误差矩阵的传递是基于状态误差协方差P的乔列斯基分解因子S进行的,不同常规卡尔曼滤波。本博客注重方法的应用,只对于原理做简单介绍。


        非线性系统模型可以表示为:

X(k+1) = f(X(k)) + w(k)

Z(k) = h(X(k)) + v(k)

        过程噪声:w(k)\sim N(0,Q(k))  

        观测噪声:v(k)\sim N(0,R(k))

        非线性函数:f\left ( \ast \right )h\left ( \ast \right )

        在讲述滤波过程之前,需要先定义基本的容积点和对应权值。首先。使用三阶容积原则获取的基本容积点和对应的权值为:

\zeta _{j}=\sqrt{\frac{m}{2}}\left [ 1 \right ]_{j},w_{j}=\frac{1}{m},j=1,\cdots m

        其中,m=2nm表示容积点数量;n表示状态向量维数;\left [ 1 \right ]表示n维单位向量全排列之后的完整全对称点集,\left [ 1 \right ]_{j}表示点集\left [ 1 \right ]中的第j个点。


        滤波过程如下:

        第一步:滤波初始化X_{0}P_{0}

        第二步:时间更新:

        1.计算容积点:X_{j}( k)=S(k)\zeta _{j}+X(k)

        2.计算通过状态方程传播的容积点:X_{j}^{\ast }(k+1\mid k)=f(X_{j}( k))

        3.计算状态预测和方差预测的乔列斯基分解因子:

\bar{X}(k+1\mid k)=\sum_{i=1}^{m}w_{i}X_{i}^{\ast }(k+1\mid k)

\bar{S}\left ( k+1\mid k \right )=tria([\chi _{k+1\mid k}^{\ast }S_{Q}(k)])

        其中,tria表示矩阵进行三角化,矩阵\chi _{k+1\mid k}^{\ast }的定义如下:

\chi _{k+1\mid k}^{\ast }=\frac{1}{\sqrt{m}}\left [X_{1}^{\ast }(k+1\mid k)-\bar{X}(k+1\mid k)\cdots X_{m}^{\ast }(k+1\mid k)-\bar{X}(k+1\mid k) \right ]

        第三步:观测更新:

        1.计算容积点:X_{j}(k+1\mid k)=\bar{S}\left ( k+1\mid k \right )\zeta _{j}+\bar{X}(k+1\mid k)

        2.计算通过非线性观测函数传递的容积点:Z_{j}(k+1\mid k) =h(X_{j}(k+1\mid k))

        3.计算观测的预测、新息方差的乔列斯基分解因子和协方差:

\bar{Z}(k+1\mid k) = \sum_{i=1}^{m}w_{i}Z_{i}(k+1\mid k)

S_{zz}(k+1\mid k)=tria([\gamma _{k+1\mid k}S_{R}(k+1)])

P_{xz}(k+1\mid k)=\chi _{k+1\mid k}\gamma _{k+1\mid k}

        其中,\chi _{k+1\mid k}\gamma _{k+1\mid k}分别为:

\chi _{k+1\mid k}=\frac{1}{\sqrt{m}}\left [X_{1}(k+1\mid k)-\bar{X}(k+1\mid k)\cdots X_{m}(k+1\mid k)-\bar{X}(k+1\mid k) \right ]

\gamma _{k+1\mid k}=\frac{1}{\sqrt{m}}\left [Z_{1}(k+1\mid k)-\bar{Z}(k+1\mid k)\cdots Z_{m}(k+1\mid k)-\bar{Z}(k+1\mid k) \right ]

        第四步:状态和方差的乔列斯基分解因子更新:

K(k+1)=(P_{xz}(k+1\mid k)/S_{zz}^{T}(k+1\mid k))S_{zz}(k+1\mid k)

X(k+1)=\bar{X}(k+1\mid k)+K(k+1)(Z(k+1)-\bar{Z}(k+1\mid k))

S(k+1)=tria([\chi _{k+1\mid k}-K(k+1)\gamma _{k+1\mid k}K(k+1)S_{R}(k+1)])


        对应示例部分代码为(此实例中状态转移方程为线性方程,未计算线性化状态转移方程):

%平方根容积卡尔曼滤波算法
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个传感器。每个传感器的状态估计值为\widehat{x}_{i},误差协方差矩阵为\widehat{P}_{i},则对应的状态估计值和系统误差为:

        系统误差: P_{sf} = (P_{1}^{-1}+P_{2}^{-1}+\cdots +P_{n}^{-1})^{-1} = (\sum_{i=1}^{n}P_{i}^{-1})^{-1}

        状态估计值:\widehat{x}_{sf} =P_{sf} (P_{1}^{-1}\widehat{x}_{1}+P_{2}^{-1}\widehat{x}_{2}+\cdots +P_{n}^{-1}\widehat{x}_{n}) =P_{sf} (\sum_{i=1}^{n}P_{i}^{-1}\widehat{x}_{i})

二、模型构建

(一)状态和观测模型构建

        假设系统为一维线性变化的向量,状态向量由二维变量组成,分别为位置、速度。因此状态模型为线性模型,可以表示为:

        状态转移方程为:X(k+1) = F*X(k) + w(k)

        状态转移矩阵:

F=\begin{bmatrix} 1 &1 \\ 1 & 0 \end{bmatrix}

        过程噪声:w(k)\sim N(0,Q(k))

        之后,状态向量经过非线性变换之后,附加上系统噪声就得到了系统的观测值。

        观测方程:Z(k) = h(X(k)) + v(k)

        非线性观测函数:h=\left [ X(k)\right ]^{2}

        观测噪声:v(k)\sim N(0,R(k))

        此处假设有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_{0}=[5,0.5]^{T}P_{0} = diag([1 , 1])

        对应的滤波程序为:

%单个传感器滤波
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进行滤波。从最后一张图中可以看出,滤波误差不断减小,说明滤波收敛。并且单个滤波的误差小于观测数据误差,证明滤波算法有效。同时融合后的滤波误差小于单个滤波器的误差,证明融合算法有效。仿真结果表明,所提融合滤波算法能够实现有效滤波跟踪。


总结

        以上就是今天要讲的内容,本文介绍了一种多传感器的平方根容积卡尔曼滤波(SRCKF)算法,结果表明滤波算法能够实现有效滤波跟踪,并且相比于单个传感器滤波,多传感器融合能够有效提升滤波精度。

  • 35
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值