0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IMU姿态滤波算法——Mahony算法:原理与代码

3D视觉工坊 来源:计算机视觉工坊 2023-05-22 09:18 次阅读
eb0faa88-f82b-11ed-90ce-dac502259ad0.png

1 前言

Mahony算法常见的姿态融合算法,根据加速度计、陀螺仪、以及磁力计,融合计算机体四元数,计算速度快、精度较高。本文介绍六轴融合,即根据加速度计和陀螺仪数据,计算姿态。
我们需要计算的是机体的姿态。计算角度可以通过角速度积分,也可以通过加速度正交分解,但这两种方法都存在缺陷。角速度的误差会随着积分不断增大,而加速度存在高频噪声,因此希望融合两种数据。

2 算法

2.1 重力对齐误差

首先要指出的是,Mahony算法假设加速度计测量的加速度完全由重力提供,即物体本体运动产生的加速度可忽略不计。在这一假设下,我们假设当前时刻机体的姿态为,则将重力向量的表示转到机体坐标系下,应该为:,这里表示四元数对应的旋转矩阵:

进一步地,带入,得到

我们计加速度计测量得到的加速度,如果此时没有误差,应该有,但实际两个向量并不重合,存在一定的误差 。

为表示出,可以利用向量的叉乘:。因为叉乘的定义为:,当归一化为单位向量时,反应的就是角度。这里更准确的写为,下一时刻{t+1}时的误差为:

其中 为根据当前{t}时刻估计的角度四元数。再记这个误差的积分量为:

误差的积分量也参与了后续计算。

2.2 角速度融合

此时已经计算出加速度计观测出的误差了,记陀螺仪提供的角速度为,则把陀螺仪角速度的误差加上上述的误差,采用控制中常用的比例-积分控制器思想,

得到纠正的角速度。

讨论:为什么用叉乘?

陀螺仪由于本身精度问题,测量的角速度存在误差,在积分过程中这个误差会一直累加,我们要做的就是去消除或是补偿这个误差,因为加速度计长期的测量值是准确的,所以可以用加速度计来进行修正。如何找到一个另一个角速度量纲的值来修正陀螺仪的角速度值呢?这里明明只有陀螺仪可以测量角速度!这时候前面提到的向量叉积得到的误差向量就帮上大忙了,这个误差向量不就是反映出了角度变化量吗。算法巧妙的将加速度相关量转化为角度相关量,因而可以用这个角度值乘一个系数来修正陀螺仪的角速度,因为在偏差角度很小的情况下,我们可以将陀螺仪角速度误差和加速度计求得的角度差看做正比的关系,也就说明陀螺仪积分误差和向量叉积存在正比关系。[2]

欢迎关注微信公众号「3D视觉工坊」,加群/文章投稿/课程主讲,请加微信:QYong2014,添加时请备注:加群/投稿/主讲申请

方向主要包括:3D视觉领域各细分方向,比如相机标定|三维点云|三维重建|视觉/激光SLAM|感知|控制规划|模型部署|3D目标检测|TOF|多传感器融合|AR|VR|编程基础等。

2.3 计算下一时刻四元数

此时我们已经获取了下一时刻纠正后的角速度 ,这时候需要计算下一时刻的角度。
我们知道[3]四元数对时间的导数与角速度的关系为 ,即有

此时,再采用欧拉积分[4],即可得到下一时刻姿态与当前时刻姿态的关系:

从而完成了下一时刻姿态的计算。

3 核心代码解析

我们以Matlab代码为例,结合上述内容进行介绍:

functionobj=UpdateIMU(obj,Gyroscope,Accelerometer)
q=obj.Quaternion;%当前时刻的四元数
%归一化加速度计测量数据
if(norm(Accelerometer)==0),return;end%handleNaN
Accelerometer=Accelerometer/norm(Accelerometer);%normalisemagnitude

%计算重力在当前四元数位姿下的分量,即上述公式(2)
v=[2*(q(2)*q(4)-q(1)*q(3))
2*(q(1)*q(2)+q(3)*q(4))
q(1)^2-q(2)^2-q(3)^2+q(4)^2];

%计算重力分量与加速度计的测量误差,上述公式(3)
e=cross(Accelerometer,v);
if(obj.Ki>0)
obj.eInt=obj.eInt+e*obj.SamplePeriod;%计算误差的积分,公式(4)
else
obj.eInt=[000];
end

%角速度融合,公式(5)
Gyroscope=Gyroscope+obj.Kp*e+obj.Ki*obj.eInt;

%公式(6)
qDot=0.5*quaternProd(q,[0Gyroscope(1)Gyroscope(2)Gyroscope(3)]);

%欧拉积分计算下一时刻四元数,公式(7)
q=q+qDot*obj.SamplePeriod;
obj.Quaternion=q/norm(q);%结果归一化
end

4 完整代码获取

官方C++/Matlab/C#代码:https://x-io.co.uk/open-source-imu-and-ahrs-algorithms/
官方python代码:https://github.com/xioTechnologies/Fusion/tree/main/Python
第三方python姿态解算库:https://ahrs.readthedocs.io/en/latest/filters/mahony.html

审核编辑 :李倩


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

    关注

    23

    文章

    4456

    浏览量

    90759
  • 加速度计
    +关注

    关注

    6

    文章

    661

    浏览量

    45420
  • 滤波算法
    +关注

    关注

    2

    文章

    82

    浏览量

    13661
收藏 人收藏

    评论

    相关推荐

    理解Mahony滤波算法的实现过程

    之前调试基于QMI8658 6轴姿态解算的时候,我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让我对四元数、欧拉角、旋转余弦矩阵有了一定的接触。然而,直到我将地磁传感器加
    的头像 发表于 11-13 10:55 749次阅读
    理解<b class='flag-5'>Mahony</b><b class='flag-5'>滤波</b><b class='flag-5'>算法</b>的实现过程

    姿态解算(mahony算法):欧拉角的验证

    使用MPU9250传感器,测量某一位置的九轴数据,将数据存到数组里(大概6000个点),把数据放到MATLAB里的算法中计算,得出这个位置的欧拉角,但是始终偏航角有问题,其他角是对的,请问有没有遇到类似问题的?
    发表于 05-17 21:41

    无人机设计中姿态检测算法姿态控制算法有什么区别 ?

    无人机设计中姿态检测算法姿态控制算法有什么区别 ?推荐课程:张飞四旋翼飞行器视频套件,76小时吃透四轴算法http://t.elecfan
    发表于 07-14 12:12

    请问IMU和AHRS算法用stm32如何实现?

    最近在一直研究四轴的一些东西,不过听到学长说四轴用IMU算法比较好,所以我想问一下IMU 和AHRS算法用stm32如何实现呢?他们的区别是什么?哪个更好一些呢???求各位i解答!!
    发表于 04-19 06:36

    四轴基础算法学习——IMU输入滤波算法

    处理器读取陀螺仪加速度计数据后首先需要对数据进行滤波处理,此文分析比较几种常用的滤波算法IMUIMU使用MPU9250(即MPU650
    发表于 06-11 08:00

    姿态融合算法是什么

    作者:Joy Yang1.什么是姿态融合算法简单来说,姿态融合算法就是融合多种运动传感器数据(一般需要3轴加速度, 3轴陀螺仪或者3轴地磁感应传感器),通过数字
    发表于 07-19 06:47

    PID算法代码实现

    目录一. 绪论二. 角度环串级PID原理1. PID基本算法2. 姿态角串级PID原理三. 如何用STM32实现角度-角速度的串级PID控制1. PID算法代码实现2. 串级PID
    发表于 08-17 06:44

    姿态解算算法模块理解

    了解或想开发无人机的朋友肯定绕不过姿态解算这茬,花点时间去了解它们原理并不难,这里提供两个原理链接供大家参考:四元数表示旋转的理解四旋翼姿态解算原理而在代码实现方面,我这里写好了姿态
    发表于 01-11 07:06

    四轴的姿态进行采样用通常是用什么滤波算法进行滤波的?

    四轴的姿态进行采样用通常是用什么滤波算法进行滤波
    发表于 10-09 06:42

    LINS算法的框架与代码分析

    LINS是以滤波为主的IMU、激光雷达紧耦合的激光SLAM算法。该算法的主要创新点就是用以 IESKF(即迭代误差卡尔曼)为框架,融合 IMU
    的头像 发表于 10-09 14:57 2430次阅读

    Mahony算法常见的姿态融合算法

    首先要指出的是,Mahony算法假设加速度计测量的加速度完全由重力提供,即物体本体运动产生的加速度可忽略不计。在这一假设下,我们假设当前时刻机体的姿态为,则将重力向量的表示转到机体坐标系下,应该为:,这里表示四元数对应的旋转矩阵
    的头像 发表于 05-22 09:22 1424次阅读
    <b class='flag-5'>Mahony</b><b class='flag-5'>算法</b>常见的<b class='flag-5'>姿态</b>融合<b class='flag-5'>算法</b>

    经典的滤波算法:Madgwick滤波算法

    Madgwick算法Mahony算法相比,最大的不同之处是如何对待加速度计估计的误差。Mahony是利用叉乘,Madgwick是利用优化;
    的头像 发表于 05-31 11:12 1627次阅读
    经典的<b class='flag-5'>滤波</b><b class='flag-5'>算法</b>:Madgwick<b class='flag-5'>滤波</b><b class='flag-5'>算法</b>

    Mahony滤波器的原理和公式推导

      1. 概述 在进行代码分析之前,了解Mahony滤波器的原理和公式推导是必要的。Mahony滤波器是一种基于四元数的
    的头像 发表于 06-17 11:18 1824次阅读
    <b class='flag-5'>Mahony</b><b class='flag-5'>滤波</b>器的原理和公式推导

    MPU6050使用互补滤波与卡尔曼滤波算法进行姿态解算

    MPU6050使用互补滤波与卡尔曼滤波算法进行姿态解算
    发表于 08-07 15:46 2次下载

    Mahony滤波算法参数自动调节方法介绍

    Mahony滤波算法参数自动调节方法是一种用于姿态估计的滤波算法
    的头像 发表于 12-06 09:45 415次阅读