【EKF】卡尔曼滤波的二维应用实例

news2024/7/30 18:36:20

前言

在上期,使用一个简单的一维应用实例来加深了卡尔曼滤波的印象后,使用一个二维的例子来看一下卡尔曼的效果。使用一个自由落体的例子来说明,假设一个物体在重力作用下,速度由0开始做自由落体运动,有观测装置对该物体的位移进行观测,每 1 秒测量一次数据,规定向下为正,也就是说,加速度 a = g,状态方程的原始模型还是如下的形式:

X(k) = A*X(k-1) + B*u(k-1) + w(k-1)
Z(k) = H*X(k) + v(k)
其中 w 为过程噪声,方差为Q, v 为测量噪声,方差为R

状态方程的建立

根据自由落体的公式,可以建立如下的方程:

速度 v = a*t

位移 s = a*t*t / 2

写成离散的形式为:

速度 v(k) = v(k-1) + a * dt

位移 s(k) = s(k-1) + [v(k-1) + v(k)] * dt / 2

由于 v(k) = v(k-1) + a * dt,因此 s(k) = s(k-1) + v(k-1) * dt + a*dt/2

为了方便计算,我们将 dt 设置为1,也就是 1 秒作为时间间隔进行观测与估算,同时,a = g,那么上式就会简化为:

v(k) = v(k-1) + g

s(k) = s(k-1) + v(k-1) + 0.5 * g

将上式写作状态方程的形式,定义 x1 代表位移,x2 代表速度,x1_dot = x2 (x1的微分就是x2),将x1,x2合并为一个二维的状态矩阵 x

则离散形式的状态方程为:

测量方程为:

z(k) = [1 0]x(k) + r(k)

其中,r 为测量噪声,传感器只能观测位移,不能观测速度

matlab程序编写

同上篇文章的一维应用一样,对系统各个参数先进行赋值,按照上面建模的模型数据进行赋值即可,需要注意的是 Q 矩阵,赋值为 x1 的方差与 x2 的方差:

N = 10;   %采样个数  每1s采样一次,采样100s
temp_real = 0;   %实际距离
%系统状态方程为:
%   X(k) = A*X(k-1) + B*u(k-1) + w(k-1)
%   Z(k) = H*X(k) + v(k)
%   其中 w 为过程噪声,方差为Q,  v 为测量噪声,方差为R
%   u输入为重力加速度 g
A = [1 1; 0 1];  %
B = [0.5;1];
u = 9.8;  %输入为重力加速度
H = [1 0];  %由于是一维系统,因此H矩阵为1
Q = [1^2 0; 0 1^2];  %假定过程噪声的方差为1*1  即加入空气阻力等因素的影响造成的系统建模误差
R = 10.0^2;  %假定测量噪声的方差为1.0*1.0
x_real = temp_real*ones(2,N);   %将实际值赋值二维容器中
x_hat = zeros(2,N);  %先验估计值  二维
xhat = zeros(2,N);  %估计值
z = zeros(1,N);  %位移传感器测量值
P = Q;  %协方差矩阵 初始为Q
P_ = P; %先验协方差矩阵
z(1) = 0;  %初始位移
x_hat(1) = z(1);  %初始估计值
w = sqrt(Q)*randn(2,N);   %过程噪声   方差的开方就是噪声的大小
v = sqrt(R)*randn(1,N);   %测量噪声   方差的开方就是噪声的大小

之后,按照卡尔曼滤波的五大公式,进行数据更新:

在编程时,需要注意一点,在计算卡尔曼增益时,上篇的一维系统,由于矩阵都是一维,因此是可以直接使用 '/' 除号的,但矩阵非一维后,需要使用 inv 来求矩阵的逆来代替除号。

除此之外,在更新实际值时,让真实位移再增加一个在方差范围内的误差,模拟空气阻力等因素的影响:

for k = 2:N
    %修改实际值,让真实温度每次递增 但增量需要在方差以内
    x_real(:,k) = A*x_real(:,k-1) + B * u + w(:,k);
    %获取测量值
    z(k) = H * x_real(:,k) + v(k);  %加入测量噪声
    %计算先验估计值
    x_hat(:,k) = A * xhat(:,k-1);  
    %计算先验协方差
    P_ = A * P * A' + Q;
    %计算卡尔曼增益  由于是二维矩阵,因此不能直接使用/除号,需要使用inv来求逆
    K = (P_ * H') * inv(H * P_ * H' + R);
    %计算后验估计值
    xhat(:,k) = x_hat(:,k) + K * (z(k) - H * x_hat(:,k));
    %更新估计误差协方差
    P = (1 - K * H) * P_;
end

画出数据的对比图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/507383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化部署编译部署【.net core】

自动化部署编译部署【.net core】 github 自动化编译部署 .NET 程序,程序有两个服务,一个是api,一个是admin. 需要部署到两台机器上(测试和正式),所以采用两个Action来处理 项目目录结构 root ├── Config │ ├── deploy …

【Linux】进程间通信 —— 共享内存

文章目录 📕 共享内存的原理📕 代码实现 & 深入理解共享内存shmget() 函数shmctl() 、shmdt()、shmat()特点 📕 源代码comm.hppserver.ccclient.cc 📕 共享内存的原理 我们知道,如果想实现进程间通信,…

Linux Shell 实现一键部署subversion

subversion SVN是subversion的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。 TortoiseSVN TortoiseSVN 是…

C语言函数大全-- t 开头的函数

C语言函数大全 本篇介绍C语言函数大全-- t 开头的函数 1. tan,tanf,tanl 1.1 函数说明 函数声明函数功能double tan(double x)计算 以弧度 x 为单位的角度的正切值(double)float tanf(float x)计算 以弧度 x 为单位的角度的正…

Spring Boot项目创建和使用

一、Spring Boot简介 1.概念 Spring Boot 就是 Spring 框架的脚⼿架,它就是为了快速开发 Spring 框架⽽诞⽣的。 2.优点 有快速集成框架,可以快速添加外部jar包内置web框架,可以直接运行可以快速部署,不依赖任何外部的web容器…

【牛客刷题专栏】0x26:JZ25 合并两个排序的链表(C语言编程题)

前言 个人推荐在牛客网刷题(点击可以跳转),它登陆后会保存刷题记录进度,重新登录时写过的题目代码不会丢失。个人刷题练习系列专栏:个人CSDN牛客刷题专栏。 题目来自:牛客/题库 / 在线编程 / 剑指offer: 目录 前言问…

MATLAB 之 数值数据,矩阵的表示和变量及其操作

文章目录 一、数值数据1. 数值数据类型的分类1.1 整型1.2 浮点型1.3 复型 2. 数据的输出格式 二、矩阵的表示1. 矩阵的建立1.1 直接输入法建立矩阵1.2 已建好的矩阵建立更大的矩阵 2. 冒号表达式3. 矩阵元素的引用3.1 矩阵元素的引用方式3.2 利用冒号表达式获得子矩阵3.3 利用空…

Spring执行流程Bean生命周期

Spring执行流程 说明:这里只是说的大概流程,不是严格按照源码上一步一步说的。 简单来说,分为下边四个步骤: 启动Spring容器实例化Bean(分配内存空间)将Bean注册到Spring当中(存操作&#xf…

【常用 Linux 命令的基本使用】总结篇(附必要的 Ubuntu 截图)

本文目录 1. 常用 Linux 命令的基本使用1.1 学习 Linux 终端命令的原因1.2 常用 Linux 命令的基本使用1.3 自动补全 2. Linux 终端命令格式2.1 终端命令格式2.2 查阅命令帮助信息(了解) 3. 文件和目录常用命令3.1 查看目录内容3.1.1 终端实用技巧3.1.2 l…

shell数组

目录 一:数组定义方法 1、方法一 ​ 2、方法二 ​3、方法三 ​4、方法四 5、判断数组是否完整 (1)方法一 (2)方法二:通过脚本 二:获取数组值 1、获取数组长度 2、获取数组数据列表 3、…

本地部署 Stable Diffusion web UI

本地部署 ChatGLM-6B 0. 什么是 Stable Diffusion1. 什么是 Stable Diffusion web UI2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 Stable Diffusion web UI6. 启动 Stable Diffusion web UI7. 访问 Stable Diffusion web UI8. 其他 0. 什么是 Stable Diffusion S…

UE4 面试题整理

1、new与malloc的区别 new: new首先会去调用operator new函数,申请足够的内存(大多数底层用malloc实现),然后调用类型的构造函数来初始化变量,最后返回自定义类型的指针,delete先调用析构函数&…

IDEA配置使用Git

使用IDEA2018.2.8版本下操作 文章目录 一、安装Git1.GitHub与Git的关系2.Git的安装 二、在IDEA中配置Git三、创建远程仓库和本地仓库1.在gitee上创建远程仓库2.在IDEA上创建本地仓库 四、分支操作1.创建分支2.删除分支3.比较分支4.合并分支 一、安装Git 1.GitHub与Git的关系 …

位运算(算法)

目录 一、位运算的知识点二、位运算的应用1. x & 1一个数补码表示中的第k位数字求补码中含有1的个数偶数位与奇数位分开输出 2. x & (-x)返回x的最后一位1及之后的数字判断一个数是否是2的n次方求补码中含有1的个数 3. x & (x - 1)求补码中含有1的个数(…

Transformer模型各模块详解及代码实现

Transformer 前言1、Transformer模型整体架构2、Embeeding2.1 词向量2.1.1 独热编码2.1.2 Word Embedding2.1.3 总结 2.2 代码实现 3、Positional Encoding3.1 位置编码简介3.2 代码讲解 4、Multi-Head Attention5、Layer Norm6、Positionwise Feed Forward7、Encoder and Deco…

Qt Creator 的使用技巧

1、Qt Creator 的快捷键 在 Qt Creator 里,假若自己不知道某些功能按钮的快捷键是什么,可以将鼠标移至该按钮 上面就可以知道它的快捷键了。如下图,想知道运行的快捷键是什么,那么我们将鼠标移至 Qt Creator 的左下角的运行…

日常开发中代码技巧(个人使用)

日常开发中代码技巧 String,StringBuffer判断非空 String判断非空 参考:https://blog.csdn.net/Echo_width/article/details/79653704 首先,区分空串和null串 1 空串""是长度为0的字符串,它有自己的串长度(…

Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)

文章目录 前言一、小艺读书二、醉酒的狱卒三、非降序数组总结 前言 今天这个非降序数组,阅读解理小学水平,说起来都是泪啊。我折腾了一天都没搞定,从冒泡写到快速排序。换了几种都还不行,我又给快排加上插入排序。结果还是不能全…

MySQL--复合查询--0422

注:为了方便查看 mysql语句会有突然的换行,书写时请勿模仿。 目录 1.单表查询回顾 显示工资最高的员工的名字和工作岗位 显示工资高于平均工资的员工信息 2.多表查询 比如需要查询雇员名字和所在部门编号及部门名字。 显示部门号为10的部门名&…

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志,为国民经济提供重要的终端产品支持,相比较大化工产品,精细化工产品需要高度专业技能和工艺,其生产过程需要复杂的化学反应,以及严格的控制条件,产出的…