调试 Mahony 滤波算法的思考 10

2023-11-09 18:44

本文主要是介绍调试 Mahony 滤波算法的思考 10,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

调试 Mahony 滤波算法的思考

    • 1. 说在前面的
    • 2.Mahony滤波算法的核心思想
    • 3. 易懂的理解 Mahony 滤波算法的过程
    • 4. 其他的一些思考
    • 5. 民间 9轴评估板

1. 说在前面的

之前调试基于QMI8658 6轴姿态解算的时候,我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让我对四元数、欧拉角、旋转余弦矩阵有了一定的接触。然而,直到我将地磁传感器加入到我的硬件,进行9轴姿态解算时,我深深地感受到对四元数与姿态阵之间关系的理解是非常重要的。在此之前,我检索了网络文章,并记录了《MEMS_惯性传感器09 - Mahony姿态解算算法详解》、《MEMS_惯性传感器14 - Mahony滤波算法的代码分析》两篇文章。可能对于大佬、资深工程师来说,这些文章的严谨性不够,可能会误导别人。但我必须承认,我仍然没有扎实的数学计算研究背后更深层次的理论。即使如此,我依然希望通过自己的努力在惯性导航算法上学习得更深入一些。同时,我也想多记录一些学到的知识,多记录一些自己的理解和思考。希望这些记录能帮助到一些初学者。如果我的文章有错误的引导,我非常希望大佬们能够指正,因为这对我来说是最大的收获,我非常乐意倾听和学习。

我愿意自我突围,向着理想前进!

这次学习检索时发现了一个博文内容硬核、有理有据的博主1路痴导航员。 她的博文 《AHRS互补滤波(Mahony)算法及开源代码》对我帮助很大。

2.Mahony滤波算法的核心思想

Mahony滤波算法的核心思想是通过将角速度角度的测量值与历史估计值进行加权平均,从而得到更加准确的姿态估计结果。同时,滤波算法还利用加速度计的测量值来纠正姿态角度的漂移。
该算法也存在一些缺点,例如对于快速旋转和加速度变化较大的情况,其姿态估计结果可能会出现较大的误差。

3. 易懂的理解 Mahony 滤波算法的过程

为了更好的理解,表达是先不用矩阵的思想,在算法的实现的过程中,需要将表达是转换成矩阵形式。

① 根据陀螺仪的测量数据计算出角速度的增量,即:
         Δθ = 0.5 * (gyro + bias) * Δt

其中,gyro表示陀螺仪的测量值,bias表示陀螺仪的零偏误差,Δt表示时间间隔。

② 根据加速度计的测量数据计算出重力方向的估计值,即:
         g_est = q * (0, 0, -1) * q^-1

其中,q表示四元数的姿态估计值。

③ 根据加速度计的测量数据和重力方向的估计值,计算出加速度计的误差,即:
         acc_err = acc_meas - g_est

其中,acc_meas表示加速度计的测量值。

④ 根据角速度的增量和加速度计的误差,更新四元数的姿态估计值,即:
         q = q * exp(Δθ - K * acc_err)

其中,K为控制增益。

4. 其他的一些思考

  • 传感器EVB板的测量数据以载体坐标系(b-框架)表示。 欧拉角的直观表示描述了地理坐标系中的角度,其中包括重力的影响。 地理坐标系中的重力矢量为[0,0,1]g,磁传感器将地球磁场中的强度表示为[cos(θ),0,sin(θ)]guess。因此,在算法中,加速度和磁数据被归一化,确保它们的模是一定大小的。

  • 四元数从地理坐标系(东北天)转换到载体坐标系,就得到了旋转矩阵Cnb。
    在这里插入图片描述
    Cnb的最后一列取负,即将其转换为载体坐标系中的值。在理想情况下,如果没有误差,这个矢量应该与测量值相等。然而,由于这两者总会存在差异,因此我们需要利用它们之间的差值来修正陀螺仪更新的不准确性。

  • 在修正的过程中,我们认为加速度计测量的可信度较高,还需要使用地磁传感来修正加速度传感的Z轴。磁力计的模的长度是确定的,但是两个分量的具体大小无法像重力加速度一样确定。因此,我们使用上一次的四元数得到的Cbn(从载体到地理坐标系的旋转矩阵)来计算测量的磁场强度。理论上,此刻的Cbn应该在东向上的分量是零[cos(θ),0,sin(θ)],而北向和地向会有分量。然而,由于此刻的Cbn尚未得到,我们使用的是上一次的Cbn,并加上一些测量误差,导致东向上仍会有分量存在。为了处理这种情况,我们将xy平面的分量合成到一个方向上,使得y轴上的分量为0。这样,处理后的地磁信息的地位就与重力加速度(0,0,-1)相似了。

  • 根据余弦矩阵和欧拉角的定义,我们可以将地理坐标系的重力向量转换到载体坐标系中。具体而言,将四元数转换成方向余弦矩阵后,我们可以得到方向余弦矩阵的第三列的三个元素,即vx、vy和vz。这三个元素实际上表示了当前欧拉角(即四元数)在载体坐标系上换算得到的重力单位向量。

vx = 2*(q1q3 - q0q2);
vy = 2*(q0q1 + q2q3);
vz = q0q0 - q1q1 - q2q2 + q3q3;
  • ax\ay\az是载体坐标参照系上,加速度计测出来的重力向量。vx\vy\vz是陀螺积分后的姿态推算出的重力向量。它们之间的误差向量ex\ey\ez是陀螺积分后的姿态和加计测出来的姿态之间的误差。误差向量可以用向量叉积来表示。叉积向量ex\ey\ez位于载体坐标系上,且其大小与陀螺积分误差成正比,可用于纠正陀螺。由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对载体坐标系的纠正。
exInt = exInt + ex * Ki * halfT;
eyInt = eyInt + ey * Ki * halfT;    
ezInt = ezInt + ez * Ki * halfT;
// 用叉积误差来做PI修正陀螺零偏
gx = gx + Kpex + exInt;gy = gy + Kpey + eyInt;
gz = gz + Kp*ez + ezInt;

矢量之间的叉乘公式为err = A × B = |A| × |B| × sin(β)。当两个矢量重合时,误差为零,表示没有差异。当两个矢量之间夹角为90°时,误差达到最大值,表示差异最大。然而,在夹角为90°附近的区间内,误差的变化是非线性的,这可能导致一些准确性问题。

5. 民间 9轴评估板

QMI8658+QMC5883L 链接

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


  1. 路痴导航员: ↩︎

这篇关于调试 Mahony 滤波算法的思考 10的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/377923

相关文章

关于rpc长连接与短连接的思考记录

《关于rpc长连接与短连接的思考记录》文章总结了RPC项目中长连接和短连接的处理方式,包括RPC和HTTP的长连接与短连接的区别、TCP的保活机制、客户端与服务器的连接模式及其利弊分析,文章强调了在实... 目录rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接与tcp和http的长连接短

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

Open3D 基于法线的双边滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 输入参数: 输出参数: 参数影响: 2.2完整代码 三、实现效果 3.1原始点云 3.2滤波后点云 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客 一、概述         基于法线的双边

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig