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

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姿态数据(卡尔曼滤波法)

  • 62
    点赞
  • 560
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
### 回答1: STM32和MPU605是两种不同的芯片,分别是微控制器和加速度计/陀螺仪模块。而卡尔曼滤波是一种常用的信号处理算法,可以用于对传感器数据进行滤波和估计。在STM32和MPU605的应用中,可以使用卡尔曼滤波来提高数据的精度和稳定性。 ### 回答2: STM32 MPU6050是一种集成MEMS三轴陀螺仪和三轴加速度计的传感器。MPU6050的数据很可能会因为噪声、系统误差等原因包含大量的不确定性,从而影响后续的数据处理和应用。卡尔曼滤波算法是一种常用的处理传感器数据的方法,可以有效地减小噪声和改善数据质量。 卡尔曼滤波算法是一种递归的滤波算法,其基于状态空间模型,利用当前的观测数据和上一个时刻预测的状态,更新系统状态和误差协方差。简单的说,卡尔曼滤波算法可以根据当前的测量值与上一时刻的预测值,推断出当前时刻真实值的概率分布情况,并将其作为后一时刻测量时的先验概率分布。通过这种方式,卡尔曼滤波算法可以在滤除噪声的同时,保留传感器数据的精度和数据特性,从而更好地满足实际应用需求。 在STM32 MPU6050上应用卡尔曼滤波算法,我们需要先获取传感器数据并进行预处理,包括陀螺仪的自校准和加速度计数据的旋转矩阵变换。然后,我们可以利用卡尔曼滤波算法对传感器数据进行滤波处理,得到更加精确和可靠的数据。 具体而言,STM32 MPU6050卡尔曼滤波可以采用如下步骤进行: 1. 系统模型设计:将传感器系统状态和测量状态设计为状态向量,并建立状态转移方程和观测方程。 2. 状态预测:根据上一时刻的状态向量和外部因素,预测当前时刻的状态向量和误差协方差矩阵。 3. 观测更新:利用当前传感器数据更新状态向量和误差协方差矩阵,并计算当前时刻的后验概率分布。 4. 重复迭代:重复进行状态预测和观测更新,直到滤波结束。 需要注意的是,卡尔曼滤波算法并不是适用于所有应用场景的万能解决方案,它的表现好坏取决于应用环境、传感器性能、算法实现等多种因素。因此,在实际应用过程中,我们需要仔细考虑卡尔曼滤波算法的合适性和可靠性,并根据实际需求进行调整和优化,以达到最佳的滤波效果。 ### 回答3: 首先,STM32是一种32位微控制器,它被广泛应用于工业和嵌入式系统中。而MPU6050是一种集成了3轴加速度测量仪和3轴陀螺仪的惯性测量单元(IMU),它可以用于飞行器的姿态控制、运动检测等领域。 卡尔曼滤波是一种广泛应用于估计系统状态的数学方法。它可以通过将系统测量与模型预测进行加权平均,从而对噪声进行滤波和估计。在姿态控制中,卡尔曼滤波可用于将测量和参考姿态状态进行融合,从而得到更精确的姿态估计。而STM32MPU6050结合使用,可以通过编程实现卡尔曼滤波算法,从而实现更好的姿态估计精度。 具体地,可将MPU6050测量得到的加速度和陀螺仪数据作为滤波器的输入,将经过滤波器处理的数据作为输出,然后将加速度和陀螺仪数据的输出与卡尔曼滤波器的预测值进行融合。这将导致更快速和更精确的运动跟踪,从而实现更为准确的姿态控制。 在实际应用中,应注意卡尔曼滤波算法的调试和参数优化。通过对滤波器的参数进行调整,可以提高姿态估计的精度,同时也可以确保算法的可靠性和更快的响应速度。这需要有一定的数学和编程基础,因此需要深入学习卡尔曼滤波算法STM32编程基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C代码工具人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值