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

这篇具有很好参考价值的文章主要介绍了【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 简介

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

2. 设计思想

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

3. 流程图

stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm

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))
应用到本文得:
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
其中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
由先验估计有系统参数
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
系统过程协方差Q定义
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm

令D( angle ) = Q_angle ,D( Q_bias ) = Q_gyro
设上一次预测协方差矩阵为P(k-1)
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
本次预测协方差矩阵P(k)
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
将以上参数带入预测协方差公式得:
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
代码如下↓

	/*
	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:
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
带入本文得:
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
代码如下↓

	/*
		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)]
带入本文得:
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
代码如下↓

	/*
		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)
带入本文得
stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm
代码如下↓

	/*
		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];
}

卡尔曼滤波效果

stm32卡尔曼滤波算法,Algorithm,C语言,算法,stm32,arm

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

参考资料:
图说卡尔曼滤波,一份通俗易懂的教程
从放弃到精通!卡尔曼滤波从理论到实践~
CH32读取MPU6050姿态数据(卡尔曼滤波法)文章来源地址https://www.toymoban.com/news/detail-789005.html

到了这里,关于【算法】基于STM32的MPU6050卡尔曼滤波算法(入门级)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mpu6050卡尔曼滤波C语言代码

    写在前面:目前网上很多卡尔曼滤波的c语言代码有一些小问题,且不方便移植,写这个博客的目前是想提供一个直接复制粘贴就能使用的c语言代码,理论推导部分请参考别的博客。

    2024年02月16日
    浏览(40)
  • Arduino云台,关键是可以调角度!!!基于MPU6050,用卡尔曼滤波进行角度处理,保证你能一次过学会从硬件到软件的制做!!!(第一节)

    哈哈哈,我又来啦!!!    大家好啊!我是菜鸟啊啊啊,今天给大家带来的是Arduino云台,云台分为处理部分和执行部分,执行部分只需要用电机驱动就可以了,但是菜鸟这边只不过是用舵机就可以了因为经费这东西不支持我大手大脚,所以才选用了较为便宜的SG90舵机,下面是

    2024年02月14日
    浏览(38)
  • STM32无人机-四轴四元数姿态解算与卡尔曼滤波

    MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。 什么是四元数 这部分很难,新手知道四元数的功能是将 6 轴传感器数据转化为三轴姿态角度数据即可。 四元数解算程序店家已经封装成一个函数,输入 MPU6050 数值,解算周

    2024年02月03日
    浏览(41)
  • 基于卡尔曼滤波的视频跟踪,基于卡尔曼滤波的运动小球跟踪

    完整代码和数据下载链接:基于卡尔曼滤波的视频跟踪,基于卡尔曼滤波的运动小球跟踪(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738577 卡尔曼滤波原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析

    2024年02月02日
    浏览(46)
  • 【算法系列】卡尔曼滤波算法

    ·【算法系列】卡尔曼滤波算法 ·【算法系列】非线性最小二乘求解-直接求解法 ·【算法系列】非线性最小二乘求解-梯度下降法 ·【算法系列】非线性最小二乘-高斯牛顿法  ·【算法系列】非线性最小二乘-列文伯格马夸尔和狗腿算法  文章目录 系列文章 文章目录 前言 一、

    2024年02月12日
    浏览(38)
  • 算法介绍及实现——卡尔曼滤波

            本文主要介绍卡尔曼滤波的推导过程及建模步骤,是网站的学习笔记。本文主要是通过例子来引出卡尔曼滤波的建模思想及算法步骤。 参考网站:(这个网站讲得真的很详细很清楚,层层递进,逻辑清晰) Kalman Filter Tutorial https://www.kalmanfilter.net/ 目录 一、引言

    2024年02月14日
    浏览(41)
  • 卡尔曼滤波算法原理及示例

      例程:物体做匀速运动每秒运动1m,观测器观测方差为1m

    2024年02月15日
    浏览(39)
  • SOC计算方法:卡尔曼滤波算法

    卡尔曼滤波算法 是一种经典的状态估计算法,它广泛应用于控制领域和信号处理领域。在电动汽车领域中,卡尔曼滤波算法也被广泛应用于电池管理系统中的电池状态估计。其中,电池的状态包括电池的剩余容量(SOC)、内阻、温度等。 并且 卡尔曼滤波法 也是一种比较精确

    2024年02月02日
    浏览(35)
  • 【MATLAB源码-第106期】基于matlab的SAR雷达系统仿真,实现雷达目标跟踪功能,使用卡尔曼滤波算法。

    1. 雷达系统参数设定:    - 工作频率:选择一个适合的工作频率,例如X波段(8-12 GHz)。    - 脉冲重复频率(PRF):设定一个适当的PRF,确保雷达覆盖所需的范围。    - 天线增益和波束宽度:根据目标探测的需求确定天线的增益和波束宽度。 2. 目标和环境模拟:

    2024年01月16日
    浏览(57)
  • 滤波算法 | 无迹卡尔曼滤波(UKF)算法及其MATLAB实现

    本文接着分享位姿跟踪和滤波算法中用到的一些常用程序,希望为后来者减少一些基础性内容的工作时间。以往分享总结见文章:位姿跟踪 | 相关内容目录和链接总结(不断更新中~~~) 本文分享无迹卡尔曼滤波(UKF)算法的一些基本公式和MATLAB程序。 首先简单介绍一下UKF滤

    2023年04月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包