【姿态解算与滤波算法】

姿态解算

一、主线

姿态表示方式:矩阵表示,轴角表示,欧拉角表示,四元数表示。

惯性测量单元IMUInertial Measurement Unit:MPU6050芯片,包含陀螺仪和加速度计,分别测量三轴加速度和三轴角速度。注意,传感器所测数据是原始数据,包含了噪声,无法直接用于飞行器的姿态解算,因此需要对数据进行滤波。

滤波算法:非线性互补滤波算法,卡尔曼滤波算法,Mahony互补滤波算法。

二、知识点补充

加速度计和陀螺仪

加速度计:加速度计,可以测量加速度,包括外力加速度和重力加速度,因此,当被测物体在静止或匀速运动(匀速直线运动)的时候,加速度计仅仅测量的是重力加速度,而重力加速度与 R 坐标系(绝对坐标系)是固连的,通过这种关系,可以得到加速度计所在平面与地面 的角度关系 也就是横滚角和俯仰角。把加速度传感器水平静止放在桌子上,它的Z轴输出的是1g的加速度。因为它Z轴方向被重力向下拉出了一个形变。可惜的是,加速度传感器不会区分重力加速度与外力加速度。所以,当系统在三维空间做变速运动时,它的输出就不正确了,或者说它的输出不能表明物体的姿态和运动状态。

陀螺仪:陀螺仪测量角速度。陀螺仪模型如图所示,陀螺仪的每个通道检测一个轴的旋转。

1

图2[引自网络] 

上图中,Rxz是R在XZ面上的投影,与Z轴的夹角为Axz。Ryz是R在ZY面上的投影,与Z轴的夹角为Ayz。陀螺仪就是测量上面定义角度的变化率,换句话说,它会输出一个与上面这些角度变化率线性相关的值。

加速度计工作原理介绍(摘自网络)

大多数加速度计可归为两类:数字和模拟。数字加速度计可通过I2C,SPI或USART方式获取信息,而模拟加速度计的输出是一个在预定范围内的电压值,你需要用ADC(模拟量转数字量)模块将其转换为数字值。不管使用什么类型的ADC模块,都会得到一个在一定范围内的数值。例如一个10位ADC模块的输出值范围在0-1023间。假设我们从10位ADC模块得到了以下的三个轴的数据:

每个ADC模块都有一个参考电压,假设在我们的例子中,它是3.3V。要将一个10位的ADC值转成电压值,我们使用下列公式:

将3个轴的值代入上式,得到:

每个加速度计都有一个零加速度的电压值,这个电压值对应于加速度为0g。通过计算相对0g电压的偏移量我们可以得到一个有符号的电压值。比方说,0g电压值VzeroG=1.65V,通过下面的方式可以得到相对0g电压的偏移量:

现在我们得到了加速度计的电压值,但它的单位还不是g(9.8m/s^2),最后的转换,我们还需要引入加速度计的灵敏度,单位通常是mV/g。比如,加速度计的灵敏度Sensitivity = 478.5mV/g。灵敏度值可以在加速度计说明书中找到。要获得最后的单位为g的加速度,我们使用下列公式计算:

综上,可以把以上步骤用以下公式表达

现在我们得到了惯性力矢量的三个分量,如果设备除了重力外不受任何外力影响,那我们就可以认为这个方向就是重力矢量的方向。(自此明白了文献[1]中所说只使用加速度计获得的角度是基于飞行器在匀速飞行或静止的条件下得到的

图2[引自网络]

我们感兴趣的角度是向量R和X,Y,Z轴之间的夹角,那就令这些角度为Axr,Ayr,Azr。观察由R和Rx组成的直角三角形

图2中,那么,角度即为

三、互补滤波算法

加速度计是极易受外部干扰的传感器(如机械振动),但是测量值的误差不随时间的变化。陀螺仪输出的角速度可以积分得到角度,动态性能好,受外部干扰小,但积分会造成误差累积。可以看出,它们优缺点互补,结合起来才能有好的效果。

经典互补滤波算法(Classical Complementary Filter)

经典互补滤波算法基本原理是充分利用加速度计提供的低频角度信号和陀螺仪提供的高频角速度信号,对加速度计进行低通滤波,对陀螺仪进行高通滤波,分别滤出相应的干扰信号,为两者的有效融合提供了很好的解决方案[2]。

图3 经典互补滤波算法—频域形式原理图[2]

融合后姿态角估计值为

其中,\omega g为陀螺仪测量的角速度,\theta a为加速度计测量的角度值,Kp

为比例系数,为高通滤波器,

为低通滤波器。

图4 经典互补滤波算法—时域形式原理图[2]

进行反拉氏变换,可得时域微分形式为

    改进后的互补滤波算法(Explicit Complementary Filter)

经典互补滤波算法实现简单,但是估算精度角度较低,文献[3]提出了一种改进算法(ECF),在经典互补滤波算法的补偿环节加入积分器,以消除陀螺仪漂移常值误差,原理框图如下图。

图5 改进后的互补滤波算法[2]

时域微分形式为

 

参考文献

[1] 郭晓鸿,杨忠,陈喆,等. EKF和互补滤波器在飞行姿态确定中的应用[J]. 传感器与微系统,2011,30(11):149-152.

[2] 傅忠云,朱海霞,孙金秋,等. 基于惯性传感器 MPU6050 的滤波算法研究[J]. 压电与声光, 2015 (2015 年 05): 821-825,829.

[3] Mahony R, Hamel T, Pflimlin J M. Nonlinear complementary filters on the special orthogonal group[J]. IEEE Transactions on automatic control, 2008, 53(5): 1203-1218.

[4] Euston M, Coote P, Mahony R, et al. A complementary filter for attitude estimation of a fixed-wing UAV[C]//Intelligent Robots and Systems, 2008. IROS 2008. IEEE/RSJ International Conference on. IEEE, 2008: 340-345.

附程序:

void IMUupdate(float gx, float gy, float gz, float ax,float ay, float az)

{

    float norm;

    float vx, vy, vz;

    float ex, ey, ez;

    float q0q0 = q0*q0;

    float q0q1 = q0*q1;

    float q0q2 = q0*q2;

    float q1q1 = q1*q1;

    float q1q3 = q1*q3;

    float q2q2 = q2*q2;

    float q2q3 = q2*q3;

    float q3q3 = q3*q3;

    if(ax*ay*az==0)

        return;

    // 第一步:对加速度数据进行归一化

    norm = sqrt(ax*ax + ay*ay + az*az);

    ax = ax / norm;

    ay = ay / norm;

    az = az / norm;

    // 第二步:DCM矩阵旋转

    vx = 2*(q1q3 - q0q2);

    vy = 2*(q0q1 + q2q3);

    vz = q0q0 - q1q1 - q2q2 + q3q3 ;

    // 第三步:在机体坐标系下做向量叉积得到补偿数据

    ex = ay*vz - az*vy ;

    ey = az*vx - ax*vz ;

    ez = ax*vy - ay*vx ;

    // 第四步:对误差进行PI计算,补偿角速度

    exInt = exInt + ex * Ki;

    eyInt = eyInt + ey * Ki;

    ezInt = ezInt + ez * Ki;

    gx = gx + Kp*ex + exInt;

    gy = gy + Kp*ey + eyInt;

    gz = gz + Kp*ez + ezInt;

    // 第五步:按照四元数微分公式进行四元数更新

    q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;

    q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;

    q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;

    q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;

}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1419707.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

表面的相似,本质的不同

韩信与韩王信,两个韩信的结局都是被刘邦所杀,似乎结局类似。但是,略加分析,就会发现其中存在本质的区别。 韩信属于必杀。他的王位是要来的,有居功自傲的本意,功高震主而且毫不避讳。而且年轻,…

代码随想录算法训练营第二十五天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接/文章讲解: 代码随想录 视频讲解: 你修剪的方式不对,我来给你纠正一下!| LeetCode:669. 修剪二叉搜索树_哔哩哔哩_bilibili 解题思路 在上一题的删除二叉树节点中,我们通过在…

2016-2021年全国范围的2.5m分辨率的建筑屋顶数据

一、论文介绍 摘要:大规模且多年的建筑屋顶面积(BRA)地图对于解决政策决策和可持续发展至关重要。此外,作为人类活动的细粒度指标,BRA可以为城市规划和能源模型提供帮助,为人类福祉带来好处。然而&#xf…

【数组算法】598. 区间加法

给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该加 1。 在 执行完所有操作后 &#xff0c;计算并返回 矩阵中最大整数的个数 。 示例 1: …

C语言的打字小游戏

目录 游戏内容 伪代码 main 函数 随机字符串 匹配逻辑 用户决定是否继续或退出游戏 完整代码 从0开始记录我的学习历程&#xff0c;我会尽我所能&#xff0c;写出最最大白话的文章&#xff0c;希望能够帮到你&#xff0c;谢谢。 提示&#xff1a;文章作者为初学者&#xf…

【算法】动态规划之背包DP问题(2024.5.11)

前言&#xff1a; 本系列是学习了董晓老师所讲的知识点做的笔记 董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com) 动态规划系列 【算法】动态规划之线性DP问题-CSDN博客 01背包 步骤&#xff1a; 分析容量j与w[i]的关系&#xff0c;然后分析是否要放…

解决“电脑开机黑屏Explorer进程卡死“问题

今天&#xff0c;给台式机按电源键&#xff0c;进入windows系统时&#xff0c;发现电脑黑屏了&#xff0c;昨天还好好的&#xff0c;怎么今天电脑桌面进不去了&#xff1f;想起Windows XP、Windows 7、Windows 10 、Windows 11等系统&#xff0c;在使用多个文件拷贝时&#xff…

IDEA创建springboot项目时不能选择java 8或者java 11等等版本的问题,解决方案

文章目录 1. Project JDK 和 Java 的区别2. 没有 java 8 或 java 11 等版本2.1 方案一2.2 方案二2.3 方案三 1. Project JDK 和 Java 的区别 我们在利用 idea 创建 spring boot 项目时&#xff0c;会有以上两个选项&#xff0c;这两个选项有什么区别&#xff1f; 答&#xff…

3分钟掌握Suno API!音痴也能创作热门曲!免费拥有个人爆款音乐!

Suno API 的申请及使用 随着 AI 的应用变广&#xff0c;各类 AI 程序已逐渐普及。AI 已逐渐深入到人们的工作生活方方面面。而 AI 涉及的行业也越来越多&#xff0c;从最初的写作&#xff0c;到医疗教育&#xff0c;再到现在的音乐。 Suno 是一个专业高质量的 AI 歌曲和音乐创…

示例十一、声音传感器

通过以下几个示例来具体展开学习,了解声音传感器原理及特性&#xff0c;学习声音传感器的应用&#xff08;干货版&#xff09;&#xff1a; 示例十一、声音传感器 ino文件源码&#xff1a; //Arduino C demo void setup() {Serial.begin(9600);pinMode(5, OUTPUT); }void loo…

C++相关概念和易错语法(11)(npos、string的基本使用)

本文主要是分享一些基础的用法和接口&#xff0c;不会涉及迭代器版本&#xff0c;也没有底层概念&#xff0c;主要是保证简单入门和使用。 1.npos string本质上是一个类&#xff0c;里面包含了上百个成员函数&#xff0c;在调用这个头文件后&#xff0c;我们要知道整个类都被…

在 Navicat 17 中探索表配置文件

距离 Navicat 17&#xff08;英文版&#xff09;的发布还有不到一周的时间&#xff0c;现在是深入研究新的表配置文件功能的最佳时机。它允许我们保存经常用于表的筛选、排序和列显示的不同组合。所以&#xff0c;事不宜迟&#xff0c;让我们开始吧&#xff01; 创建表配置文件…

盛邦安全荣获北京市海淀区上地街道财源建设工作表彰

近日&#xff0c;盛邦安全受邀出席上地街道2024年第一季度财源建设工作联席会暨上地人工智能产业报告发布大会并收到上地街道颁发的感谢信&#xff0c;这是对公司技术创新、管理提升、营收增长&#xff0c;持续为上地地区财源建设做出突出贡献的鼓励。 盛邦安全副总裁、董事会秘…

【C++算法】队列相关经典算法题

1. N叉树的层序遍历 首先我们遇到这个题目&#xff0c;没有任何思路&#xff0c;我们就可以来模拟一下层序的流程&#xff0c;首先我们肯定是访问根节点1&#xff0c;访问之后呢就是访问下一层的最左节点3&#xff0c;此时第一层的节点1已经访问过了就可以不要了&#xff0c;然…

Python可以自学但是千万不要乱学,避免“埋头苦学”的陷阱!

前言 Python可以自学但是千万不要乱学&#xff01; 归根结底因为学习是个反人性的过程&#xff01; 复盘没学下去的网课&#xff0c;都有以下特点&#xff1a; &#x1f605; 臣妾听不懂啊&#xff01; 初次接触编程遇到太多抽象高深的概念&#xff0c;不了解老师口中的一个…

避雷:搭建AI知识库注意事项

AI知识库作为信息存储和进行智能处理的核心部分&#xff0c;受到越来越多企业的重视。为了更好地发展&#xff0c;企业也纷纷开始搭建AI知识库。然而&#xff0c;在搭建AI知识库的过程中&#xff0c;也有很多雷区容易踩到&#xff0c;导致项目延迟、效果不佳甚至失败。所以&…

【Android】Apk图标的提取、相同目录下相同包名提取的不同图标apk但是提取结果相同的bug解决

一般安卓提取apk图标我们有两种常用方法&#xff1a; 1、如果已经获取到 ApplicationInfo 对象&#xff08;假设名为 appInfo&#xff09;&#xff0c;那么我们获取方法为&#xff1a; appInfo.loadIcon(packageManager)// 返回一个 Drawable 对象2、 如果还没获取到 Applica…

C++入门系列-构造函数

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会…

kali搭建Vulhub靶场

简单概述 Vulhub是一个面向大众的开源漏洞靶场&#xff0c;借助Docker简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单&#xff0c;让安全研究者更加专注于漏洞原理本身。 Docker是一个开源的容器引擎&#xff0c;它有助于更快地交付应用…

vue3专栏项目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 页面 首页有专栏列表&#xff08;ColumnList组件&#xff09;&#xff0c;专栏列表中有很多专栏&#xff0c;然后点击某个专栏就进入专栏详情页&#xff08;ColumnDetail组件&#xff09;&#xff0c;专栏详情页中有很多文章&#xff0c;点击某个文章就进…