六轴传感器基础知识学习:MPU6050特性,四元数,姿态解算,卡尔曼滤波

news2024/11/20 21:24:42

实际上,只要说到多少轴的传感器一般是就是指加速度传感器(即加速计)、角速度传感器(即陀螺仪)、磁感应传感器(即电子罗盘)。这三类传感器测量的数据在空间坐标系中都可以被分解为X,Y,Z三个方向轴的力,因此也常常被称为3轴加速度计、3轴陀螺仪、3轴磁力计。

上面3类传感器有其各自的功能特点及应用,比如加速度计可以测量设备的测斜情况,陀螺仪可以测量设备自身的旋转运动,还有磁力计可以定位设备的方位。通过它们相互组合和匹配融合又可以衍生出更多的不同应用,在叫法上通过这样简单的轴数上相加的可以变成六轴传感器或者九轴传感器。
六轴传感器:通常指的是三轴加速度计+三轴陀螺仪,三轴加速度计是检测横向加速的,三轴陀螺仪是检测角度旋转和平衡的,可以用在体感游戏上。
九轴传感器:就是三轴加速度计+三轴陀螺仪+三轴磁强计的组合,在飞行器上是广泛应用的。另外,在九轴传感器基础上在加入气压传感器,从而能获取海拔高度的数据,也有人把这些传感器组合称为十轴传感器。

认识MPU6050

MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件。下面以这个芯片为例分析六轴传感器相关的知识点,其他的三轴或六轴传感器很多特性都是与之类似的。

某MPU6050模块:
在这里插入图片描述

MPU6050芯片的检测轴和方向:
在这里插入图片描述
图示向右为 X 轴正方向,向前为 Y 轴正方向,垂直模块向上为 Z 轴正方向。

旋转的方向按右手法则定义,即右手大拇指指向轴向,四指弯曲的方向即为绕该轴旋转的方向。
X 轴角度(滚转角 Roll)即为绕 X 轴旋转方向的角度,
Y 轴角度(俯仰角 Pitch)即为绕 Y 轴旋转方向的角度,
Z 轴角度(偏航角 Yaw)即为绕 Z 轴旋转方向的角度,
三者合称姿态角/欧拉角(Euler angles)。

滚转角、俯仰角、偏航角通过一架飞机的运动形态就容易理解为啥这样命名了。
在这里插入图片描述

  • 偏航角Yaw:绕Z轴转动(机头水平转)
    在这里插入图片描述

  • 俯仰角Pitch:绕Y轴转动(飞机上下抬头)

在这里插入图片描述

  • 横滚角Roll:绕X轴转动(飞机左右翻滚)

在这里插入图片描述

根据上面的信息我们应该要意识到:在项目中应用六轴传感器时,需要注意芯片的放置方向与整机前进方向的关系,否则将对软件解读运动状态造成麻烦。

下面我把 MPU6050 的有代表性的几个特性摘出来了:
1.以数字形式输出 6 轴或 9 轴(需外接磁传感器)(通过XCL、XDA进行通信)的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据(需 DMP 支持)

2.具有 131 LSBs/° /sec 敏感度与全格感测范围为±250、±500、±1000 与±2000°/sec 的 3 轴角速度感测器(陀螺仪)

3.集成可程序控制,范围为±2g、±4g、±8g 和±16g 的 3 轴加速度传感器

4.自带数字运动处理(DMP: Digital Motion Processing)引擎可减少 MCU 复杂的融合演算数据、感测器同步化、姿势感应等的负荷

5.自带一个数字温度传感器

6.可程序控制的中断(interrupt)(INT接口的功能),支持姿势识别摇摄、画面放大缩小、滚动、快速下降中断、high-G 中断、零动作感应、触击感应、摇动感应功能

7.自带 1024 字节 FIFO,有助于降低系统功耗

8.高达 400Khz 的 IIC 通信接口

系统框图:
在这里插入图片描述MPU-60X0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。从系统框图中可以看出加速度计和陀螺仪都有3个ADC模块,转化后的数字量最后保存到寄存器中供用户读取。

加速度计

加速度计顾名思义,就是测量加速度的.那么,我们如何认识这个加速度呢?在此用一个盒子形状的立方体来做模型,认识加速度。
我们可以把加速度计想象为一个正方体盒子里放了一个球如图所示,假设盒子没有任何受力时(包括重力),小球将处于正中心的位置,那么六个壁面感受到的压力都是0,可以理解为三轴的加速度均为0。
在这里插入图片描述
如果我们突然将立方体向左侧移动(我们加快加速,1G =9.8米/ S ^ 2),皮球打在了墙上X-。然后,我们测量球适用于在X轴上的壁和输出-1g值的压力。如下图
在这里插入图片描述

注意,加速度计反应的加速向量与当前的受力方向是相反的.如上图所示,受力方向向左,但是加速度的向量方向为右.

对于MPU6050,寄存器0x3B到0x40的6个寄存器分别保存了XYZ轴的加速度值,每个轴的值分为高八位和低八位,但注意这个加速度计的读数,以LSB为单位的,不是g(9.8米/秒^ 2),需要做转换。
在这里插入图片描述
MPU6050的加速度计的三轴分量ACC_X、ACC_Y和ACC_Z均为16位有符号整数,其均以重力加速度g的倍数为单位,有四个可选量程:±2g、±4g、±8g、±16g。

为了得到最终的力值,单位为g,我们
用下面的公式:
RX = ADCRx /灵敏度 (RX是转换为g单位后的结果,ADCRx是从sensor读出的加速度原始值)

此时以X轴ACC_X为例,量程选择±2g,则实际加速度转换参考下面公式:
在这里插入图片描述
ACCx是X轴的读数,注意最高位是符号位。
后面这部分实际上是LSB灵敏度,不同的加速度范围对应的灵敏度如下:

在这里插入图片描述
量程选择±2g,当x轴的计数为ADCx 时,那么对应的加速度值就是 (ADCx/16384)g
这个灵敏度与寄存器原始值支持的位数有关,上面这个表仅代表MPU6050。

加速度计的标定

当MPU6050水平放置时,±2g量程,理论上Z轴感受到重力 将读出16384。前面说到,加速度计反应的加速向量与当前的受力方向是相反的,所以重力的方向是Z轴的负方向,则加速度计的值就是正的1g,即读出正16384。同时X 轴和Y轴的读数将是0。可实际会有误差。这是由于每个芯片在制作时都不一样,数据手册上的都是理论的值,真正的芯片在水平时Z轴可能并不是16384。我们需要找到当各个轴在0g重力时的计数,1g时的读数,以及-1g时的读数,得到一个补偿值,在每次读取ADC结果后都进行补偿。这个过程我们称之为标定。用数学公式表示为:
ADCx = K*Gx + Offset
ADCx 传感器输出
Gx 真实的加速值
Offset 加速度为0g时传感器的输出
K 标度因数

陀螺仪

陀螺仪是测试角速度的传感器,也有人把角速度说成角速率,说的是一样的物理量。拿电机做例子,当我们说一个电机10转每秒。一转是360度,那么它的主轴在一秒内转过3600度。也就是说这个电机在转动时的角速度是3600dps.dps 就是dergee per second 度每秒
(或者写成 deg/s)。MPU6050 集成了三轴的陀螺仪。角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps).当选择量程为±250dps的时候,将会得到分辩率为131LSB/(º/s).也就是当载体在X+轴转动1dps时,ADC将变化131。

对于MPU6050,寄存器0x43到0x48的6个寄存器分别保存了XYZ轴的陀螺仪测量值,每个轴的值分为高八位和低八位,但注意这个陀螺仪的读数,以LSB为单位的,不是 deg / s,需要做转换。

在这里插入图片描述
每个 16位陀螺仪测量值的满量程定义在 FS_SEL(寄存器 27)。对于每个满量程的设置,GYRO_xOUT里陀螺仪测量值的灵敏度最低分辨率( LSB)如下表:
在这里插入图片描述
从ADC值到 dps
通过I2C接口读出来的转换结果ADC值,并不是以度每秒为单位。一般按以下公式进行转换:
Anglerate = ADCrate /灵敏度
以量程为±1000º/s为例,说明如何转换。假设读取x轴的ADC值为200,从上表中得知在±1000º/s下的灵敏度为32.8LSB/(º/s) 。根据上面的公式:
Anglerate = 200/32.8 = 6.09756º/s
这就是说,MPU6050检测到模块正在以约6度每秒的速度绕X轴(或者叫在YZ平面上)旋转。ADC值并不都是正的,请注意,当出现负数时,意味着该设备从现有的正方向往相反的方向旋转。

DMP

DMP就是MPU6050内部的运动引擎,全称Digital Motion Processor,直接输出四元数,有了四元数就可以转换成欧拉角,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合。Motion Driver是Invensense针对其运动传感器的软件包,并非全部开源,核心的算法部分是针对ARM处理器和MSP430处理器编译成了静态链接库,适用于MPU6050、MPU6500、MPU9150、MPU9250等传感器。

FIFO

MPU-60X0包含一个可通过串行接口访问的1024字节FIFO寄存器。 FIFO配置寄存器决定哪个数据写入FIFO。 可能的选择包括陀螺仪数据,加速计数据,温度读数,辅助传感器读数和 FSYNC 输入。 FIFO 计数器跟踪 FIFO 中包含的有效数据字节数。 FIFO寄存器支持突发读取。 中断功能可用于确定新数据何时可用。

姿态融合

MPU6050的正式名称为六轴运动姿态陀螺仪传感器,之所以称其为“六轴”,是因为MPU6050是一个6轴运动处理组件,包含了3轴加速度计和3轴陀螺仪,可分别输出三轴加速度和三轴角速度,然后再根据以上原始数据在DMP(Digital Motion Processor,数字运动处理器)中使用算法进行姿态融合解算出三轴的角度数据。
常用的姿态融合算法有四元数法 、一阶互补算法和卡尔曼滤波算法,其中第三者最为常用。

卡尔曼滤波算法简述:对于姿态传感器模块来说,角度解算来源于两种类型的数据,第一种是通过加速度和磁场数据进行运动学解算可以求出三轴的姿态角,优点是没有长期漂移和误差累计,但缺点是精度差,而且仅在静态时能保证精度。第二种是通过陀螺仪测量出来的角速度进行积分运算,可以得出三轴姿态角,优点是精度高,可以进行动态测量,对加速度不敏感,缺点是有累积误差和漂移,时间越长累积误差越大。卡尔曼滤波就是一种数据融合算法,结合加速度计和陀螺仪的信息,共同来解算姿态,集合二者的优点获得在动态环境下可以准确测量姿态的方法。

欧拉角

以下图的坐标为例,飞机头是X轴方向,两翼是Y轴方向,垂直是Z轴方向,
假想当前的飞机自身有个随运动而动的坐标,然后与当前一个固定不动的坐标重合,就像动图中的初始状态,
分别对应绕Z轴转ψ,再绕Y轴转θ,再绕X轴转φ,注意这里的轴指的是随自身运动的坐标
完成后飞机处于一个新的动作状态
(ψ, θ, φ)就是ZYX欧拉角
在这里插入图片描述

欧拉角是用来 唯一的 确定定点转动刚体位置的 三个一组的 独立角参量。

通俗来讲的话有:

eg:你去问路得到了两种回答

1 往东经104°04′北纬30°40′走

2 往前走100m后右转

第一种令人难以理解,第二种则是相对坐标,比较具有操作性

欧拉角的思想就是采用第二种回答的方式,优点在于较好理解
可以说欧拉角每次转动的角度都是根据自身上一次动作生成的新的坐标而言的,就像一个人每次左转或右转都是相对自己面向的方向来说

相对欧拉角,还有一种固定角的思路就是对应第一种回答。
固定角,每一次旋转都是绕固定的坐标系的轴,即所谓“固定”。
每一次都是绕运动的坐标系B的轴旋转而不是绕固定的坐标系A的轴旋转,这样的三个一组的旋转称为欧拉角。

关于旋转顺序

eg:问路时候先左转30度后右转60度 和 先右转30度后左转60度 有着根本上的区别
想要让两个人动作一致,除了报先转30度再转60度还不行,必须说明先左转30度后右转60度

旋转顺序 (x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z).

我们指定绕x轴旋转α,绕y轴旋转β.但是可以有多个旋转顺序, 比如:

情况1:先绕x轴旋转α,再绕y轴旋转β.得到姿态 O1

情况2:先绕y轴旋转β,再绕x轴旋转α,得到姿态 O2

得到的 O1 一般是不等于 O2 的.

对于x,y,z三个轴的不同旋转顺序一共有(x-y-z, y-z-x, z-x-y, x-z-y, z-y-x, y-x-z)六种组合.我们需要明确旋转顺序,才能确定欧拉角所指的姿态.

在很多不太专业的博客中,关于欧拉角上来就是Yaw,Pitch,Roll,都没有搞清楚欧拉角是怎么定义的,是绕哪个轴在转动。

通过对比不同领域的文献,我发现关于欧拉角的定义似乎有所差别,比如在一些文献当中,是不区分固定角和欧拉角的,绕固定轴和绕运动轴的区别称为外旋和内旋。因此,为了和上面保持一致,这里就以Z-Y-X绕运动轴旋转的角度称为欧拉角,一般用Yaw,Pitch,Roll表示。偏航角yaw,俯仰角pitch,滚动角 roll

偏航角,俯仰角,滚动角似乎都是以飞机的动作来命名,即使不讲究XYZ轴,也知道是往哪个方向转动。
只能说偏航角,俯仰角,滚动角是用了欧拉角的表达方式,但是最好不要把欧拉角和偏航角,俯仰角,滚动角划等号。

四元数

提出意义:上述欧拉角是多次旋转后才能得到,那么为什么不一步到位,只旋转一次呢?那么四元数应运而生。
定义:
对于一个物体的旋转,我们只需要知道四个值:一个旋转的向量 + 一个旋转的角度。而四元数也正是这样的设计:
在这里插入图片描述
其中x,y,z 代表的是向量的三维坐标,w代表的是角度

四元数和欧拉角间的相互转化

1、四元数转为欧拉角
在这里插入图片描述
2、欧拉角转为四元数
在这里插入图片描述

https://blog.csdn.net/qq_40604876/article/details/119024790

https://blog.csdn.net/weixin_45263626/article/details/105230225

https://blog.csdn.net/weixin_55073640/article/details/125757469

https://blog.csdn.net/absll/article/details/124835737

https://blog.csdn.net/weixin_55073640/article/details/125757469

https://blog.csdn.net/thefist11cc/article/details/126595776

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

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

相关文章

第一章 线性模型

目录 一、线性模型基本概念二、梯度下降三、反向传播四、使用 Pytorch 实现线性模型 一、线性模型基本概念 线性模型: y ^ x ∗ ω b \hat{y} x * \omega b y^​x∗ωb 简化版本,将 b b b 加入到权重矩阵 ω \omega ω 中: y ^ x ∗…

新榜 | “淄博”现象专项观察报告

在过去的一个月中,淄博烧烤的相关话题霸屏网络,这些媒介话题里承载了多少受众的向往与想象? 根据2022年淄博市文旅局公开年报,去年,淄博官方就着力融媒体,在抖音、快手等平台创新使用“淄博到底有多牛”主题…

javascript-核心知识总结

目录 (一)DOM基础 1、DOM对象 2、节点类型 3、获取元素 4、创造元素 5、插入元素 6、删除元素 7、复制元素 8、替换元素 (二)DOM进阶 1、用DOM对象对HTML属性操作 2、用DOM对象对CSS操作 3、DOM查找(遍历&…

浅析基于AI智能识别技术边缘计算硬件在智慧食安监管场景中的应用

一、背景分析 自2014年开始,国家市场监督管理总局在强化企业主体责任、严格实施全过程监管、创新监管方式的方针下,推行“互联网明厨亮灶"工程建设。系统以四个端为整体规划,实现亮后厨、亮证、亮照、亮评估,通过以网管网措…

微信小程序xr-frame实现多光源效果

1.基础知识: 灯光 灯光组件Light用于给场景提供照明,也是阴影的核心。相机组件一般被代理到灯光元素XRLight中使用,其派生自XRNode,对应在xml中的标签为xr-light。 主光源以及参数 类型uniforms宏说明书写环境光颜色和亮度u_a…

Linux Shell 实现一键部署virtualbox

VirtualBox 前言 VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发,由Sun Microsystems公司出品的软件,使用Qt编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public Licens…

从零开始 Spring Boot 30:数据校验

从零开始 Spring Boot 30:数据校验 图源:简书 (jianshu.com) 在从零开始 Spring Boot 13:参数校验 - 红茶的个人站点 (icexmoon.cn)一文中,我讨论了一些可以用于参数校验的注解。实际上这些注解都是来自于Jakarta Bean Validatio…

第7章异常、断言和曰志

Java和C异 在C中,throw说明符在运行时执行。Java在编译时执行。 处理错误 异常处理的任务就是将控制权从产生错误的地方转移到能够处理这种情况的错误处理器。 如果由于出现错误而使得某些操作没有完成,程序应该:返回到一种安全状态&#…

ChatGLM + PEFT 进行finetune

一、前言 1.1 硬件需求 注:r 为LoRA 维数大小,p 为前缀词表大小,l 为微调层数,ex/s 为每秒训练的样本数。gradient_accumulation_steps 参数设置为 1。上述结果均来自于单个 Tesla V100 GPU,仅供参考。 1.2 微调方法…

开放原子训练营第一季——铜锁探“密” 圆满落幕!

【开放原子训练营第一季结营总结】——铜锁探“密” 开放原子训练营第一季「铜锁探密」由开放原子开源基金会&铜锁社区共同举办,包含 5 次课程,以“抽丝剥茧,循序渐进,一起揭开商用密码的面纱”为主题,让参与者更加…

c++面向对象之类

一、类的定义 class 类名{成员属性构造函数析构函数成员函数 }Person.h #include <string> #include <iostream> using namespace std;class Person {int m_age;string m_name;Person();Person(int age,string name);~Person();int getAge();void setAge(int age…

蓝鲸平台通过标准运维 API 安装 Agent

目录 一、背景 二、目的 三、创建安装agent流程 四、通过标准运维 API 安装 Agent 五、总结 一、背景 蓝鲸平台正常情况纳管主机需要在节点管理手工安装agent&#xff0c;不能达到完成自动化安装agent的效果。想通过脚本一键安装agent&#xff0c;而不需要在蓝鲸平台进行过…

Golang指针的操作以及常用的指针函数

目录 指针的操作 定义指针 获取变量地址 解引用指针 指针作为函数参数 指针的空值 常用的指针函数 new 函数 make 函数 append 函数 copy 函数 指针的操作 在Go语言中&#xff0c;指针是一种非常重要的类型&#xff0c;可以用来传递变量的地址而不是变量本身。 定…

【leetcode刷题总结】——代码随想录(链表总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构&#xff0c;再从简单刷起&#xff0c;做了几个类型题目之后&#xff0c;再慢慢做中等题目、困难题目。 以下是个人刷题总结&#xff0c;官…

多个Node.js版本之间切换

本篇文章会讲windows和Mac系统下实现多个node.js版本之间的切换。 1.windows下采用nvm&#xff08;nvm-window&#xff09; 2.Mac下采用nvm和n 注&#xff1a;window和mac下的nvm地址是不一样的 一、windows系统 什么是nvm&#xff1f; nvm是一个简单的bash脚本&#xff…

真题详解(有限自动机)-软件设计(七十七)

确定有限自动机 和 不确定有限自动机 解析&#xff1a; M1的A当0的时候&#xff0c;会变成A&#xff0c;也可能变成B&#xff0c; 所以M1是不确定有限自动机。 M2的A1的时候只会使A&#xff0c;0的时候只会是B B的0只会是B&#xff0c;1的时候只会是C。 C0的时候只会是B&a…

中小型企业需要“数据防泄露”吗?

数据防泄露是指企业采取的各种管理、技术与监督措施&#xff0c;以防止敏感和关键数据在传输、存储与使用过程中被未经授权访问或窃取&#xff0c;从而导致机密性、完整性或可用性受到损害。 数据防泄露工作通常包括数据分类与风险评估、权限管理与访问控制、加密与安全技术、数…

基于Gabor-小波滤波深度图表面法线的特征提取算法【通过正常Gabor-小波的直方图进行2D或3D特征提取】研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Bean的生命周期揭秘:从诞生到消亡,一个对象的壮丽演绎!

大家好&#xff0c;我是你们的小米。今天我要给大家揭秘一下Java开发中重要的概念——Spring Bean的生命周期。作为Java开发者&#xff0c;无论是在面试还是实际工作中&#xff0c;了解Bean的生命周期都是必备的知识点。让我们一起来深入了解吧&#xff01; 什么是Spring Bean …

【zabbix】PostgreSQL表信息查询收集监控

昨天开发那边给了一个需求&#xff0c;每隔一段时间查询一下数据库某表中的数据是否在最近更新&#xff0c;让我这边做一个监控信息收集 一、agent linux侧配置 这边目前就直接在zabbix上实现&#xff0c;首先就是脚本&#xff0c;我用python2实现 脚本名&#xff1a;check_y…