关于线性卡尔曼滤波详细讲解(二)--GPS融合IMU数据

2023-05-16

上次我们说了卡尔曼最核心的五个公式,还有一些上次没有说的东西,这次也补全,其实在我们实际需求中,只知道这五个公式,却不知道怎么去根据自己的需求去初始化各种状态转移矩阵之类的,问了一些人很多人会说根据你的模型去建立,然后又陷入了沉思,什么是模型,或者说怎么去建立一个模型,其实这时候个人建议就是根据一个实例去推导卡尔曼的核心公式,深入的理解状态转移矩阵到底是什么,为什么这么定义,然后再根据自己的模型去建立一个矩阵,下面就用matlab去仿真一个例子。

首先我们说我们经常见到的例子也是网上很多都能搜出来的就是什么小车运动,网上也有例子,当你懂了卡尔曼滤波的时候什么状态向量啊,什么状态转移矩阵啊,一眼就知道什么意思了,但是刚接触或者接触不就的肯定会懵掉的,我们先拿一个对室内温度进行卡尔曼滤波的一个实例来分析。

室内温度只有一个状态向量,那就是温度值,根据第一个状态预测公式。在这里插入图片描述
这个右边的X(k|k)就是我上一个时刻算出的最优估计值,Φ就是状态转移矩阵,因为只有一个状态向量,那么我们的状态转移矩阵就是1,当然这个状态预测公式是假设我的房间真实值是恒定的,因为在一段时间内,温度不可能是恒定的,那么就要加入噪声,这个噪声我们可以理解为,由于房间内的空气流通造成了房间真实温度的一些波动,这个也被称为过程噪声Q。这是我们在模拟房间的真实温度值,假设我的真实温度是25.1度,我们再加入一些过程噪声Q,那么真实温度模拟后我们还需要一个模拟出来的温度计测出来的值,怎么模拟呢?由于温度计测量的时候也会有误差的,这个噪声我们叫做测量噪声R,假定温度计测量的值为24.9度,那么由于我们的测量数值也是一维的,那么我们的观测矩阵H = 1,我们可以写出一个由温度计测量的实时数据,我们写作数组形式为:

温度计对k时刻房间温度的测量,卡尔曼滤波是站在温度计角度进行的,它自己也不知道此时的真实状态X(k),只能去利用本次的测量值和上一次估计值来做处理,其目标就是卒子大限度的降低测量噪声R的影响,尽可能的逼近X(k)。那么我们用温度计来做一个matlab例子详细讲解。

N = 120%采样点的个数
Xkf = zeros(1,N); %房间各个时刻真实温度值
Z = zeros(1,N);	%观测值,就是温度计测量值
P = zeros(1,N);
%赋初值
X(1) = 25.1%加入初始值房间温度为25.1
P(1) = 0.01%初始值的协方差
Z(1) = 24.9%测量值的初始
Xkf(1) = Z(1);  %初始测量值为24.9度,可以作为滤波器的初始估计状态
%噪声
Q = 0.01;
R = 0.25;
W = sqrt(Q)*randn(1,N); %方差决定噪声的大小
V = sqrt(R)*randn(1,N); %方差决定噪声的大小
%系统矩阵
F = 1;
G = 1;
H = 1;
I = eye(1); %本系统状态为一维
%%%%%%
%以下过程为模拟房间温度和测量值 
for k = 2:N
	X(k) = F*X(k-1) + G*W(k-1);  %真实值 
	Z(k) = H * X(k) + V(k);   %观测值
	%进行卡尔曼滤波
	%两个预测方程,通过上一时刻的滤波值预测下一时刻
	X_pre = F * Xkf(k-1);  %状态预测
	P_pre = F * P(k-1) * F' + Q;  %协方差预测
	%更新方程
	K = P_pre * inv(H * P_pre * H' + R);%计算卡尔曼增益
	e = Z(k) - H * X_pre;	%新息
	Xkf(k) = X_pre + K * e; %状态更新
	P(k) = (1 - K * H) * P_pre; %协方差更新
end
t = 1:N;
plot(t,X,'r',t,Xkf,'g');	

那么仿真结果就是:
在这里插入图片描述

可以看到,绿色的滤波值基本和红色的真实值差不了太多,我们可以看看一看误差分析。

在这里插入图片描述

可以看到经过卡尔曼滤波之后偏差变小了很多,我们可以调整过程噪声的大小或者测量噪声的大小来调整滤波效果,过程噪声就是在你测量过程中的一些因素,比如摩擦力,风的阻力之类的。而测量噪声就是传感器本身存在的一个噪声误差。

卡尔曼滤波后的值就是在Xkf中,那么对于卡尔曼另一个难点还是在怎么建立模型上,很多时候我们都听过用卡尔曼融合两个数据很好,但是具体怎么融合呢,尤其是刚接触的人会很迷茫,查阅很多资料还是无果,看的更是一头雾水,那么就需要花点功夫在推导上,矩阵的维度是不要错的,举个例子,像是无人机的话,如果我们做一个定高,我们需要一个测量值比较准的传感器和加速度计Z轴的加速度做融合,那我们需要的状态转移矩阵就不是1这么简单了,物理中我们都学过如何通过加速度来计算下一时刻的速度和位移。

首先有状态向量Xkf:在这里插入图片描述
那么由此可以得出状态转换矩阵F为:在这里插入图片描述

那么下面的H我就不多说了,大家推一下就出来了,更加深印象。其实融合传感器数据和加速度融合就是通过加速度数据通过物理的那个公式:X = x0+vt+1/2at^2;来预测,通过实测值和预估值的差再乘上一个增益系数来纠正预估值,使其更接近真实值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于线性卡尔曼滤波详细讲解(二)--GPS融合IMU数据 的相关文章

  • ::在c++中的意思

    在c 43 43 中 一 作用域符号 xff1a xff1a 前面是类名称 xff0c 后面一般是该类的成员名称 例类A中包含member1 A member1 二 全局作用域符号 用于区分全局变量和局部变量 xff1a xff1a cha
  • linux下cannot execute binary file: Exec format error解决办法

    对于linux下cannot execute binary file Exec format error明确说明是执行文件格式错误 xff0c 可能情况 xff1a 1 使用错误的命令 xff0c 如gcc c hello c o hell
  • PX4/Pixhawk---uORB深入理解和应用(最新版)

    1 简介 ps 第1章简介是参考 uORB深入理解和应用 1 1 PX4 Pixhawk的软件体系结构 PX4 Pixhawk的软件体系结构主要被分为四个层次 xff0c 这可以让我们更好的理解PX4 Pixhawk的软件架构和运作 xff
  • 深拷贝和浅拷贝的区别

    1 简单理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体 xff0c 而不是引用 假设B复制了A xff0c 修改A的时候 xff0c 看B是否发生变化 xff1a 如果B跟着也变了 xff0c 说明是浅拷贝 xff0c
  • Linux系统下搭建PX4/Pixhawk原生固件编译环境

    对于新版本的固件V1 11 3 在pixhawk官网可以找到开发环境的搭建 xff0c 这里把开发环境链接贴出来 xff1a https docs px4 io master zh dev setup dev env linux ubunt
  • Pixhawk无人机飞行模式详解 (PX4源码)

    我帮大家把飞行模式控制量与特点总结一下 xff0c 方便看代码 xff0c 如下所示 xff1a 辅助模式 Position Mode 位置模式 xff08 定点模式 xff09 横滚俯仰控制角度 xff0c 油门控制上下速度 xff0c
  • pixhawk无人机避障

    本人最近用树莓派结合PX4做无人机避障 xff0c 使用激光雷达 xff0c 有没有一起的小伙伴 xff0c 我们一起交流 xff01 私信我 xff0c
  • 目录前导符不一致解决办法

    最近弄毕业设计 xff0c 写完论文以后发现生成的目录后面的前导码省略号数目 间距不一致 xff0c 非常的难看 xff0c 于是经过仔细研究找到了解决办法 xff1a 首先是问题所在 xff0c 请看下图 xff1a 首先在word中打开
  • 几种编码方式(RZ、NRZ、NRZI、曼彻斯特编码)

    在数字电路中 xff0c 组成一连串信息的基元就是0和1 xff0c 无论是在CPU DSP MCU甚至是个数字计数器中 xff0c 数字电路在其中能够处理的信息也只有0和1 xff0c 而对于任何外界的信息 xff0c 计算机都能通过两个
  • WIN10运行软件,窗口不显示 解决办法

    win10 运行软件后 xff0c 不显示窗口 今天遇到个问题 xff0c 我打开软碟通之后 xff0c 任务栏显示它已经打开了 xff0c 但是窗口就是不显示 xff0c 如下图 xff1a 用alt 43 tab 查看 xff0c 也能
  • 变频器的四大组成部分和工作原理

    随着电子技的发展变频器已经有了很大的变化 xff0c 但其基本原理并没有发生改变 变频器的主要部分有四个 xff1a 整流器 中间电路 逆变器 控制电路 1 xff09 整流器 通用变频器的整流电路是由三相桥式整流桥组成 它的功能是将工频电
  • Pytorch中torch的操作合集

    tensor的基本操作 PyTorch系例 torch Tensor详解和常用操作 这里最重要的概念是索引出来的结果与原数据共享内存 xff0c 也即修改一个 xff0c 另一个也会跟着修改 tensor的广播机制 Pytorch xff1
  • torch.tensor 内存共享机制

    tensor属于可变数据类型 xff0c 因此变量的值存储在堆中 xff0c 变量名存储在栈中 xff0c 当进行变量赋值时 xff0c 就是让栈中的变量指向堆 xff0c 如下面代码 xff1a span class token keyw
  • 熵 KL散度 交叉熵的理解

    熵 KL散度 交叉熵的概念 xff1a 理解二分类交叉熵 可视化的方法解释对数损失交叉熵公式推导 xff1a 理解交叉熵作为损失函数在神经网络中的作用熵 KL散度 交叉熵的关系 xff1a KL散度与交叉熵区别与联系训练过程中三者的应用 x
  • Docker数据目录迁移解决方案

    介绍 在docker的使用中随着下载镜像越来越多 xff0c 构建镜像 运行容器越来越多 数据目录必然会逐渐增大 xff1b 当所有docker镜像 容器对磁盘的使用达到上限时 xff0c 就需要对数据目录进行迁移 如何避免 xff1a 1
  • Git 三剑客 ———— git gui 可视化工具

    目录 页面介绍Unstaged changesStaged Changes xff08 Will Commit xff09 File DisplayCommand Set Repository 操作区Edit 操作区Branch 操作区Co
  • 数组对象转json格式

    1 数组转化成JSON对象后 xff0c key值是索引 xff0c value是数组对应的值 数组也可以转化成JSON对象 var jStr3 61 34 10 20 30 40 50 60 34 var j3 61 JSON parse
  • JS——DOM的结点操作

    H5自定义属性 自定义属性目的 目的 xff1a 是为了保存并且使用数据 有些数据可以把保存到页面中而不用保存到数据库 可以通过getAttribute获取 自定义属性 xff1a data 开头 这是一种规范 dataset xff1a
  • SecureCRT连接Linux

    在将SecureCRT连接Linux上时遇到一些问题 xff0c 记录如下 第一步 xff0c 我们要在在linux上安装openssh server服务 xff0c 并确认打开了22监听端口 在linux上操作命令如下 xff1a apt
  • Linux下添加虚拟串口,接收和发送数据

    之前写的那虚拟串口有点问题 xff0c 只能读取 xff0c 不能接收 今天再来改一下 将python的内容改为如下 xff1a 先新建一个文档 xff0c 内容如下 usr bin env python coding 61 utf 8 i

随机推荐