卡尔曼滤波器代码python_基于Python的扩展的卡尔曼滤波器实现的恒定转速和加速度(CTRA)车辆模型...

news/2024/7/7 19:47:09

eb10ddaaa85b9fd27ab1bce50ccec36d.png

Extended Kalman Filter Implementation for Constant Turn Rate and Acceleration(CTRA) Vehicle Model in Python.


71eb02677b90fa0cb134eef9e06bbec4.png
扩展卡尔曼滤波算法
  • 扩展的卡尔曼滤波器,其状态转移和观察模型不需要一定是状态的线性函数,而是状态的可微函数;
  • 这里,
    是过程和观测噪声,假设它们均为零均值多变量高斯噪声,协方差矩阵分别记为
  • 函数可以根据先前估计值
    来计算现在状态的估计值,
    函数可以从预测状态中计算出预测测量值。但是,
    不可以直接应用于协方差矩阵,而是通过一个偏微分矩阵(雅克比矩阵
  • 在每一个时间增量步,通过当前预估状态评估雅克比行列式,这些Matrix被用在卡尔曼滤波器等式中,该过程基本上使目前估计值周围的非线性函数线性化。
  • 情境:Situation coverd...
    • 你有一个速度传感器,测量车辆速度(
      )以及车头的方向(
      )以及一个偏航(Yaw)角速度传感器(
      ),这些与一个GPS传感器的坐标信息(x&y)进行融合。

必要工具包

fd4c35e3fb204c6d129fc0815f405e1e.png

状态向量——常转速以及加速度车辆模型(Constant Turn Rate and Acceleration Vehicle Model CTRA)

63e5070e4dfc4d391a625e9699fc08f8.png

206d5cf03fe497d94666fc786d54cd46.png
  • 首先将各个状态变量定义好

7873e94fca401f62b19a8ba84e229c02.png
  • 可以得到:状态向量与动力学矩阵的字符表达(很简单,可以自己推一下):

493ebf6e57c0ced2b6272a4c03d23275.png
state vector

b38cc6475307f1f75c370311903d45dc.png
dynamic matrix
  • 同时,利用如下语句,可以得到该模型的雅克比矩阵

4bc5a31d295a6e5ddc2c819a89b8febf.png

49fcb37a573bd4c47c92ba241adb0950.png
Jacobian Matrix
  • 这个雅克比矩阵,在每一个过滤器step进行计算,因为其包含了各个状态变量;
  • P.S. A.topython 和 .to_c 或者.to_matlab可以生成相应格式的代码;

初始化不确定矩阵

  • 注意,如果以0来初始这个矩阵
    ,这就代表着,你非常确定该车辆的启动位置;

67630db8bb1f7bb9cb74dc837e87e502.png

b5578427b2ee5774086fb66c2394efa1.png
Uncertainty P0

处理噪声协方差矩阵Q

  • 按照论文里面进行模型的处理,该论文指出,状态不确定性模型激发线性系统的扰动,从概念上来说,其评估了当系统在给定时间段内开环运行时会有多糟糕。
A 3D state space formulation of a navigation Kalman filter for autonomous vehicles​oai.dtic.mil

986f8afe8bd8d59d71d8092b071f6245.png

b99f8e0143d7d06bc9f8744b6c590215.png

读取测量数据

8a955ef80ca33955770b29f1fa0fe6b3.png

其中注意,对于course要做如下处理:course = -course + 90°,原因很简单,航向为0°,意味着这两车在成向整备方向行驶,90°意味着这辆车正在沿者正东方向行驶。后面的计算,我们 规定正东方向是0°,而正北方向是90°,这需要统一(参考坐标系)。

测量函数H

  • 矩阵
    是测量函数H关于各个状态变量的雅克比矩阵,
    函数H可以被用来通过预测状态值来计算预测测量值
  • 如果有可用的GPS测量值,下面的函数将状态变量映射到测量值。
  • 如果没有可用的GPS测量值,简单的设置
    为0矩阵。

955f990f19393382d5da47f9e4743a02.png

3e438f8fd118307049a1896fb547d6f9.png

测量噪声协方差矩阵R

  • 实际使用时,不确定性估计采用状态估计和测量的相对权重的重要性大小,也就是说R大,则状态估计值占比会比较大,R小则观测值(测量值)的占比较大,所以,不确定性估计是否绝对正确不是那么重要,因为其在每一种模型中的占比相对一致。
A 3D state space formulation of a navigation Kalman filter for autonomous vehicles​oai.dtic.mil

f79bc0ed725293f9eea10003d1cef4c9.png

07c12e6f654fc7a1f69cbbae4cc3d03d.png

将经纬度信息转化为m为单位的坐标信息

d132f6598c4adf88636282c2793ee812.png

初始化State

  • 利用下段代码,就可以初始化车辆的初始坐标以及方向;

5b862822d78e89bfea9c1d1108862fac.png

93f0036f8f095c60177661c58ca8c410.png

将所有观测量几何成一个vector

2b6abef588e0c70b9f485f5a05036f90.png

进行EKF扩展卡尔曼滤波算法

  • 按照Dynamic Equation对每个状态变量进行预测
  • 计算Jacobin矩阵
  • 预测误差协方差
  • 计算卡尔曼增益K
  • 根据观测值来更新预测值
  • 更新误差协方差矩阵P
for 

ea3fb20c1517cb3b336271931fac79d7.png
优良的滤波效果

Plot结果

  • 不确定性

07260bf709bbacd212e66ce2cfb9c64f.png
  • 卡尔曼增益

98002e71b7b071a39dbfae770228047e.png
  • 各个状态变量的跟踪情况

de67c449a8d72e8c192740dc352fe0fb.png
  • 位置X/Y的跟踪详情

721445d82d5593ef6da87a346a3667c9.png

2de7449a8744bfc9d28f56539a2ae9fe.png

通过使用EKF,达到很好的预测跟踪效果~


http://www.niftyadmin.cn/n/2610688.html

相关文章

jmeter结合autoit操作windows程序

需求: 模拟操作下图软件的控件,如拨号和挂机。 1. 下载安装好autoit后,打开finder tool,使用查找工具定位到要模拟操作的控件上,如图: 2.在finder tool中的control选项卡,可以看到该控件的信息。…

MySql 中IFNULL、ISNULL和NULLIF的区别

一、ISNULL(expr) 如果expr 为NULL,那么ISNULL() 的返回值为 1,否则返回值为 0。 例如 ->select isnull(11);->0;->select isnull(null);->1;二、IFNULL(expr1,expr2) 1、若expr1不为null,则ifnull()的…

C#中如何获取上个月第一天和最后一天

一、获取上个月第一天 private DateTime FirstDayOfPreviousMonth(DateTime datetime) {return datetime.AddDays(1 - datetime.Day).AddMonths(-1); } 二、获取上个月的最后一天 private DateTime LastDayOfPrdviousMonth(DateTime datetime) {return…

html5新特性data-属性

1.HTML5自定义属性及基础 html5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相应的id: <a href"javascript:;" data-id"2312">测试</a> 这里的data-前缀就被称为data属性,其可以通过…

STC51单片机串口发送程序

#include<reg52.h> #define uchar unsigned char unsigned char rtemp,sflag; unsigned char code Buffer[] "Welcome To The MCU World."; //所要发送的数据 unsigned char *p; unsigned char TestBuff[3]; unsigned char mode0; unsigned char Arra…

ZooKeeper源码分析-Jute-第二部分

数据类型和流 本部分描述支持Hadoop的基础数据类型以及复合类型。我们的目的是支持一系列的类型&#xff0c;可以用于在不同的编程语言中简化和有效表达一定范围的记录类型. 基础类型 大部分情况下&#xff0c;Hadoop的大部分基础类型直接映射到高级编程语言的基础类型。特殊的…

python写spark_使用Python的Spark:将RDD输出保存到文本文件中

我正在使用 python尝试使用spark计算单词计数问题.但是当我尝试使用.saveAsTextFile命令将输出RDD保存在文本文件中时,我遇到了问题.这是我的代码.请帮我.我被卡住了.感谢您的时间. import re from pyspark import SparkConf , SparkContext def normalizewords(text): return …

mysql中使用limit 分页

&#xfeff;&#xfeff;一、mysql中limit语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 二、mysql中limit分页说明 1、LIMIT接受一个或两个数字参数。 2、参数必须是一个整数常量 3、如果给定两个参数&#xff0c;第一个参数指定返回记录行的偏移量…