STM32的MPU6050卡尔曼滤波融合数据控制平衡车

这篇具有很好参考价值的文章主要介绍了STM32的MPU6050卡尔曼滤波融合数据控制平衡车。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近学习卡尔曼滤波的方法来融合MPU6050的加速度计所得的角度以及陀螺仪的角速度数据。一开始去B站搜视频看原理,然后找到CSDN上的一篇博客,参考了初始值的设定后写了下面的滤波算法。 该up主视频讲的很好,视频链接:精通(教你从理论到实践)_哔哩哔哩_bilibili

算法的伪代码如下:

STM32的MPU6050卡尔曼滤波融合数据控制平衡车,stm32,嵌入式硬件,单片机,算法

完全按照着伪代码编写的代码:

float dt=0.005;		  //每5ms进行一次滤波                 
float Kalman_Filter_x(float Accel,float Gyro)		
{
    //Accel:通过加速度计计算的角度,Gyro:陀螺仪输出的角速度,这两个值的获取查一查都有

	static float angle;
	float Q_angle=0.001; // 参考别人的的值
	float Q_gyro=0.003;	//参考别人的的值
	float R_angle=0.5;		// 参考别人的的值

	static float Q_bias, Angle_err;
	static float E;
	static float K_0, K_1;
	static float P[2][2] = { { 1, 0 },{ 0, 1 } };//参考别人的初始值

	angle+=(Gyro - Q_bias) * dt; //先验估计

	P[0][0] += Q_angle -( P[0][1] + P[1][0]) * dt;   // Pk-先验估计误差协方差微分的积分
	P[0][1] += -P[1][1] * dt;   // =先验估计误差协方差
	P[1][0] +=-P[1][1] * dt;
	P[1][1] += Q_gyro;
		
	Angle_err = Accel - angle;	//zk-先验估计
	
	
	E = R_angle + P[0][0];
	
	K_0 = P[0][0] / E;
	K_1 = P[1][0] / E;
	

	P[0][0] -= K_0 * P[0][0];		 //后验估计误差协方差
	P[0][1] -= K_0 * P[0][1];
	P[1][0] -= K_1 * P[0][0];
	P[1][1] -= K_1 * P[0][1];
		
	angle	+= K_0 * Angle_err;	 //后验估计
	Q_bias	+= K_1 * Angle_err;	 //后验估计
	
	return angle;
}

写完后用PID来控制小车,发现小车刚开始可以稳定,但是小车后面幅度越晃越大,最后直接失去平衡。

之后参考了另一篇CSDN博客的代码,将P[0][0]和P[1][1]的先验估计做了修改,令Q_angle和Q_gyro都乘上dt,相当于对协方差矩阵Q乘上dt。这两个值分别代表了加速度算出来的角度方差以及陀螺仪角速度的方差,两个值都与时间相关,当距离上次更新时间越长,那么这两个方差也会越大,就比如陀螺仪积分出来的角度,时间越长,那么偏差累积也会越大。

其实这个操作也就相当于去对Q_angle和Q_gyro进行调节,取到一个更加适合的值,如果dt=0.05,最终的值其实就是Q_angle = 0.00005, Q_gyro = 0.00015。

修改后代码如下:

float Kalman_Filter_y(float Accel,float Gyro)		
{
    //Accel:通过加速度计计算的角度,Gyro:陀螺仪输出的角速度,这两个值的获取查一查都有

	static float angle;
	float Q_angle=0.001; // 参考别人的的值
	float Q_gyro=0.003;	//参考别人的的值
	float R_angle=0.5;		// 参考别人的的值

	static float Q_bias, Angle_err;
	static float E;
	static float K_0, K_1;
	static float P[2][2] = { { 1, 0 },{ 0, 1 } };//参考别人的初始值

	angle+=(Gyro - Q_bias) * dt; //先验估计

	P[0][0] += ( Q_angle -P[0][1] - P[1][0]) * dt;   // 修改了这里
	P[0][1] += -P[1][1] * dt;   // =先验估计误差协方差
	P[1][0] +=-P[1][1] * dt;
	P[1][1] += Q_gyro* dt;  // 修改了这里
		
	Angle_err = Accel - angle;	//zk-先验估计
	
	
	E = R_angle + P[0][0];
	
	K_0 = P[0][0] / E;
	K_1 = P[1][0] / E;
	

	P[0][0] -= K_0 * P[0][0];		 //后验估计误差协方差
	P[0][1] -= K_0 * P[0][1];
	P[1][0] -= K_1 * P[0][0];
	P[1][1] -= K_1 * P[0][1];
		
	angle	+= K_0 * Angle_err;	 //后验估计
	Q_bias	+= K_1 * Angle_err;	 //后验估计
	
	return angle;
}

上电后小车可以平稳运行了。文章来源地址https://www.toymoban.com/news/detail-852363.html

到了这里,关于STM32的MPU6050卡尔曼滤波融合数据控制平衡车的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包