加速度计、陀螺仪工作原理

2023-05-16

加速度计、陀螺仪的工作原理

  参考链接:https://c.miaowlabs.com/B07.html

  陀螺仪、加速度计都是惯性测量元件的一种。而 MPU-6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件。

1. 加速度传感器

  MPU-6050 传感器内部封装了陀螺仪和加速度传感器两种惯性测量元件,而陀螺仪和加速度传感器的工作原理是不一样的。
图1-1 盒子模型

图1-1 盒子模型

  为了便于理解,我们可以把加速度传感器想象为一个盒子模型——一个小球在一个方盒子中。

  想象一下,如果把盒子模型放在真空环境中会怎么样?在真空中,一切东西都处于无重力状态(失重),这时,小球也不例外,将悬浮在盒子的中间。在上面的图中,你可以看到我们给每个轴分配了一对墙(为了观察里面的情况,我们移除了 Y + Y+ Y+)。设想每面墙都能感测压力。如果我们突然把盒子向左移动(加速度为 g = 9.8 m / s 2 g = 9.8 m/s^2 g=9.8m/s2),那么球会撞上 X − X- X 墙。然后我们检测球撞击墙面产生的压力, X X X 轴输出值为 − g -g g

在这里插入图片描述

图1-2

  请注意加速度传感器检测到力的方向与它自身运动加速度的方向是相反的。这种力通常被称为惯性力 。在这个模型中,加速度传感器是通过间接测量力对一个墙面的作用来测量加速度的,但在实际应用中,可能通过弹簧或其他装置来测量力。这个力可以是加速度引起的,但在下面的例子中,我们会发现它不一定是加速度引起的。

  众所周知地球上的物体都会受到重力 g = 9.8 m / s 2 g = 9.8m/s^2 g=9.8m/s2 的作用。如果我们把模型放在地球上,这时圆球不再是悬浮的,而是会落在 Z − Z- Z墙面上并对其施加一个 1 g 1g 1g 的力,见下图:

在这里插入图片描述

图1-3

  在这种情况下,盒子没有移动,但我们依然能读取到 Z Z Z 轴有 − 1 g -1g 1g 的值。因为球在墙面上施加的压力是由重力造成的。在理论上,它可以是不同类型的引力。例如,你可以想象盒子里的圆球是铁质的,将一个磁铁放在盒子旁边,小球就会撞上另一面墙,这时圆球受到的是磁场力。引用这个例子只是为了说明 加速度传感器的本质是检测力而非加速度。只是 加速度所引起的惯性力正好能被加速度传感器的检测装置所捕获

  虽然这个盒子模型并非一个 MEMS 传感器的真实构造,但它用来解决与加速度传感器相关的问题相当有效。实际上有些类似传感器中有金属小球,它们称作倾角开关,但是它们的功能更弱,只能检测设备是否在一定程度内倾斜,却不能得到倾斜的程度。

  到目前为止,我们已经分析了单轴加速度传感器的输出。三轴加速度传感器的真正价值在于它们能够检测全部三个轴的惯性力。再次回到盒子模型,并将盒子向右旋转 45 度。盒子模型依然是放在地球上。现在小球会与两个面接触: Z − Z- Z X − X- X,见下图:

在这里插入图片描述

图1-4

  其中, 0.71 g 0.71g 0.71g 这个值实际上是 1 2 \sqrt{\frac{1}{2}} 21 的近似值,是根据勾股定理计算出来的。

​ 在上一个模型中,我们引入了重力并旋转了盒子。在最后的两个例子中,我们分析了盒子在两种情况下的输出值,力矢量保持不变。虽然这有助于理解加速度传感器是怎么和外力相互作用的,但如果我们将坐标系换为加速度的三个轴并想象矢量力在周围旋转,这会更方便计算。

在这里插入图片描述

图 1-5

​ 其中,

  • R x R_x Rx R y R_y Ry R z R_z Rz 是向量 R R R 分别在 X、Y、Z 轴上的投影;
  • R x z R_{xz} Rxz 是向量 R R R 在 XOZ 平面上的投影;
  • R y z R_{yz} Ryz 是向量 R R R 在 YOZ 平面上的投影;
  • A x z A_{xz} Axz R z R_z Rz R x z R_{xz} Rxz 之间的夹角;
  • A y z A_{yz} Ayz R z R_z Rz R y z R_{yz} Ryz 之间的夹角;

​ 根据勾股定理,求得:

  • tan ⁡ A x z = R x R z \tan{A_{xz}}=\frac{R_x}{R_z} tanAxz=RzRx
  • tan ⁡ A y z = R y R z \tan{A_{yz}}=\frac{R_y}{R_z} tanAyz=RzRy

​ 那么,通过反正切函数 arctan ⁡ ( ) \arctan() arctan() 可得:
{ A x z = arctan ⁡ R x R z A y z = arctan ⁡ R y R z (1.1) \begin{cases} A_{xz}=\arctan\frac{R_x}{R_z}\\ A_{yz}=\arctan\frac{R_y}{R_z}\\ \end{cases} \tag{1.1} {Axz=arctanRzRxAyz=arctanRzRy(1.1)
​ 我们感兴趣的角度是 A x z 、 A y z A_{xz}、A_{yz} AxzAyz。想象图1-5新模型中每个轴都分别垂直于原模型中各自的墙面。矢量 R R R 是加速度传感器所检测的矢量(它可能是重力或其它惯性力的合成)。 R x 、 R y 、 R z R_x、R_y、R_z RxRyRz 是矢量 R R R 在 X、Y、Z 轴上的投影。

​ 根据三维空间勾股定理,可以得到下列关系:
R 2 = R x 2 + R y 2 + R z 2 (1.2) R^2={R_x}^2+{R_y}^2+{R_z}^2 \tag{1.2} R2=Rx2+Ry2+Rz2(1.2)
​ 回到 MPU-6050 传感器中,在上一小节我们已经分别读取到 3 个轴的加速度数据,但是我们读到的加速度数字量的单位还不是 g ( 9.8 m / s 2 ) g(9.8m/s^2) g(9.8m/s2) 。最后的转换,我们还需要引入加速度传感器的灵敏度(Sensitivity),单位通常是 L S B / g \rm{LSB}/\it{g} LSB/g 。比方说,加速度传感器的灵敏度为 16384   L S B / g 16384\ \rm{LSB}/\it{g} 16384 LSB/g 。灵敏度值可以在加速度传感器规格书中查到。要获得最后的单位为 g g g 的加速度值,我们使用下列公式计算:
R x = R x S e n s i t i v i t y (1.3) R_x=\frac{R_x}{Sensitivity} \tag{1.3} Rx=SensitivityRx(1.3)
​ 比如:

  • 当设置 MPU-6050 加速度传感器的灵敏度为 16384   L S B / g 16384\ \rm{LSB}/\it{g} 16384 LSB/g 时,读取到 MPU-6050 的 X、Z 轴加速度数据为 1122、16674 ,则可以计算出:

{ R x = 1122 / 16384 = 0.068 g R z = 16674 / 16384 = 1.018 g A x z = arctan ⁡ ( 0.068 g / 1.018 g ) = 0.0667   r a d (1.4) \begin{cases} R_x=1122/16384=0.068g\\ R_z=16674/16384=1.018g\\ A_{xz}=\arctan(0.068g/1.018g)=0.0667\ rad\\ \end{cases} \tag{1.4} Rx=1122/16384=0.068gRz=16674/16384=1.018gAxz=arctan(0.068g/1.018g)=0.0667 rad(1.4)

​ 注意,此时计算出的角度单位为弧度(rad),需要转换成角度(°):
A x z = 0.0667 / π ∗ 180 = 3.82 ° (1.5) A_{xz}=0.0667/\pi*180=3.82° \tag{1.5} Axz=0.0667/π180=3.82°(1.5)

2. 陀螺仪

​ 陀螺仪的每个通道检测一个轴的旋转。例如,一个 2 轴陀螺仪检测绕 X 和 Y 轴的旋转。为了用数字来表达这些旋转,我们先引入一些符号。首先,我们定义:

  • R x z R_{xz} Rxz —— 惯性力矢量 R R R 在 XOZ 平面上的投影;
  • R y z R_{yz} Ryz —— 惯性力矢量 R R R 在 YOZ 平面上的投影。

​ 在由 R x z R_{xz} Rxz R z R_{z} Rz 组成的直角三角形中,运用勾股定理可得:
R x z 2 = R x 2 + R z 2 (2.1) {R_{xz}}^2={R_x}^2+{R_z}^2 \tag{2.1} Rxz2=Rx2+Rz2(2.1)
​ 同理:
R y z 2 = R y 2 + R z 2 (2.2) {R_{yz}}^2={R_y}^2+{R_z}^2 \tag{2.2} Ryz2=Ry2+Rz2(2.2)
​ 同时注意:
{ R 2 = R x 2 + R y z 2 R 2 = R y 2 + R x z 2 (2.3) \begin{cases} {R}^2={R_x}^2+{R_{yz}}^2\\ {R}^2={R_y}^2+{R_{xz}}^2\\ \end{cases} \tag{2.3} {R2=Rx2+Ryz2R2=Ry2+Rxz2(2.3)
​ 相反,我们按如下方法定义 Z 轴和 R x z 、 R y z R_{xz}、R_{yz} RxzRyz 向量所成的夹角:

  • A x z A_{xz} Axz —— R x z R_{xz} Rxz 和 Z 轴所成的夹角;
  • A y z A_{yz} Ayz —— R y z R_{yz} Ryz 和 Z 轴所成的夹角。

​ 现在我们离陀螺仪要测量的东西又近了一步。陀螺仪测量上面定义的角度的变化率。换句话说,它会输出一个与上面这些角度变化率线性相关的值。为了解释这一点,我们先假设在 t 0 t_0 t0 时刻,我们已经测得绕 Y 轴旋转的角度(即 A x z A_{xz} Axz),定义为 A x z 0 A_{xz0} Axz0 ,之后在 t 1 t_1 t1 时刻我们再次测量这个角度,得到 A x z 1 A_{xz1} Axz1 。则角度变化率按下面方法计算:
R a t e   A x z = ( A x z 1 − A x z 0 )   /   ( t 1 − t 0 ) (2.4) Rate\ A_{xz}=(A_{xz1}-A_{xz0})\ /\ (t_1-t_0) \tag{2.4} Rate Axz=(Axz1Axz0) / (t1t0)(2.4)
​ 如果用度(°)来表示角度,秒(s)来表示时间,那这个值的单位就是度/秒(°/s)。这就是陀螺仪检测的东西。在实际运用中,陀螺仪一般都不会直接输出一个单位为度/秒的数值(除非它是个特殊的数字陀螺仪)。在 MPU-6050 传感器中,就像读取加速度数据一样,会得到一个经过内置 ADC 转换后得到的数字量,单位为 LSB 。参考对加速度传感器数据的处理,我们同样得到:
{ R a t e   A x z = ( G y r o Y − Z e r o R a t e )   /   S e n s i t i v i t y R a t e   A y z = ( G y r o X − Z e r o R a t e )   /   S e n s i t i v i t y (2.5) \begin{cases} Rate\ A_{xz}=(GyroY-ZeroRate)\ /\ Sensitivity\\ Rate\ A_{yz}=(GyroX-ZeroRate)\ /\ Sensitivity\\ \end{cases} \tag{2.5} {Rate Axz=(GyroYZeroRate) / SensitivityRate Ayz=(GyroXZeroRate) / Sensitivity(2.5)
​ 其中,

  • G y r o X , G y r o Y GyroX,GyroY GyroXGyroY —— 这两个值是陀螺仪数据,它们分别代表矢量 R 的投影在 XOZ 和 YOZ 平面内的转角,也可等价的说,旋转可分解为单独绕 X 和 Y 轴的运动;
  • Z e r o R a t e ZeroRate ZeroRate —— 陀螺仪零偏值,它是陀螺仪静止不动时的输出值。理论上,陀螺仪静止不动时,应该输出为 0 的值,但是受制造工艺、外部因素的影响,陀螺仪静止不动时输出一个比较小的随机的不为 0 的值,我们称之为零偏值。
  • S e n s i t i v i t y Sensitivity Sensitivity —— 陀螺仪的灵敏度,单位 L S B   /   ( d e g / s ) \rm{LSB}\ /\ \it(deg/s) LSB / (deg/s) ,它的意思就是如果旋转速度增加 1°/s,陀螺仪的输出就会增加多少数值。

​ 举个例子,假设我们读取到 MPU-6050 传感器的 X 轴数据:

  • G y r o X = 12345 GyroX=12345 GyroX=12345

​ 若此时设置陀螺仪的灵敏度为 16.4,并认为陀螺仪零偏值为 0 ,代入公式(2.5),得到:
R a t e   A y z = ( 12345 − 0 )   /   16.4 = 751   d e g / s (2.6) Rate\ A_{yz}=(12345-0)\ /\ 16.4=751\ deg/s \tag{2.6} Rate Ayz=(123450) / 16.4=751 deg/s(2.6)
​ 换句话说,传感器绕 X 轴以 751°/s 的速度旋转。

​ 注意,因为陀螺仪输出值有正负之分,负号表示该传感器朝着反方向旋转。一份好的传感器规格书会告诉你哪个方向是正方向,否则你就要自己测试出哪个旋转方向会使得传感器输出值为正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加速度计、陀螺仪工作原理 的相关文章

  • 导航卫星的时间系统

    1 GPS时间系统 xff08 GPST xff09 GPS系统是测时测距系统 时间在 GPS测量中是一个基本的观测量 卫星的信号 xff0c 卫星的运动 xff0c 卫星的坐标都与时间密切相关 对时间的要求既要稳定又要连续 为此 xff0
  • JT808协议介绍 --- 格林恩德 CR202 RTK 高精度车载定位器协议解读

    部标808又称为JT808 xff0c JT808标准的全称是 道路运输车辆卫星定位系统终端通讯协议及数据格式 808协议适用于GPS定位车载终端和监控平台之间的通信 当前市面上 xff0c 普通车辆监测设备所安装的GPS定位器 xff0c
  • C++析构函数调用顺序

    文章目录 析构函数工作过程 1 执行析构函数的函数体 2 如果该类中拥有类对象成员 xff0c 且类对象有析构函数 xff0c 则以类对象成员声明次序的相反顺序调用其析构函数 xff0c 销毁类对象成员 3 按原来构造顺序的相反顶序向上依次
  • TCP通信C++实现小例子

    TCP通信C 43 43 实现案例 https www bilibili com video BV1Dt411p74c t 61 1746 61 61 全部来自以上视频 xff0c 纯属搬运 xff0c 小可爱有问题可以举手提问哈 61 6
  • 串行通信简介

    一 串行通信与并行通信 计算机与外界的数据交换称为通信 xff0c 通信分为并行通信和串行通信两种基本方式 并行通信 串行通信 并行通信 xff1a 并行通信指各个数据位同时进行传送的数据通信方式 xff0c 因此有多少个数据位 xff0c
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键
  • day 5 select服务器和客户端

    select客户端代码 xff1a include lt stdio h gt include lt string h gt include lt sys socket h gt include lt netinet in h gt inc
  • python Requests添加Auth和Cert

    最近通过postman发起另外一个项目的请求 xff0c 鉴权较为复杂 xff0c 首先需要设置cert xff0c postman中设置如下 xff1a 需要设置basic auth的参数 然后将接口返回的token放入auth的bear
  • STM32笔记(三)---寄存器映射--BSRR分析

    STM32笔记 xff08 三 xff09 寄存器映射 BSRR分析 GPIO与引脚区别 GPIO包含在引脚内 xff08 引脚内还有电源 晶振等特殊功能引脚 xff09 xff0c 除GPIO拓展内容即为单片机最小系统 GPIO功能如何检
  • ROS赵虚左6.5 Rviz中控制机器人模型运动_选了odom坐标系后小车变白不能动

    原因 xff1a 配置文件中的参考坐标不应该是base footprint xff0c 而是你自己小车最下面那个 小脚 的坐标系 xff0c 我的是footprint 所以把参考坐标换一下就可以了
  • 超声波传感器的基础

    超声波传感器已经有几十年的历史了 xff0c 但是由于它们的性能 灵活性和低成本 xff0c 它们仍然占据着传感市场的很大一部分 随着越来越多的产品实现了自动化 xff0c 随着机器人 自动驾驶汽车和无人驾驶飞机的出现 xff0c 需求进一
  • pthread_create未定义的引用

    在ubuntu使用gcc编译时出现 pthread create未定义的引用 问题 解决如下 xff1a 在编译时加入 l pthread 例如gcc thread c o thr l pthread 原因 xff1a pthread不是l
  • Linux下vscode实现调试

    1 安装好vscode xff0c 安装对应的插件 2 编写代码 xff0c 点击右上角的三角形 xff0c 生成对应可执行文件 3 点击菜单栏中的终端 配置任务 xff0c 选择 c c 43 43 xff1a GCC build act
  • 二进制数与十进制之间的转换以及使用一个函数实现任意进制之间的转换

    其他进制转为十进制都可以实现 xff0c 只需要将函数中的10和2换掉你需要的就行 include lt stdio h gt include lt math h gt 1 二进制转换为十进制 int twoConvertTen long
  • vscode配置C语言编译调试的方法

    一 安装GCC 官方下载 如果你能从在线安装 xff0c 那最好就在线安装吧 不过在线安装太容易中断失败了 如果你能连上官网 xff0c 也可以选择从官网去下载离线安装包 https sourceforge net projects min
  • C语言之补漏(1)

    typedef 1 define与typedef区别 xff1f 相比起宏定义的直接替换 xff0c typedef是对类型的封装 xff08 通俗说就是对类型起一个别名 xff09 2 typedef可以给多个别名 typedef int
  • 关于学习如何组装基于F4V3S飞控的竞速穿越机

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 创作时间2020 8 22 组装一架穿越机 xff0c 你需要的一些最基本的 xff0c 能让它飞起来的配件有 xff1a 机架
  • STM32—串口

    串口介绍 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指数据一位一位
  • 2021电赛元件清单(评论区有题目预测)

    2021 年全国大学生电子设计竞赛仪器设备和主要元器件及器材清单 本科组 1 仪器设备清单 数字示波器 xff08 100MHz xff0c 双通道 xff09 函数发生器 xff08 50 MHz xff0c 双通道 xff09 任意波信
  • 通过TCP实现客户端与服务端之间通信

    客户端发送的消息 xff0c 服务端接收并在终端中显示出来 服务端代码 xff08 server c include lt stdio h gt include lt sys socket h gt include lt netinet i

随机推荐