【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)

2023-05-16

1. 简介

卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。详情见:卡尔曼滤波简介
MPU6050的解算主要有三种姿态融合算法:四元数法 、一阶互补算法和卡尔曼滤波算法。我们常用的DMP库使用的是四元数法,本文采用卡尔曼滤波算法,使用RT-Thread国产操作系统,利用env工具进行串口、模拟IIC环境配置,使用10ms的线程进行卡尔曼滤波解算。

2. 设计思想

因为MPU6050没有包含磁力计,故无法对yaw轴运用卡尔曼滤波算法。利用MPU6050中加速度传感器采集到的xyz轴的加速度和陀螺仪采集到的xyz轴的角速度,进行进一步处理,得到pitch轴和roll轴的原始角度,利用原始角度和角速度进行卡尔曼滤波处理,最终得到滤波后的角度数据。

3. 流程图

在这里插入图片描述

4. 计算公式及源代码

在此公布所有计算公式和部分源代码,所有源代码请见最下方的下载链接

卡尔曼参数

static float Q_angle = 0.001;		//角度数据置信度,角度噪声的协方差
static float Q_gyro  = 0.003;		//角速度数据置信度,角速度噪声的协方差  
static float R_angle = 0.5;			//加速度计测量噪声的协方差
static float dt      = 0.01;		//采样周期即计算任务周期10ms
static float Q_bias;				//Q_bias:陀螺仪的偏差
static float K_0, K_1;				//卡尔曼增益  K_0:用于计算最优估计值  K_1:用于计算最优估计值的偏差
static float PP[2][2] = { { 1, 0 },{ 0, 1 } };//过程协方差矩阵P,初始值为单位阵

(1)进行先验估计计算

先验估计方程,公式1:X(k|k-1) = AX(k-1|k-1) + BU(k) + (W(k))
应用到本文得:
在这里插入图片描述
其中newGyro代表陀螺仪测得得角速度,代码如下↓

	/*
	1. 先验估计
* * *公式1:X(k|k-1) = AX(k-1|k-1) + BU(k) + (W(k))

		X = (Angle,Q_bias)
		A(1,1) = 1,A(1,2) = -dt
		A(2,1) = 0,A(2,2) = 1
		注:上下连“[”代表矩阵
		预测当前角度值:
		[ angle ] 	[1 -dt][ angle ]   [dt]
		[ Q_bias] = [0  1 ][ Q_bias] + [ 0] * newGyro(加速度计测量值)
		故
		angle = angle - Q_bias*dt + newGyro * dt
		Q_bias = Q_bias
	*/
	pitch_kalman += (gyro - Q_bias) * dt; //状态方程,角度值等于上次最优角度加角速度减零漂后积分

(2)预测协方差矩阵

公式2:P(k|k-1)=AP(k-1|k-1)A^T + Q
由先验估计有系统参数
在这里插入图片描述
系统过程协方差Q定义
在这里插入图片描述

令D( angle ) = Q_angle ,D( Q_bias ) = Q_gyro
设上一次预测协方差矩阵为P(k-1)
在这里插入图片描述
本次预测协方差矩阵P(k)
在这里插入图片描述
将以上参数带入预测协方差公式得:
在这里插入图片描述
代码如下↓

	/*
	2. 预测协方差矩阵
* * *公式2:P(k|k-1)=AP(k-1|k-1)A^T + Q 
	*/
	//由于dt^2太小,故dt^2省略
	PP[0][0] = PP[0][0] + Q_angle - (PP[0][1] + PP[1][0])*dt;
	PP[0][1] = PP[0][1] - PP[1][1]*dt;
	PP[1][0] = PP[1][0] - PP[1][1]*dt;
	PP[1][1] = PP[1][1] + Q_gyro;

(3)建立测量方程

系统测量方程 Z(k) = HX(k) + V(k),其中系统测量系数 H = [1, 0]。
因为陀螺仪输出自带噪声,所以measure = newAngle。

(4)计算卡尔曼增益

卡尔曼增益系数方程,公式3:
在这里插入图片描述
带入本文得:
在这里插入图片描述
代码如下↓

	/*
		4. 计算卡尔曼增益
* * *公式3:Kg(k)= P(k|k-1)H^T/(HP(k|k-1)H^T+R)
				Kg = (K_0,K_1) 对应angle,Q_bias增益
				H = (1,0)
	*/
	K_0 = PP[0][0] / (PP[0][0] + R_angle);
	K_1 = PP[1][0] / (PP[0][0] + R_angle);

(5)计算当前最优化估计值

最优化估计值方程,公式4:X(k|k) = X(k|k-1) + kg(k)[z(k) - HX(k|k-1)]
带入本文得:
在这里插入图片描述
代码如下↓

	/*
		5. 计算当前最优化估计值
* * *公式4:X(k|k) = X(k|k-1) + kg(k)[z(k) - HX(k|k-1)]
		angle = angle + K_0*(newAngle - angle)
		Q_bias = Q_bias + K_1*(newAngle - angle)
	*/
		
	pitch_kalman = pitch_kalman + K_0 * (acc - pitch_kalman);
	Q_bias = Q_bias + K_1 * (acc - pitch_kalman);

(6)更新协方差矩阵

根据误差协方差得到公式5:P(k|k)=[I-Kg(k)H]P(k|k-1)
带入本文得
在这里插入图片描述
代码如下↓

	/*
		6. 更新协方差矩阵
* * *公式5:P(k|k)=[I-Kg(k)H]P(k|k-1)
	*/
	PP[0][0] = PP[0][0] - K_0 * PP[0][0];
	PP[0][1] = PP[0][1] - K_0 * PP[0][1];
	PP[1][0] = PP[1][0] - K_1 * PP[0][0];
	PP[1][1] = PP[1][1] - K_1 * PP[0][1];

下面是roll轴完整处理代码

void Kalman_Cal_Roll(float acc,float gyro) //卡尔曼滤波roll轴计算				
{
	static float Q_bias;	//Q_bias:陀螺仪的偏差  Angle_err:角度偏量 
	static float K_0, K_1;	//卡尔曼增益  K_0:用于计算最优估计值  K_1:用于计算最优估计值的偏差 t_0/1:中间变量
	static float PP[2][2] = { { 1, 0 },{ 0, 1 } };//过程协方差矩阵P,初始值为单位阵
	roll_kalman += (gyro - Q_bias) * dt; //状态方程,角度值等于上次最优角度加角速度减零漂后积分
	PP[0][0] = PP[0][0] + Q_angle - (PP[0][1] + PP[1][0])*dt;
	PP[0][1] = PP[0][1] - PP[1][1]*dt;
	PP[1][0] = PP[1][0] - PP[1][1]*dt;
	PP[1][1] = PP[1][1] + Q_gyro;
	K_0 = PP[0][0] / (PP[0][0] + R_angle);
	K_1 = PP[1][0] / (PP[0][0] + R_angle);
	roll_kalman = roll_kalman + K_0 * (acc - roll_kalman);
	Q_bias = Q_bias + K_1 * (acc - roll_kalman);
	PP[0][0] = PP[0][0] - K_0 * PP[0][0];
	PP[0][1] = PP[0][1] - K_0 * PP[0][1];
	PP[1][0] = PP[1][0] - K_1 * PP[0][0];
	PP[1][1] = PP[1][1] - K_1 * PP[0][1];
}

卡尔曼滤波效果

在这里插入图片描述

完整工程Gitee链接:
https://gitee.com/lebron-meng/rt-thread-kalman-filtering.git

参考资料:
图说卡尔曼滤波,一份通俗易懂的教程
从放弃到精通!卡尔曼滤波从理论到实践~
CH32读取MPU6050姿态数据(卡尔曼滤波法)

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

【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级) 的相关文章

  • 【C#可视化工具开发】(Visual Studio2017)利用echarts——1.界面设计

    C 可视化工具开发 近期在做一个可视化工具 xff0c 有关于指标对标相关内容 xff0c 用自己几乎没学到的Visual Studio 2017疯狂开发 xff08 碰壁 xff09 xff0c 由于总体的可视化工具还没做完 xff0c
  • 使用精灵标注助手生成json文件

    使用精灵助手教程 本文主要介绍如何使用精灵标注助手生成json文件 下载精灵标注助手 下载链接 xff1a http www jinglingbiaozhu com 选择windows版本进行下载 安装方式很简单 xff0c 就是一直nex
  • 关于Nginx配置文件在推流取流时的对应模块作用

    关于Nginx配置文件在推流取流时的对应模块作用 前言 xff1a 前提知识1 xff09 xff1a 取流地址只是我们从用于管理路面监控视频的DVR NVR的IP地址 xff0c 这里只需要知道该地址即可 重点是讲述推流和拉流nginx
  • go语言实战-----30-----token机制微信公众号签名验证的方法、XML解析,CDATA解析、交换协议、接收消息协议、被动回复消息协议、正则表达式

    一 token机制微信公众号签名验证的方法 1 token机制 token机制就是使用一个token 通常是一个字符串 xff0c 长度没有特别限制 xff0c 一般是10字节或者16字节 xff0c 然后按照一定的算法生成签名 xff0c
  • python下划线的5种类型

    python中5中下划线 学习的原文章1链接 学习的原文章2 双前导下划线解释 链接 1 单前导下划线 以单个下划线开头的变量或方法仅供内部使用 xff0c 有私有声明的作用 xff0c 但这并不是python语法的强制规定 xff0c 而
  • JAVA课后习题(一)——我是歌手

    大家好 xff01 我是小黄 xff0c 很高兴又跟大家见面啦 xff01 今天更新的是 xff1a JAVA程序设计课后习题 我是歌手往期检索 xff1a 程序设计学习笔记 目录 创建时间 xff1a 2020年10月23日 软件版本 x
  • 解决git时出现error: src refspec master does not match any问题

    问题复现 xff1a 今天在使用gitee创建仓库后上传写好的代码时报错 在远程关联仓库后无法正常推送 键入下图代码时报错error src refspec master does not match any xxx 解决方法 xff1a
  • 如何购买云服务器----以华为云服务器为例

    进入华为云官网 https activity huaweicloud com 登入自己注册的账户 进入控制台 点击界面里我的资源 弹性云服务器ECS 点击右上角 购买弹性云服务器 按照自己的需求选择 xff0c 重点注意 xff1a 计费方
  • Java编写MapReduce的步骤

    Mapper 自定义类继承Mapper类重写自定义类中的map方法 xff0c 在该方法中将K1和V1转为K2和V2将生成的K2和V2写入上下文中 二 Reduce 自定义类继承Reduce类重写Reducer中的reduce方法 xff0
  • PX4入门及开发指南

    PX4入门及开发指南 用户手册开发者手册 用户手册 https docs px4 cc master zh index html 开发者手册 https dev px4 cc master zh index html
  • 树莓派编译工作空间卡死

    树莓派编译程序时遇到卡死 1 树莓派安装的Ubuntu mate 16 04 系统默认设置的swap交换空间不够 xff0c 而编译某些文件的时候需要较大的交换空间 xff0c 树莓派的交换空间被用满所以树莓派看起来好像是死机了的样子 xf
  • 超好用但是很多人不知道的的串口(网络)调试助手推荐

    小众但是超好用的串口 xff08 网络 xff09 调试助手 前言O ComToll xff08 串口 xff09 格西烽火串口网络调试助手伏特加串口 xff08 网络 xff09 调试助手windows自带的串口调试助手总结 前言 这里的
  • STM32上可用的的SM 2 3 4国密算法

    可在STM32上使用的国密算法 SM 2 3 4 SM2SM3SM4 下面直接给出代码 xff0c 有问题可评论 xff0c 自己改动的 xff0c 测试不到的地方可能有bug xff0c 欢迎指正 SM2 由于SM2算法牵扯到一些较为复杂
  • Stm32下环境传感器-Stlm75-hts221-spg30(Hal)

    Stm32下环境传感器 Stlm75 hts221 spg30 xff08 Hal xff09 简介IIC驱动接口Stlm75hts221Spg30 简介 Stlm75与Hts221都是ST的传感器 xff0c 有官方例程 xff0c 我只
  • vscode makefile编译方法实例

    c出来 o 使用 o出来 bin NB二人组走天下 xff0c 目标 xff1a 依赖 xff0c 下一行tab 加命令 感觉时比较块上手的教程 xff0c 手写AI c语言中文网的makefile c语言中文网的就是按部就班 xff0c
  • 树莓派(三):将你的树莓派进行镜像备份

    0 前言 就像备份电脑一样 xff0c 你一定不想树莓派出错后重新配置树莓派 xff0c 将你的树莓派进行备份 1 建立img镜像文件 随便找一个地方 xff0c 新建一个文本文档 xff0c 命名为 你喜欢的名字 img 这时候就会生成一
  • 接口的理解、接口匿名实现类的创建

    接口的概述 xff1a 一方面 xff0c 有时必须从几个类中派生出一个子类 xff0c 继承它们所有的属性和方法 但是 xff0c Java不支持多重继承 xff0c 有了接口 xff0c 就可以得到多重继承的效果 另一方面 xff0c
  • 关于大疆经纬M100进行二次开发视觉跟踪和视觉SLAM的求助

    本人第一次接触大疆的二次开发 xff0c 现在的需求是使用M100进行二次开发能够实现视觉跟踪目标 xff0c 并能够实现视觉SLAM xff0c 但是我没有接触过二次开发 xff0c 希望各位有过经验的大佬能够不吝留言给我说一下具体实现的
  • 定义一个接口CanFly,描述会飞的方法public void fly();

    1 使用类与接口的知识完成如下要求 xff1a xff08 1 xff09 定义一个接口CanFly xff0c 描述会飞的方法public void fly xff08 2 xff09 分别定义类飞机和鸟 xff0c 实现CanFly接口
  • 在Keil4中新建51单片机工程模板详细步骤

    本文主要介绍51单片机学习和开发中的第一步 新建工程模板 对于刚开始学单片机的同学 xff0c 首先要在电脑上装好MDK4软件和CH340驱动 xff0c 然后也要有一个单片机烧录软件 xff08 一般买回来的单片机附带的资料里都会有这三个

随机推荐

  • Java笔试常用库函数

    字符串转数组 String s span class token operator 61 span span class token string 34 13 34 span span class token punctuation spa
  • Pytorch极简入门教程(十六)——DenseNet提取特征

    Pytorch之DenseNet提取特征 导入必要的模块 span class token keyword import span torch span class token keyword from span torch span cl
  • 1. 创建一个功能包(package)

    一 ros所有的进程都需要在工作空间下进行 首先 xff0c 在 home文件夹 任何目录都可以 下创建一个工作空间 xff1a source span class token operator span opt span class to
  • 谷粒学院知识点总结

    文章目录 前言一 项目功能点1 后台管理系统功能2 前台系统功能3 总结项目技术点 二 项目问题三 项目描述1 总体介绍2 项目功能模块 amp 主要深入的模块3 项目涉及技术 前言 谷粒学院知识点总结 xff0c 准备实习面试 一 项目功
  • Win11家庭版U盘Pe安装

    目录 1 准备材料 2 安装 3 开机 4 需要安装的软件 5 封装 6 发现问题 未解决 1 准备材料 1 win11下载 MSDN 迅雷地址链接 2 驱动总裁 U盘魔术师 地址链接 2 安装 1 做好启动盘后 开机进pe 3 开机 准备
  • Android应用与硬件建立连接

    文章目录 1 建立连接的原理2 信件 和 邮递员 3 对方可能未收到如何处理4 接收 回信 5 多次数据交互6 小结 1 建立连接的原理 在实现软件与硬件交互的时候 xff0c 首先需要了解该硬件的构造 xff0c 运行流程等相关操作 xf
  • 使用Layui时间组件(laydate)

    在一般的程序或者软件业务的操作上 xff0c 通常涉及时间的记录 xff0c 需要记录业务时间 xff0c 或者根据时间来筛 选业务 选择时间 xff0c 可以直接输入 xff0c 也可以弹出日期进行选择 在layui中提供了 xff0c
  • 规范vs代码

    开发工具与关键技术 xff1a VS 作者 xff1a 吴业华 撰写时间 xff1a 2019年7月7号 在我们编程过程中 代码的规范性涉及很大很大 xff0c 有时候即使你的代码打对了 但是依然报错 这份功劳差不多大概都是代码的不规范所收
  • ESP8266_APP连接试验

    ESP8266 APP连接试验 概述硬件部分8266固件烧录Arduino IDE 8266版型下载安装MQTT库ESP8266程序设计 APP部分创建项目UI设计主程序设计 概述 本次试验使用的是ESP8266 NodeMCU 硬件部分
  • ROS安装时rosdep init与rosdep update问题解决方法(2022.04.08亲测)

    2022 4 8更新 xff1a 运行下面的指令即可 span class token function sudo span span class token function apt get span span class token f
  • 【已解决】mmcv/_ext.cpython-37m-x86_64-linux-gnu.so: undefined symbol: _ZN6caffe28TypeMeta21_typeMetaData

    问题描述 使用MMDetection复现论文 xff0c 出现如下Bug xff1a ImportError home quaiping anaconda3 lib python3 7 site packages mmcv ext cpyt
  • g2o图优化简介与基本使用方法

    一 g2o简介 g2o xff08 General Graphic Optimization xff09 是一个基于图优化的库 xff0c 将非线性优化与图论结合起来的理论 xff0c 我们可以利用g2o求解任何可以表示为图优化的最小二乘问
  • Realsense安装使用过程问题汇总

    1 安装失败内核不支持 问题 xff1a 由于我在Ubuntu20 04上进行安装 xff0c 内核版本为5 13 xff0c 而目前realsense最高仅支持到5 4 xff0c 所以内核版本过高需要降低内核版本才能再次编译安装 官方要
  • ROS与STM32通信的实现

    ROS功能包与STM32工程文件 xff1a 蓝奏云 xff1a https huffie lanzouw com iN7w602ti37a 1 通信协议 STM32和ROS端各有一个数据发送函数和数据接收函数 xff0c 发送和接受的数据
  • C语言 字符串最后一位可用’\0‘标示

  • 基于C#的工控上位机软件开发从入门到学废,需要几步?

    基于C 的工控上位机软件开发从入门到学废 xff0c 需要几步 xff1f 随着工控产品的应用 xff0c 开始大幅度渗透进民用领域 涉及的工控产品范围广泛 xff0c 如PLC DCS 变频器 仪表 电机 SCADA 低压及配电元器件等
  • 工作生活篇之第六天

    工作生活篇之第六天 最近由于疫情的影响 xff0c 国家电网也发布了最新消息 xff0c 电费在欠额的情况可继续使用 本来我是以为只有电费欠费可以继续使用 xff0c 没想到燃气费也是 xff0c 最近燃气费不多了 xff0c 然后还得去银
  • 工作生活篇之第九篇

    工作生活篇之第九篇 一直觉得这世上告别仪式挺多的 xff0c 比如喝酒 旅行 xff0c 或干脆痛哭一场 xff0c 可是后来才知道 xff0c 人生中大部分告别是悄无声息的 xff0c 原来某天的相见 xff0c 竟已是最后一面 xff0
  • ROS:查看ROS相关信息的常用方法(三)

    文章目录 一 ROS命令与节点话题查看1 rosnode2 rostopic3 rostopic info 话题名称4 rosrun rqt graph rqt graph 二 rqt工具与节点话题查看 一 ROS命令与节点话题查看 1 r
  • 【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)

    1 简介 卡尔曼滤波 xff08 Kalman filtering xff09 是一种利用线性系统状态方程 xff0c 通过系统输入输出观测数据 xff0c 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 xff0