CW32L012对MPU6050的数据进行卡尔曼滤波

描述

卡尔曼滤波(最优估计)

一、什么是卡尔曼滤波

通俗理解卡尔曼滤波:一个「会自动调权重的裁判」

卡尔曼滤波解决的核心问题是:你有两个途径(测量和预估得到)知道同一个东西的状态,但这两个途径都不准,卡尔曼帮你算出最准的结果

最优估计公式:

加速度计

加速度计

加速度计

二、为什么这里要用卡尔曼

下面是MPU6050加速度计和陀螺仪的优缺点:

加速度计

加速度计

总的来说:

陀螺仪动态的时候输出的值精准,但是静止的时候会有漂移

而加速度计就反过来了,加速度计静态的时候输出的值准,但是动态特性差

MPU6050 的陀螺仪和加速度计是 “天生的互补搭档”,但单靠其中一个或简单滤波,要么漂移、要么动态失真;而卡尔曼滤波的核心是 “动态加权的最优估计” —— 它能根据 MPU6050 的工作状态(静态 / 动态),自动判断两个传感器的可靠性,把陀螺仪的 “动态精准” 和加速度计的 “静态稳定” 结合起来,最终输出既无漂移、又能快速响应的 roll/pitch 角度,这是其他滤波方式无法实现的。

三、卡尔曼滤波实现

一、思路

根据之前的内容,我们已经得到了加速度计解算的roll和pitch,以及角速度计解算的roll、pitch、yaw,因为加速度计无法解算yaw,所以这里只对roll和pitch做数据融合

卡尔曼最优估计的核心目标是融合 “加速度计解算的角度” 和 “陀螺仪角速度积分的角度”,最终输出最优的角度估计。整体逻辑分为两大阶段:

预测阶段:基于陀螺仪角速度(扣除偏置后)积分,预测当前角度;同时更新状态误差协方差矩阵 P(反映估计的不确定性)。

更新阶段:用加速度计的角度作为观测值修正预测值,得到最优角度;同时修正陀螺仪偏置(补偿零漂),并更新协方差矩阵 P。

二、具体实现

2.1预测阶段(先验估计)

状态预测:用陀螺仪积分预测角度

加速度计

对应代码:

 

// 预测阶段:更新角度预测
    float rate = newRate - *kalmanBias;  // 真实角速度 = 测量角速度 - 偏置
    *kalmanAngle += dt * rate;           //角度预测:θ_k = θ_{k-1}+ dt*(ω - b)

 

协方差预测:更新估计的不确定性

加速度计

先计算:

加速度计

再加上Q得到:

加速度计

对应代码:

 

 kalmanP[0][0] += dt * (dt * kalmanP[1][1] - kalmanP[0][1] - kalmanP[1][0] + Q_ANGLE);
    kalmanP[0][1] -= dt * kalmanP[1][1];
    kalmanP[1][0] -= dt * kalmanP[1][1];
    kalmanP[1][1] += Q_BIAS * dt;

 

2.2更新阶段(后验修正)

残差(创新项):观测值与预测值的偏差

加速度计

卡尔曼增益:权衡 “预测” 和 “观测” 的可信度

加速度计

对应代码:

 

  // 计算卡尔曼增益K
    float S = kalmanP[0][0] + R_MEASURE;  // 角度方差+测量噪声方差(R)
    float K[2];
    K[0] = kalmanP[0][0] / S;
    K[1] = kalmanP[1][0] / S;

 

状态更新:修正预测值,得到最优估计

加速度计

对应代码:

 

  // 更新阶段:利用加速度计测量值修正预测角度
    float y = newAngle - *kalmanAngle;  // 改用传入的角度
    *kalmanAngle += K[0] * y;           // 修正角度
    *kalmanBias += K[1] * y;            // 修正偏置

 

协方差更新:修正估计的不确定性

加速度计

对应代码:

 

  // 更新协方差矩阵P
    float P00_temp = kalmanP[0][0];
    float P01_temp = kalmanP[0][1];
    kalmanP[0][0] -= K[0] * P00_temp;
    kalmanP[0][1] -= K[0] * P01_temp;
    kalmanP[1][0] -= K[1] * P00_temp;
    kalmanP[1][1] -= K[1] * P01_temp;

 

匿名上位机通信

一、为何用匿名上位机调试

匿名上位机是一款由国内开发者打造、面向嵌入式开发场景的开源 / 低成本 PC 端调试工具,相比普通串口助手只能显示一串冰冷的欧拉角数字,匿名上位机可将 Roll/Pitch/Yaw 以实时曲线、数值仪表盘、3D 模型姿态仿真等形式呈现 —— 当我们晃动搭载 MPU6050 的 CW32L012 开发板时,上位机的 3D 模型会同步倾斜、转向,曲线会实时跟踪欧拉角数值变化,你能快速判断卡尔曼融合后的姿态解算是否准确(如零漂是否被抑制、动态晃动时欧拉角是否无明显跳变),无需逐行核对数字。

二、通信帧格式

加速度计

初始化L012串口,并根据通信格式编写匿名上位机的通信驱动:

程序实际现象

【CW32L012解算MPU6050的姿态数据并进行卡尔曼滤波的方法-哔哩哔哩】

https://b23.tv/2GZqcIg

一、开发板现象:

加速度计

OLED屏幕实时显示解算的三轴角度

二、匿名上位机现象

【CW32L012使用MPU6050介绍-哔哩哔哩】 https://b23.tv/fi7hCnw

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分