卡尔曼无线传感网络定位Word文档格式.docx
《卡尔曼无线传感网络定位Word文档格式.docx》由会员分享,可在线阅读,更多相关《卡尔曼无线传感网络定位Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
一、研究背景
针对基于测距技术的无线传感器网络室位问题,测距的精度直接影响到定位的精度。
由于超声波信号在复杂的室内环境传播过程中受白噪声的干扰,我们测量到的距离数据并不完全正确。
对于同一时刻的室内温度基本不变,视温度信号为加性白噪声信号。
因此我们通过设计卡尔曼滤波器,利用卡尔曼滤波去除噪声,减少测量距离的误差。
二、卡尔曼滤波原理
设该测量系统
时刻的状态变量为
,系统测量距离的观测值为
,则状态方程和观测方程表示为:
其中,
表示时间,这里指第
步迭代时相应信号的取值;
为系统转移矩阵和
是观测矩阵,这里对所有K,
=
=1。
随机变量
和
代表系统噪声和观测噪声,且相互独立,这里设系统噪声和观测噪声的协方差矩阵分别为Q,R。
可得:
Q=
,R=
将以上参数代入卡尔曼递推公式,得到
测量更新方程(校正):
卡尔曼增益:
测量值更新状态估计:
更新误差协方差估计:
时间更新方程:
更新状态:
更新先验协方差估计:
根据初始条件
以及
,利用前面得到的卡尔曼递推公式迭代的流程为:
,
→
三、基于卡尔曼的无线传感网络定位应用
3.1无线传感网络的定位原理
无线传感器网络在室内定位中应用,基于测距的定位的技术典型的有到达时间差法(TDoA)和接收信号强度指示法(RSSI)。
这里我们所使用的定位测量技术是TDoA。
TDoA典型技术是结合RF和超声波,主要特点是利用超声波传播较慢特性作为传播延时信号测出与RF信号的时差值。
然而,影响TDoA技术测量精度主要因素在室内复杂的环境下的多径效应,室内温度,发送接收响应时间,非视线可见等因素。
这里我们是假定可视和RF和超声波发送情况下进行测量,那么此时影响TDoA技术测量精度主要是多径效应和室内温度。
气体中声速受到温度的影响最大,给定40KH的超声波频率下,声速受温度的影响为
这里
为室内环境温度,
=340m/s。
如下图1所示,Listener同时发送RF和超声波,beacon接收RF和超声波的时间差
为
。
由于RF信号速度
,则距离近似为
图1TDOA距离测量
3.2卡尔曼的应用
首先通过VC软件编写卡尔曼滤波c++语言代码,将测得的距离数据作为卡尔曼观察值输入(数据存储在example.txt文件),经过卡尔曼滤波后输出数据(数据存储在result.txt、covariance文件),最后进行对比分析数据,作出图表,卡尔曼滤波c语言代码见附录。
程序实验框图如下:
图2实验流程图
在实际测量当中,对于同一测量值,我们是通过多次测量
的方法来进行寻取最优解。
测得50组观测数据Y如下(单位/m):
5.0184.8975.0945.0315.0135.0515.0264.9054.9834.9854.9465.1684.9124.9514.9284.8824.9804.9725.1534.9754.8935.1605.1234.9774.8494.9554.9845.0274.9735.0445.0394.8744.9054.9254.9494.9675.0014.6974.9545.1244.8935.0935.0354.9975.0184.8434.9915.1605.0095.004
观测数据经过卡尔曼滤波程序运算后输出的估计值为:
4.9875.0184.9585.0035.0105.0115.0175.0195.0045.0025.0004.9955.0105.0024.9984.9934.9864.9854.9844.9944.9934.9884.9975.0035.0024.9954.9934.9924.9944.9934.9954.9974.9924.9884.9864.9844.9834.9844.9734.9724.9784.9754.9794.9814.9824.9834.9784.9784.9854.9864.987
相应的误差协方差值为:
1.0000000.0081080.0040730.0027230.0020480.0016440.0013760.0011850.0010430.00093250.00084510.00077410.00071550.00066630.00062470.00058890.0005580.00053110.00050750.00048670.00046830.00045180.00043710.00042390.00041210.00040140.00039160.00038280.00037480.00036750.00036090.00035480.00034920.00034410.00033940.0003350.00033110.00032740.0003240.00032090.0003180.00031540.00031290.00031070.00030860.00030660.00030480.00030310.00030160.00030010.0002988
3.3应用结果与分析
将卡尔曼滤波程序运行结果作出图如下所示:
图3实验结果
图3蓝色曲线为观测数据波形,红色曲线为经过卡尔曼滤波得到的信号估计波形,绿色曲线为真实值。
图4协方差变化过程
图4红色曲线为卡尔曼公式递推时误差协方差估计值变化过程
图3蓝色的曲线是针对同一理想值下经过多次测量得出的数据后绘画出来,可见波动很大,即测量数据受到室内复杂的环境下产生的多径效应影响以及温度的影响相当大,实际上测量的过程当中也会受到硬件电路的噪声和芯片反应时间的影响而产生偏差。
测量的50组数据当中,与理想值5最大偏移量为0.303。
图中红色的曲线是经过卡尔曼滤波后绘画出来的,估计值在数值5左右上下波动与预定的理想值相接近,最大偏移量为0.042,误差结果明显整体变小了。
从两曲线的整体波动情况来分析,经过卡尔曼滤波后的红色曲线,在当前估计值下,不会因为当前测量值的突然很大的变大或变小而与上一估计值相差很大,而是很平滑的变动。
图4表明了距离测量值在卡尔曼滤波过程中误差不断减小,趋向于0。
3.4结论
实验数据经过卡尔曼滤波后能够很好的滤去噪声部分信息,从而能够使我们的测量系统测量得到的数据更接近理想数值。
可见,卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器),它能够从一系列的不完全及包含噪声的测量中,估计动态系统的状态。
结束语
经过亲自动手去完成卡尔曼(Kalman)滤波实验,过程当中包括认真看懂卡尔曼原理以及应用,还有就是动手编写C++程序。
直到看到实验数据画出来的图,深深地感受到卡尔曼滤波的好处。
卡尔曼滤波不仅可以在信号领域主要用于去除噪声,实际上在很多控制领域上用于状态估计和参数估计都是很好的方法。
比如在课程材料提到的无线传感器网络在室内定位,可以利用卡尔曼滤波去实验目标的跟踪定位,的确是个不错的方法。
随着科技的发展,在雷达、声呐、通信、视频图像处理、故障诊断等领域,对信号检测和状态参数估计的研究,有着重要的价值。
在应用实例方面,已基本掌握系统建模问题,即卡尔曼滤波中的状态方程和观测方程的建立。
两个方程中的状态、矩阵参数的设置不同,就代表着不同的系统。
在此实验过程当中,收获的不仅是弄懂了卡尔曼的使用,更多的是在学习当中让你去思考卡尔曼滤波与自己研究的课题当中是否有可用之处,在一定的程度上激发了我研究的思考。
参考文献
[1]丁美玉等.数字信号处理——时域离散随机信号处理.西安:
西安电子科技大学出版社,2002
[2]黄小平等.卡尔曼滤波原理及其应用——MATLAB仿真.北京:
电子工业出版社,2015
[3]谭浩强.C程序设计(第三版).北京:
清华大学出版社,2005
[4]马祖长等.无线传感网络综述.通信学报.2004,25(4)
[5]黄晓利等.无线传感网络TDoA定位系统的设计与实现.计算机测量与控制.2008,13
(2)
附录
//kalman.cpp:
卡尔曼滤波程序
#include"
stdafx.h"
#include<
iostream>
fstream>
iomanip>
stdio.h>
#defineNUM50//定义从文件中读数的个数
usingnamespacestd;
floatcov(floatY[],intn);
//求取数组Y的协方差
floatmean(floatY[],intn);
//求取数组Y的均值
voidinputfile(floatIN[],intn,char*filename);
//从文件中读取实验数据
voidoutputfile(floatOUT[],intn,char*filename);
//输出数据到指定文件
intmain()
{
intk;
floatY[NUM],X[NUM+1],P[NUM+1],P_UN[NUM+1],H[NUM],A,C,Q,R;
/*从文件中读取实验数据*/
cout<
<
"
观测数据:
endl;
inputfile(Y,NUM,"
example.txt"
);
/******卡尔曼滤波******/
//递推参数
A=1;
//状态转移矩阵
C=1;
//观测矩阵
Q=1E-5;
//系统噪声的协方差
R=cov(Y,NUM);
//观测噪声的协方差
//初始条件
X[0]=mean(Y,NUM);
P[0]=1;
//卡尔曼迭代过程
for(k=0;
k<
NUM;
k++)
{
P_UN[k]=A*A*P[k]+Q;
//更新先验协方差估计
H[k]=P_UN[k]*C/(C*P_UN[k]*C+R);
//增益(加权矩阵)
X[k+1]=A*X[k]+H[k]*(Y[k]-C*A*X[k]);
//用测量值更新状态估计
P[k+1]=(1-H[k]*C)*P_UN[k];
//更新误差协方差估计
}
/*将结果输出到指定文件中*/
'
\n'
经过卡尔曼滤波后的估计值:
outputfile(X,NUM+1,"
result.txt"
滤波时协方差变化过程:
outputfile(P,NUM+1,"
covariance.txt"
system("
pause"
return0;
}
voidinputfile(floatIN[],intn,char*filename)//从文件中读取实验数据
{//IN为输入数组,n为输入个数,filename为文件名,注意后缀
inti;
ifstreaminfile(filename,ios:
:
in);
//定义文件流对象,打开磁盘文件
if(!
infile)
cerr<
openerror"
exit
(1);
for(i=0;
i<
n;
i++)
infile>
>
IN[i];
//从磁盘文件读入整数,顺序存放在IN数组中
cout<
IN[i]<
"
;
//将读入的数据在显示器上顺序显示出来
infile.close();
//关闭磁盘文件
voidoutputfile(floatOUT[],intn,char*filename)//输出数据到指定文件
{//OUT为输出数组,n为输出个数,filename为文件名,注意后缀
ofstreamoutfile(filename,ios:
out);
//定义文件流对象,打开磁盘文件
outfile)
for(i=0;
outfile<
setprecision(4)<
OUT[i]<
//从磁盘文件读入整数,顺序存放在Y数组中(这里指定输出有效位)
//将结果输出到指定显示屏上
outfile.close();
floatcov(floatY[],intn)//求取数组Y的协方差
{//Y为所求数组,n为所需要求的个数
floatE,COV_Y,sumY=0,sumY2=0;
sumY=sumY+Y[i];
E=sumY/n;
sumY2=sumY2+(Y[i]-E)*(Y[i]-E);
COV_Y=sumY2/n;
returnCOV_Y;
floatmean(floatY[],intn)//求取数组Y的均值
floatE,sumY=0;
returnE;