【转】加速度计和陀螺仪指南
![LittleQiang](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/avatar/pre/v1/000000019_avatar_big.jpg)
本帖翻译自IMU(加速度计和陀螺仪设备)在嵌入式应用中使用的指南。
这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法、思想的讨论
介绍
本指南旨在向兴趣者介绍惯性MEMS(微机电系统)传感器,特别是加速度计和陀螺仪以及其他整合IMU(惯性测量单元)
[attach]485[/attach]
IMU单元例子:上图中MCU顶端的ACC Gyro 6DOF,名为USBThumb,支持USB/串口通信
在这篇文章中我将概括这么几个基本并且重要的话题:
- 加速度计(accelerometer)检测什么
- 陀螺仪(gyroscope,也称作 gyro)检测什么
- 如何将传感器ADC读取的数据转换为物理单位(加速度传感器的单位是g,陀螺仪的单位是 度/秒)
- 如何结合加速度传感器和陀螺仪的数据以得到设备和地平面之间的倾角的准确信息
在整篇文章中我尽量将数学运算降低到最少。如果你知道什么是正弦、余弦、正切函数,那无论你的项目使用哪种平台你应该都会明白和运用这篇文章中的思想,这些平台如Arduino、Propeller、Basic Stamp、Ateml芯片、PIC芯片等等。总有些人认为使用IMU单元需要复杂的数学运算(复杂的FIR或IIR滤波,如卡尔曼滤波,Parks-McClellan滤波等)。你如果研究这些会得到很棒且很复杂的结果。我解释事情的方式,只需要基本的数学。我非常坚信简单的原则。我认为一个简单的系统更容易操作和监控,另外许多嵌入式设备并不具备能力和资源去实现需要进行矩阵运算的复杂算法。
我会用我设计的一个新IMU模块——Acc_Gyro Accelerometer + Gyro IMU作为例子。在下面的例子中我们会使用这个设备的参数。用这个模块作为介绍非常合适,因为它由3个设备组成:
- LIS331AL (datasheet) – 3轴 2G 模拟加速度计
- LPR550AL (datasheet) – 双轴(俯仰、翻滚) 500°/s 加速度传感器
- LY550ALH (datasheet) –单轴(偏航)陀螺仪 最后这个设备在这篇介绍中不使用,不过他在DCM Matrix implementation中有重要作用
它们一起组成了一个6自由度的惯性测量单元。这是个花哨的名字!然而,在花哨的名字后面是个非常有用的设备组合,接下来我们会详细介绍之。
第一部分 加速度计
要了解这个模块我们先从加速度计开始。当我们在想象一个加速度计的时候我们可以把它想作一个圆球在一个方盒子中。你可能会把它想作一个饼干或者甜圈,但我就把它当做一个球好了:
我们假定这个盒子不在重力场中或者其他任何会影响球的位置的场中,球处于盒子的正中央。你可以想象盒子在外太空中,远离任何天体,如果很难想象,那就当做盒子在航天飞机中,一切东西都处于无重力状态。在上面的图中你可以看到我们给每个轴分配了一对墙(我们移除了Y+以此来观察里面的情况)。设想每面墙都能感测压力。如果我们突然把盒子向左移动(加速度为1g=9.8m/s^2),那么球会撞上X-墙。然后我们检测球撞击墙面产生的压力,X轴输出值为-1g。
请注意加速度计检测到得力的方向与它本身加速度的方向是相反的。这种力量通常被称为惯性力或假想力 。在这个模型中你你应该学到加速度计是通过间接测量力对一个墙面的作用来测量加速度的,在实际应用中,可能通过弹簧等装置来测量力。这个力可以是加速度引起的,但在下面的例子中,我们会发现它不一定是加速度引起的。
如果我们把模型放在地球上,球会落在Z-墙面上并对其施加一个1g的力,见
下图:
在这种情况下盒子没有移动但我们任然读取到Z轴有-1g的值。球在墙壁上施加的压力是由引力造成的。在理论上,它可以是不同类型的力量 - 例如,你可以想象我们的球是铁质的,将一个磁铁放在盒子旁边那球就会撞上另一面墙。引用这个例子只是为了说明加速度计的本质是检测力而非加速度。只是加速度所引起的惯性力正好能被加速度计的检测装置所捕获。
虽然这个模型并非一个MEMS传感器的真实构造,但它用来解决与加速度计相关的问题相当有效。实际上有些类似传感器中有金属小球,它们称作倾角开关,但是它们的功能更弱,只能检测设备是否在一定程度内倾斜,却不能得到倾斜的程度。
到目前为止,我们已经分析了单轴的加速度计输出,这是使用单轴加速度计所能得到的。三轴加速度计的真正价值在于它们能够检测全部三个轴的惯性力。让我们回到盒子模型,并将盒子向右旋转45度。现在球会与两个面接触:Z-和X-,见下图:
0.71g这个值是不是任意的,它们实际上是1/2的平方根的近似值。我们介绍加速度计的下一个模型时这一点会更清楚。
在上一个模型中我们引入了重力并旋转了盒子。在最后的两个例子中我们分析了盒子在两种情况下的输出值,力矢量保持不变。虽然这有助于理解加速度计是怎么和外部力相互作用的,但如果我们将坐标系换为加速度的三个轴并想象矢量力在周围旋转,这会更方便计算
请看看在上面的模型,我保留了轴的颜色,以便你的思维能更好的从上一个模型转到新的模型中。想象新模型中每个轴都分别垂直于原模型中各自的墙面。矢量R是加速度计所检测的矢量(它可能是重力或上面例子中惯性力的合成)。RX,RY,RZ是矢量R在X,Y,Z上的投影。请注意下列关系:
,R ^ 2 = RX ^ 2 + RY ^ 2 + RZ ^ 2(公式1)
此公式等价于三维空间勾股定理。
还记得我刚才说的1/2的平方根0.71不是个随机值吧。如果你把它们代回上式,回顾一下重力加速度是1g,那我们就能验证:
1 ^ 2 =(SQRT(1/2))^ 2 + 0 ^ 2 +(SQRT(1/2))^ 2
在公式1中简单的取代: R=1, Rx = -SQRT(1/2), Ry = 0 , Rz = -SQRT(1/2)
经过一大段的理论序言后,我们和实际的加速度计很靠近了。RX,RY,RZ值是实际中加速度计输出的线性相关值,你可以用它们进行各种计算。
在我们运用它之前我们先讨论一点获取加速度计数据的方法。大多数加速度计可归为两类:数字和模拟。数字加速度计可通过I2C,SPI或USART方式获取信息,而模拟加速度计的输出是一个在预定范围内的电压值,你需要用ADC(模拟量转数字量)模块将其转换为数字值。我将不会详细介绍ADC是怎么工作的,部分原因是这是个很广的话题,另一个原因是不同平台的ADC都会有差别。有些MCU具有内置ADC模块,而有些则需要外部电路进行ADC转换。不管使用什么类型的ADC模块,你都会得到一个在一定范围内的数值。例如一个10位ADC模块的输出值范围在0 .. 1023间,请注意,1023 = 2 ^ 10 -1。一个12位ADC模块的输出值范围在0 .. 4095内,注意,4095 = 2 ^ 12-1。
我们继续,先考虑下一个简单的例子,假设我们从10位ADC模块得到了以下的三个轴的数据:
AdcRx = 586
AdcRy = 630
AdcRz = 561
每个ADC模块都有一个参考电压,假设在我们的例子中,它是3.3V。要将一个10位的ADC值转成电压值,我们使用下列公式:
VoltsRx = AdcRx * VREF / 1023
小注:8位ADC的最大值是255 = 2 ^ 8 -1,12位ADC最大值是4095 = 2 ^ 12 -1。
将3个轴的值代入上式,得到:
VoltsRx = 586 * 3.3 / 1023 =~1.89V(结果取两位小数)
VoltsRy = 630 * 3.3 / 1023 =~2.03V
VoltsRz = 561 * 3.3 / 1023 =~1.81V
每个加速度计都有一个零加速度的电压值,你可以在它的说明书中找到,这个电压值对应于加速度为0g。通过计算相对0g电压的偏移量我们可以得到一个有符号的电压值。比方说,0g电压值 VzeroG= 1.65V,通过下面的方式可以得到相对0g电压的偏移量:
DeltaVoltsRx = 1.89V - 1.65V = 0.24V
DeltaVoltsRy = 2.03V - 1.65V = 0.38V
DeltaVoltsRz = 1.81V - 1.65V = 0.16V
现在我们得到了加速度计的电压值,但它的单位还不是g(9.8m/s^2),最后的转换,我们还需要引入加速度计的灵敏度(Sensitivity),单位通常是 mV/g。比方说,加速度计的灵敏度 Sensitivity= 478.5mV / g = 0.4785V /g。灵敏度值可以在加速度计说明书中找到。要获得最后的单位为g的加速度,我们使用下列公式计算:
RX = DeltaVoltsRx /Sensitivity
RX = 0.24V / 0.4785V / G =~0.5g
RY = 0.38V / 0.4785V / G =~0.79g
RZ = 0.16V / 0.4785V / G =~0.33g
当然,我们可以把所有的步骤全部放在一个式子里,但我想通过介绍每一个步骤以便让你了解怎么读取一个ADC值并将其转换为单位为g的矢量力的分量。
Rx = (AdcRx * Vref / 1023 – VzeroG) / Sensitivity (公式2)
Ry = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
Rz = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity
现在我们得到了惯性力矢量的三个分量,如果设备除了重力外不受任何外力影响,那我们就可以认为这个方向就是重力矢量的方向。如果你想计算设备相对于地面的倾角,可以计算这个矢量和Z轴之间的夹角。如果你对每个轴的倾角都感兴趣,你可以把这个结果分为两个分量:X轴、Y轴倾角,这可以通过计算重力矢量和X、Y轴的夹角得到。计算这些角度比你想象的简单,现在我们已经算出了Rx,Ry,Rz的值,让我们回到我们的上一个加速度模型,再加一些标注上去:
陀螺仪的每个通道检测一个轴的旋转。例如,一个2轴陀螺仪检测绕X和Y轴的旋转。为了用数字来表达这些旋转,我们先引进一些符号。首先我们定义:
Rxz – 惯性力矢量R在XZ平面上的投影
Ryz – 惯性力矢量R在YZ平面的上投影
在由Rxz和Rz组成的直角三角形中,运用勾股定理可得:
Rxz^2 = Rx^2 + Rz^2 ,同样:
Ryz^2 = Ry^2 + Rz^2
同时注意:
R^2 = Rxz^2 + Ry^2 ,这个公式可以公式1和上面的公式推导出来,也可由R和Ryz所组成的直角三角形推导出来
R ^ 2 = Ryz ^ 2 + RX ^ 2
在这篇文章中我们不会用到这些公式,但知道模型中的那些数值间的关系有助于理解。
相反,我们按如下方法定义Z轴和Rxz、Ryz向量所成的夹角:
AXZ - Rxz(矢量R在XZ平面的投影)和Z轴所成的夹角
AYZ - Ryz(矢量R在YZ平面的投影)和Z轴所成夹角
现在我们离陀螺仪要测量的东西又近了一步。陀螺仪测量上面定义的角度的变化率。换句话说,它会输出一个与上面这些角度变化率线性相关的值。为了解释这一点,我们先假设在t0时刻,我们已测得绕Y轴旋转的角度(也就是Axz),定义为Axz0,之后在t1时刻我们再次测量这个角度,得到Axz1。角度变化率按下面方法计算:
RateAxz = (Axz1 – Axz0) / (t1 – t0).
如果用度来表示角度,秒来表示时间,那这个值的单位就是 度/秒。这就是陀螺仪检测的东西。
在实际运用中,陀螺仪一般都不会直接给你一个单位为度/秒的值(除非它是个特殊的数字陀螺仪)。就像加速度计一样,你会得到一个ADC值并且要用类似公式2的式子将其转换成单位为 度/秒的值。让我们来介绍陀螺仪输出值转换中的ADC部分(假设使用10位ADC模块,如果是8位ADC,用1023代替255,如果是12为ADC用4095代替1023)。
RateAxz = (AdcGyroXZ * Vref / 1023 – VzeroRate) / Sensitivity 公式3
RateAyz = (AdcGyroYZ * Vref / 1023 – VzeroRate) / Sensitivity
AdcGyroXZ,AdcGyroYZ - 这两个值由ADC读取,它们分别代表矢量R的投影在XZ和YZ平面内里的转角,也可等价的说,旋转可分解为单独绕Y和X轴的运动。
Vref – ADC的参考电压,上例中我们使用3.3V
VzeroRate – 是零变化率电压,换句话说它是陀螺仪不受任何转动影响时的输出值,对Acc Gyro板来说,可以认为是1.23V(此值通常可以在说明书中找到——但千万别相信这个值,因为大多数的陀螺仪在焊接后会有一定的偏差,所以可以使用电压计测量每个通道的输出值,通常这个值在焊接后就不会改变,如果有跳动,在设备使用前写一个校准程序对其进行测量,用户应当在设备启动的时候保持设备静止以进行校准)。
Sensitivity –陀螺仪的灵敏度,单位mV/(deg/s),通常写作mV/deg/s,它的意思就是如果旋转速度增加1°/s,陀螺仪的输出就会增加多少mV。Acc_Gyro板的灵敏度值是2mV/deg/s或0.002V/deg/s
让我们举个例子,假设我们的ADC模块返回以下值:
AdcGyroXZ = 571
AdcGyroXZ = 323
用上面的公式,在代入Acc Gyro板的参数,可得:
RateAxz = (571 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ 306 deg/s
RateAyz = (323 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ -94 deg/s
换句话说设备绕Y轴(也可以说在XZ平面内)以306°/s速度和绕X轴(或者说YZ平面内)以-94°/s的速度旋转。请注意,负号表示该设备朝着反方向旋转。按照惯例,一个方向的旋转是正值。一份好的陀螺仪说明书会告诉你哪个方向是正的,否则你就要自己测试出哪个旋转方向会使得输出脚电压增加。最好使用示波器进行测试,因为一旦你停止了旋转,电压就会掉回零速率水平。如果你使用的是万用表,你得保持一定的旋转速度几秒钟并同时比较电压值和零速率电压值。如果值大于零速率电压值那说明这个旋转方向是正向。
这篇文章主要介绍加速度计和陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法、思想的讨论
介绍
本指南旨在向兴趣者介绍惯性MEMS(微机电系统)传感器,特别是加速度计和陀螺仪以及其他整合IMU(惯性测量单元)
[attach]485[/attach]
IMU单元例子:上图中MCU顶端的ACC Gyro 6DOF,名为USBThumb,支持USB/串口通信
在这篇文章中我将概括这么几个基本并且重要的话题:
- 加速度计(accelerometer)检测什么
- 陀螺仪(gyroscope,也称作 gyro)检测什么
- 如何将传感器ADC读取的数据转换为物理单位(加速度传感器的单位是g,陀螺仪的单位是 度/秒)
- 如何结合加速度传感器和陀螺仪的数据以得到设备和地平面之间的倾角的准确信息
在整篇文章中我尽量将数学运算降低到最少。如果你知道什么是正弦、余弦、正切函数,那无论你的项目使用哪种平台你应该都会明白和运用这篇文章中的思想,这些平台如Arduino、Propeller、Basic Stamp、Ateml芯片、PIC芯片等等。总有些人认为使用IMU单元需要复杂的数学运算(复杂的FIR或IIR滤波,如卡尔曼滤波,Parks-McClellan滤波等)。你如果研究这些会得到很棒且很复杂的结果。我解释事情的方式,只需要基本的数学。我非常坚信简单的原则。我认为一个简单的系统更容易操作和监控,另外许多嵌入式设备并不具备能力和资源去实现需要进行矩阵运算的复杂算法。
我会用我设计的一个新IMU模块——Acc_Gyro Accelerometer + Gyro IMU作为例子。在下面的例子中我们会使用这个设备的参数。用这个模块作为介绍非常合适,因为它由3个设备组成:
- LIS331AL (datasheet) – 3轴 2G 模拟加速度计
- LPR550AL (datasheet) – 双轴(俯仰、翻滚) 500°/s 加速度传感器
- LY550ALH (datasheet) –单轴(偏航)陀螺仪 最后这个设备在这篇介绍中不使用,不过他在DCM Matrix implementation中有重要作用
它们一起组成了一个6自由度的惯性测量单元。这是个花哨的名字!然而,在花哨的名字后面是个非常有用的设备组合,接下来我们会详细介绍之。
第一部分 加速度计
要了解这个模块我们先从加速度计开始。当我们在想象一个加速度计的时候我们可以把它想作一个圆球在一个方盒子中。你可能会把它想作一个饼干或者甜圈,但我就把它当做一个球好了:
我们假定这个盒子不在重力场中或者其他任何会影响球的位置的场中,球处于盒子的正中央。你可以想象盒子在外太空中,远离任何天体,如果很难想象,那就当做盒子在航天飞机中,一切东西都处于无重力状态。在上面的图中你可以看到我们给每个轴分配了一对墙(我们移除了Y+以此来观察里面的情况)。设想每面墙都能感测压力。如果我们突然把盒子向左移动(加速度为1g=9.8m/s^2),那么球会撞上X-墙。然后我们检测球撞击墙面产生的压力,X轴输出值为-1g。
请注意加速度计检测到得力的方向与它本身加速度的方向是相反的。这种力量通常被称为惯性力或假想力 。在这个模型中你你应该学到加速度计是通过间接测量力对一个墙面的作用来测量加速度的,在实际应用中,可能通过弹簧等装置来测量力。这个力可以是加速度引起的,但在下面的例子中,我们会发现它不一定是加速度引起的。
如果我们把模型放在地球上,球会落在Z-墙面上并对其施加一个1g的力,见
下图:
在这种情况下盒子没有移动但我们任然读取到Z轴有-1g的值。球在墙壁上施加的压力是由引力造成的。在理论上,它可以是不同类型的力量 - 例如,你可以想象我们的球是铁质的,将一个磁铁放在盒子旁边那球就会撞上另一面墙。引用这个例子只是为了说明加速度计的本质是检测力而非加速度。只是加速度所引起的惯性力正好能被加速度计的检测装置所捕获。
虽然这个模型并非一个MEMS传感器的真实构造,但它用来解决与加速度计相关的问题相当有效。实际上有些类似传感器中有金属小球,它们称作倾角开关,但是它们的功能更弱,只能检测设备是否在一定程度内倾斜,却不能得到倾斜的程度。
到目前为止,我们已经分析了单轴的加速度计输出,这是使用单轴加速度计所能得到的。三轴加速度计的真正价值在于它们能够检测全部三个轴的惯性力。让我们回到盒子模型,并将盒子向右旋转45度。现在球会与两个面接触:Z-和X-,见下图:
0.71g这个值是不是任意的,它们实际上是1/2的平方根的近似值。我们介绍加速度计的下一个模型时这一点会更清楚。
在上一个模型中我们引入了重力并旋转了盒子。在最后的两个例子中我们分析了盒子在两种情况下的输出值,力矢量保持不变。虽然这有助于理解加速度计是怎么和外部力相互作用的,但如果我们将坐标系换为加速度的三个轴并想象矢量力在周围旋转,这会更方便计算
请看看在上面的模型,我保留了轴的颜色,以便你的思维能更好的从上一个模型转到新的模型中。想象新模型中每个轴都分别垂直于原模型中各自的墙面。矢量R是加速度计所检测的矢量(它可能是重力或上面例子中惯性力的合成)。RX,RY,RZ是矢量R在X,Y,Z上的投影。请注意下列关系:
,R ^ 2 = RX ^ 2 + RY ^ 2 + RZ ^ 2(公式1)
此公式等价于三维空间勾股定理。
还记得我刚才说的1/2的平方根0.71不是个随机值吧。如果你把它们代回上式,回顾一下重力加速度是1g,那我们就能验证:
1 ^ 2 =(SQRT(1/2))^ 2 + 0 ^ 2 +(SQRT(1/2))^ 2
在公式1中简单的取代: R=1, Rx = -SQRT(1/2), Ry = 0 , Rz = -SQRT(1/2)
经过一大段的理论序言后,我们和实际的加速度计很靠近了。RX,RY,RZ值是实际中加速度计输出的线性相关值,你可以用它们进行各种计算。
在我们运用它之前我们先讨论一点获取加速度计数据的方法。大多数加速度计可归为两类:数字和模拟。数字加速度计可通过I2C,SPI或USART方式获取信息,而模拟加速度计的输出是一个在预定范围内的电压值,你需要用ADC(模拟量转数字量)模块将其转换为数字值。我将不会详细介绍ADC是怎么工作的,部分原因是这是个很广的话题,另一个原因是不同平台的ADC都会有差别。有些MCU具有内置ADC模块,而有些则需要外部电路进行ADC转换。不管使用什么类型的ADC模块,你都会得到一个在一定范围内的数值。例如一个10位ADC模块的输出值范围在0 .. 1023间,请注意,1023 = 2 ^ 10 -1。一个12位ADC模块的输出值范围在0 .. 4095内,注意,4095 = 2 ^ 12-1。
我们继续,先考虑下一个简单的例子,假设我们从10位ADC模块得到了以下的三个轴的数据:
AdcRx = 586
AdcRy = 630
AdcRz = 561
每个ADC模块都有一个参考电压,假设在我们的例子中,它是3.3V。要将一个10位的ADC值转成电压值,我们使用下列公式:
VoltsRx = AdcRx * VREF / 1023
小注:8位ADC的最大值是255 = 2 ^ 8 -1,12位ADC最大值是4095 = 2 ^ 12 -1。
将3个轴的值代入上式,得到:
VoltsRx = 586 * 3.3 / 1023 =~1.89V(结果取两位小数)
VoltsRy = 630 * 3.3 / 1023 =~2.03V
VoltsRz = 561 * 3.3 / 1023 =~1.81V
每个加速度计都有一个零加速度的电压值,你可以在它的说明书中找到,这个电压值对应于加速度为0g。通过计算相对0g电压的偏移量我们可以得到一个有符号的电压值。比方说,0g电压值 VzeroG= 1.65V,通过下面的方式可以得到相对0g电压的偏移量:
DeltaVoltsRx = 1.89V - 1.65V = 0.24V
DeltaVoltsRy = 2.03V - 1.65V = 0.38V
DeltaVoltsRz = 1.81V - 1.65V = 0.16V
现在我们得到了加速度计的电压值,但它的单位还不是g(9.8m/s^2),最后的转换,我们还需要引入加速度计的灵敏度(Sensitivity),单位通常是 mV/g。比方说,加速度计的灵敏度 Sensitivity= 478.5mV / g = 0.4785V /g。灵敏度值可以在加速度计说明书中找到。要获得最后的单位为g的加速度,我们使用下列公式计算:
RX = DeltaVoltsRx /Sensitivity
RX = 0.24V / 0.4785V / G =~0.5g
RY = 0.38V / 0.4785V / G =~0.79g
RZ = 0.16V / 0.4785V / G =~0.33g
当然,我们可以把所有的步骤全部放在一个式子里,但我想通过介绍每一个步骤以便让你了解怎么读取一个ADC值并将其转换为单位为g的矢量力的分量。
Rx = (AdcRx * Vref / 1023 – VzeroG) / Sensitivity (公式2)
Ry = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
Rz = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity
现在我们得到了惯性力矢量的三个分量,如果设备除了重力外不受任何外力影响,那我们就可以认为这个方向就是重力矢量的方向。如果你想计算设备相对于地面的倾角,可以计算这个矢量和Z轴之间的夹角。如果你对每个轴的倾角都感兴趣,你可以把这个结果分为两个分量:X轴、Y轴倾角,这可以通过计算重力矢量和X、Y轴的夹角得到。计算这些角度比你想象的简单,现在我们已经算出了Rx,Ry,Rz的值,让我们回到我们的上一个加速度模型,再加一些标注上去:
陀螺仪的每个通道检测一个轴的旋转。例如,一个2轴陀螺仪检测绕X和Y轴的旋转。为了用数字来表达这些旋转,我们先引进一些符号。首先我们定义:
Rxz – 惯性力矢量R在XZ平面上的投影
Ryz – 惯性力矢量R在YZ平面的上投影
在由Rxz和Rz组成的直角三角形中,运用勾股定理可得:
Rxz^2 = Rx^2 + Rz^2 ,同样:
Ryz^2 = Ry^2 + Rz^2
同时注意:
R^2 = Rxz^2 + Ry^2 ,这个公式可以公式1和上面的公式推导出来,也可由R和Ryz所组成的直角三角形推导出来
R ^ 2 = Ryz ^ 2 + RX ^ 2
在这篇文章中我们不会用到这些公式,但知道模型中的那些数值间的关系有助于理解。
相反,我们按如下方法定义Z轴和Rxz、Ryz向量所成的夹角:
AXZ - Rxz(矢量R在XZ平面的投影)和Z轴所成的夹角
AYZ - Ryz(矢量R在YZ平面的投影)和Z轴所成夹角
现在我们离陀螺仪要测量的东西又近了一步。陀螺仪测量上面定义的角度的变化率。换句话说,它会输出一个与上面这些角度变化率线性相关的值。为了解释这一点,我们先假设在t0时刻,我们已测得绕Y轴旋转的角度(也就是Axz),定义为Axz0,之后在t1时刻我们再次测量这个角度,得到Axz1。角度变化率按下面方法计算:
RateAxz = (Axz1 – Axz0) / (t1 – t0).
如果用度来表示角度,秒来表示时间,那这个值的单位就是 度/秒。这就是陀螺仪检测的东西。
在实际运用中,陀螺仪一般都不会直接给你一个单位为度/秒的值(除非它是个特殊的数字陀螺仪)。就像加速度计一样,你会得到一个ADC值并且要用类似公式2的式子将其转换成单位为 度/秒的值。让我们来介绍陀螺仪输出值转换中的ADC部分(假设使用10位ADC模块,如果是8位ADC,用1023代替255,如果是12为ADC用4095代替1023)。
RateAxz = (AdcGyroXZ * Vref / 1023 – VzeroRate) / Sensitivity 公式3
RateAyz = (AdcGyroYZ * Vref / 1023 – VzeroRate) / Sensitivity
AdcGyroXZ,AdcGyroYZ - 这两个值由ADC读取,它们分别代表矢量R的投影在XZ和YZ平面内里的转角,也可等价的说,旋转可分解为单独绕Y和X轴的运动。
Vref – ADC的参考电压,上例中我们使用3.3V
VzeroRate – 是零变化率电压,换句话说它是陀螺仪不受任何转动影响时的输出值,对Acc Gyro板来说,可以认为是1.23V(此值通常可以在说明书中找到——但千万别相信这个值,因为大多数的陀螺仪在焊接后会有一定的偏差,所以可以使用电压计测量每个通道的输出值,通常这个值在焊接后就不会改变,如果有跳动,在设备使用前写一个校准程序对其进行测量,用户应当在设备启动的时候保持设备静止以进行校准)。
Sensitivity –陀螺仪的灵敏度,单位mV/(deg/s),通常写作mV/deg/s,它的意思就是如果旋转速度增加1°/s,陀螺仪的输出就会增加多少mV。Acc_Gyro板的灵敏度值是2mV/deg/s或0.002V/deg/s
让我们举个例子,假设我们的ADC模块返回以下值:
AdcGyroXZ = 571
AdcGyroXZ = 323
用上面的公式,在代入Acc Gyro板的参数,可得:
RateAxz = (571 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ 306 deg/s
RateAyz = (323 * 3.3V / 1023 – 1.23V) / ( 0.002V/deg/s) =~ -94 deg/s
换句话说设备绕Y轴(也可以说在XZ平面内)以306°/s速度和绕X轴(或者说YZ平面内)以-94°/s的速度旋转。请注意,负号表示该设备朝着反方向旋转。按照惯例,一个方向的旋转是正值。一份好的陀螺仪说明书会告诉你哪个方向是正的,否则你就要自己测试出哪个旋转方向会使得输出脚电压增加。最好使用示波器进行测试,因为一旦你停止了旋转,电压就会掉回零速率水平。如果你使用的是万用表,你得保持一定的旋转速度几秒钟并同时比较电压值和零速率电压值。如果值大于零速率电压值那说明这个旋转方向是正向。
关联专栏
![](https://hz-rm-bbs-web-prod.oss-cn-hangzhou.aliyuncs.com/bbs-prod/d1cfc39b148740f1bf97c085c77824b2.jpg)
请问这篇文章对你有用吗?
【转】加速度计和陀螺仪指南