m基于MATLAB-GUI的GPS数据经纬度高度解析与kalman分析软件设计

275 阅读3分钟

1.算法概述

       经度纬度和高度来自GPS信号的中的GPGGA的数据。所以提取这三个信息主要是对GPGGA中的数据进行整理。GPGGA的数据格式如下所示:

 

1.png

2.png

       GPGGA是GPS数据输出格式语句,意思是一帧GPS定位的主要数据,是NMEA格式中使用最广的数据之一。该语句包括17个字段。

 

       $GPGGA 语句包括17个字段:语句标识头,世界时间,纬度,纬度半球,经度,经度半球,定位质量指示,使用卫星数量,HDOP-水平精度因子,椭球高,高度单位,大地水准面高度异常差值,高度单位,差分GPS数据期限,差分参考基站标号,校验和结束标记(用回车符和换行符),分别用14个逗号进行分隔。

 

        Kalman滤波是在时域上运用状态空间,递推得到的一种滤波算法,便于在计算机上实时实现,计算量和存储量小。该方法可处理多变量非平稳随机过程滤波问题,可处理时变系统滤波问题。例如飞机在飞行过程中,遇到的干扰通常是时变非平稳的噪声,此时运用卡尔曼滤波可有效去除干扰,得到较真实的状态估计数据。

 

       卡尔曼滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。kalman是跟踪算法的“hello world”,在当前深度学习跟踪算法遍地的情况下,kalman跟踪效果确实差强人意。但是在实际产品落地时,特别硬件不是很强大、场景不复杂的情况下,kalman还是性价比最高的。

 

       Kalman滤波分为2个步骤,预测(predict)和校正(correct)。预测是基于上一时刻状态估计当前时刻状态,而校正则是综合当前时刻的估计状态与观测状态,估计出最优的状态。预测与校正的过程如下:

 

预测:

 

3.png

 

校正:

 

4.png

 

       公式1是状态预测,公式2是误差矩阵预测,公式3是kalman增益计算,公式4是状态校正,其输出即是最终的kalman滤波结果,公式5是误差矩阵更新。各变量说明如下表:

 

5.png

 

2.仿真效果预览

matlab2022a仿真

 

6.png

7.png

8.png

9.png

 

3.MATLAB部分代码预览 `clc;

clear;

close all;

warning off;

 

 

DATA_TYPE = 'GPGGA';%选择需要保持的数据类型

fidin     = fopen('data.txt','r');

%读取数据

tline = func_GPS_read(fidin);

 

%数据中的GPGGA部分的数据进行保存,其余数据去除,在实际中,你也可以改变下面的参数,选择其他数据

Save_data = func_save_usefull_data(tline,DATA_TYPE);

 

 

%提取维度

%数据读取

Dimensions = func_read_Dimensions(Save_data);

%去掉数据中的0值

Dimensions(find(Dimensions == 0)) = [];

%卡尔曼滤波

Dimensions_kalman = func_kalman(Dimensions);

 

figure;

subplot(211);plot(Dimensions);title('维度');

subplot(212);plot(Dimensions_kalman);title('维度kalman');

xlabel('times');

ylabel('Dimensions');

%提取经度

%数据读取

longitude = func_read_longitude(Save_data);

%去掉数据中的0值

longitude(find(longitude == 0)) = [];

%卡尔曼滤波

longitude_kalman = func_kalman(longitude);

 

figure;

subplot(211);plot(longitude);title('经度');

subplot(212);plot(longitude_kalman);title('经度kalman');

xlabel('times');

ylabel('longitude');

 

 

 

%提取高度

%数据读取

Height = func_read_Height(Save_data);

Height(find(Height == 0)) = [];

%卡尔曼滤波

Height_kalman = func_kalman(Height);

 

 

figure;

subplot(211);plot(Height);title('高度');

subplot(212);plot(Height_kalman);title('高度kalman');

xlabel('times');

ylabel('Height');

01_047_m`