关于NMEA数据示例的卡尔曼滤波器的经验

本文的目的不是解释卡尔曼滤波器的原理,而是以真实(原始)数据为例进行说明。那些希望可以修改源代码并尝试使用该算法的人,我希望我的工作将对那些面临类似任务的人有所帮助。


所使用的数据来自NMEA-0183格式的GPS接收器,尤其是GGA和VTG消息。


由于GPS的噪音,必须进行过滤。GPS数据的干扰原因不同。主要的:


  • 大气。
  • 信号障碍。
  • GPS轨道位置。例如,GPS轨道的低倾斜度(大约55°)严重损害了地球绕极地区的精度。

所有这些都会导致位置跳变,路线偏移和其他问题。在工作中,首先,我需要获得准确的过滤速度。


事实是,由设备测量并在VTG消息中传输的速度给出了难以理解的读数(跳跃等),这使控制任务极为复杂。
因此,决定在Octave中建立一个滤波器模型,并已将速度作为GGA消息表示的GPS数据的派生接收到,并将其与VTG消息中的原始速度数据进行比较。


为了便于比较,数据必须显示在一张图上。


卡尔曼滤波器在过滤数据及其导数方面做得很好。


在自动驾驶仪和垂直航线的任务中使用过滤器是“经典的”


由于我不是理论计算专家,因此这里不考虑滤波器的算法。对于该主题的所有培训都有广泛的(并非如此)评论:从水壶工程师到具有机械手的数学天才。对于不熟悉所有这些Predict,Update和Invariant的读者,一些链接:


https://habr.com/zh-CN/post/140274/
https://habr.com/zh-CN/post/166693/
https://en.wikipedia.org/wiki/%D0%A4%D0%B8%D0 %BB%D1%8C%D1%82%D1%80_%D0%9A%D0%B0%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0


第一步是用Octave(Linux的开源孪生Matlab)编写一个过滤器。首先,控制矩阵F mat。该模型被选为最简单的模型(没有加速度的运动):



, .
— (PAC ) C++.


— Octave .


++ , , Octave — .


GGA :


VTG :

«--» — , . Latitude Longitude.


.


, .

:
Fk — //, state-transition model.
Hk — /, observation model.
Qk — , covariance of the process noise;.
Rk — , covariance of the observation noise.
K — .
Xp — () .
Xk — .
X(k-1) — .
Pp — , .
P — .
P(k-1) — () .
z- () .


:
Xp = Fk X(k-1); .
Pp = Fk
P(k-1) * F'k + Q; .


:
K = Pp H' inv(H Pp H' + R); .
Xk = Xp + K(z — HXp); z.
P = Pp — KHPp; .


.


KalmanX KalmanY .


X Y , , Q, R, F reset ( Q R, ).


(habrGGA.m) , , .


Q, R . ( Q, R). , .


, :



( ) , Q. R = 0,2.


, :



— X Y (Latitude Longitude) , :




:



( VTG) , .


Q R, (habrGGA.m):


 if j==1   Q = [ 0.01 0;
                  0   0.01];
            Q1=Q;     
            R=0.2; R1=R;
  elseif j==2   Q = [ 0.05 0;
                      0   0.05]; 
                      Q2=Q;
            R=0.2; R1=R;
  elseif j==3    Q = [1 0;
                       0  1];
                       Q3=Q;
            R=0.2; R1=R;
  end

出于我的目的,现在在该NMEA套件上似乎最优选平均Q值(0.05)。在系泊试验的调试过程中,将实现更准确的,可能是动态可变的系数选择。


附加的文件。
habrGGA.m-主脚本(读取数据,调用过滤器函数,绘制图形)
KalmanX.m-卡尔曼过滤器(纬度)
KalmanY.m-卡尔曼过滤器(经度)


All Articles