现在的位置: 首页 > 综合 > 正文

加速度计和陀螺仪指南

2018年04月11日 ⁄ 综合 ⁄ 共 8148字 ⁄ 字号 评论关闭

本文转自中文版--加速度计和陀螺仪指南,我只是重新用重新编辑了一下公式,便于阅读

翻译自

这篇文章主要介绍加速度计个陀螺仪的数学模型和基本算法,以及如何融合这两者,侧重算法、思想的讨论。

——————————————————————————————————————————————————————————————————————————————————————————————————————————

本指南旨在向兴趣者介绍惯性MEMS(Micro-Electro-Mechanical System,微机电系统)传感器,特别是加速度计和陀螺仪以及其他整合IMU(Inertial Measurement Unit,惯性测量单元)设备。

在这篇文章中我将概括这么几个基本并且重要的话题:

  • 加速度计(accelerometer)检测什么

  • 陀螺仪(gyroscope,也称作grro)检测什么

  • 如何将传感器ADC读取的数据转换为物理单元(加速度传感器的单位是g,陀螺仪的单位是 度/秒)

  • 如何结合加速度传感器和陀螺仪的数据以得到设备和平面之间的倾角的准确信息

在整篇文章中我尽量将数学运算降低到最少。如果你知道什么是正弦、余弦、正切函数,那无论你的项目使用哪种平台你应该都会明白和运用这篇文章中的思想,这些平台如Arduino、Propeller、Basic Stamp、Ateml芯片、PIC芯片等等。总有些人认为使用IMU单元需要复杂的数学运算(复杂的FIR或IIR滤波,如卡尔曼滤波,Parks-McClellan滤波等)。你如果研究这些会得到很棒且很复杂的结果。我解释事情的方式,只需要基本的数学。我非常坚信简单的原则。我认为一个简单的系统更容易操作和监控,另外许多嵌入式设备并不具备能力和资源去实现需要进行矩阵的复杂算法。


第一章 加速度计


要了解这个模块我们先从加速度计开始,当我们在想象一个加速度计的时候,我们可以把它想作一个圆球在一个方盒子中,你可能会把它想作一个饼干或者甜圈,但我就把它当做一个球好了:

我们假定这个盒子不在重力场中或者其他任何会影响球的位置的场中,球处于盒子的正中央。你可以想象盒子在外太空中,如果很难想象,那就当做盒子在航天飞机中,一切东西都处于无重力状态。在上面的图中你可以看到我们给每个轴分配一对墙(我们移除了以此来观察里面的情况)。设想 每面都能感测压力。如果,我们突然把盒子向左移动(加速度为那么球会撞上墙,然后我们检测球撞击墙面产生的压力,轴输出值为

请注意加速度计检测到的力的方向与它本身加速度的方向是相反的。这种力量被称为惯性力或假想力。在这个模型中你应该学到加速度计是通过间接测量力对一个墙面的作用来才测量加速度的,在实际应用中,可能通过弹簧等装置来测量力。这个力可以是加速度引起的,但在下面的例子中,我们会发现它不一定是加速度引起的。

如果我们把模型放在地球上,球会落在墙面上并对其施加一个的力,见下图:

在这种情况下盒子没有移动但我们任然读取到轴有的值。球在墙壁上施加的压力是有引力造成的。在理论上,它可以是不同类型的力量,例如,你可以想象我们的球是铁质的,将一个磁铁放在盒子旁边那球就会撞上另一面墙。引用这个例子只是为了说明加速度计的本质是检测力而非加速度。只是加速度所引起的惯性力正好能被加速度计的检测装置所捕获。

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

到目前为止,我们已经分析了单轴的加速度计输出,这是使用;单轴加速度计所能得到的。三轴加速度计的真正价值在于它们能够检测全部三个轴的惯性力。让我们回到盒子模型,并将盒子向右旋转45度。现在球会与两个面接触:,见下图:


0.71这个值不是任意的,它们实际上是0.5的平方根的近似值。我们介绍介绍加速度计的下一个模型时这一点会更清楚。

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

请看看上面的模型,我保留了轴的颜色,以便你的思维能更好的从上一个模型转到新的模型中,想象新模型中对的每个轴都分别于垂直于原模型中的各自的墙面。矢量是加速度计所检测的矢量(它可能是重力或上面例子中惯性力的合成),

是矢量上的投影。请注意下列关系:

公式1

此公式等价于三维空间勾股定理。

还记得我刚才说的1/2的平方根0.71不是个随机值吧。如果你把它们带回去,回顾一下重力加速度是1g,那我们就能验证:

在公式1中简单的取代:

经过一大段理论序言后,我们和实际的加速度计很靠近了。值是实际中加速度计输出的线性相关值,你可以用它们进行各种计算
大多数加速度计可归为两类:数字和模拟。数字加速计可通过12C,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模块得到了以下三个轴的数据:

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


每个加速度计都有一个零加速度的电压值,你可以在它的说明书中找到,这个电压值对应于加速度为0g。通过计算相对0g电压的偏移量我们可以得到一个有符号的电压值。比如说,0g电压值,通过下面的方式可以得到相对0g电压的偏移量:

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



当然,我们可以把所有的步骤全部放在一个式子里,但我想通过介绍每一个步骤以便让你了解怎么读取一个ADC值并将其转换为单位为g的矢量力的分量。

                 (公式2)

                                                                                           

现在我们得到了惯性力矢量的三个分量,如果设备除了重力外不受任何外力影响,那我们就可以认为这个方向就是重力矢量的方向。如果你想计算设备相对于地面的倾斜角,可以计算这个矢量和Z轴之间的夹角。如果,你对每个轴的倾角都感兴趣,你可以把这个结果分为两个分量:X轴、Y轴倾角,这可以通过计算重力矢量和X、Y轴的夹角得到。计算这些角度比你想象的简单,现在回到我们的上一个加速度模型,再加上一些标注上去:


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


我们花了大段的篇幅来解释加速度计模型,最后所要的只是以上这几个公式。根据你的应用场合,你可能会用到我们推导出来的几个过渡公式。我们接下来要介绍陀螺仪模块,并向大家介绍怎么融合加速度计和陀螺仪的数据以得到更精确的倾角值。

但在此之前,我们再介绍几个很常用的公式:



这三个公式通常称作方向余弦,它主要表达了单位向量(长度为1的向量)和R向量具有相同的方向。你可以很容易地验证:

这是个很好的性质,因为它避免了我们一直检测R向量的模。通常如果,我们只是对惯性力的方向感兴趣,那标准化以简化其他计算是个明智的选择。


第二部分 陀螺仪


对于陀螺仪我们将不会像加速度计一样介绍它的等价盒子模型,而是直接跳过加速度计的第二个模型,通过这个模型我们会向大家介绍陀螺仪是怎么工作的。


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

-惯性力矢量R在XZ平面上的投影

-惯性力矢量R在YZ平面上的投影

在由Rxz和Rz组成的直角三角形中,运用勾股定理可得:


同时注意:

这个公式可以和公式1和上面的公式推导出来,也可由R和Ryz所组成的直角三角形推导出来。在这篇文章中我们不会用到这些公式,但有助于理解模型中的那些数值间的关系。

相反,我们按如下方法定义Z轴和向量所成的夹角:

:Z轴和之间的夹角

:Z轴和之间的夹角。

现在,我们离陀螺仪要测量的东西又近了一步。陀螺仪测量上面定义的角度的变化率。换句话说,它会输出一个与上面这些角度变化率线性相关的值。为了解释这一点。我们先假设在时刻,我们已测得绕Y轴旋转的角度,定义为,之后在时刻时刻,我们再次测量这个角度为。角度的变化率按下面的方法计算:

如果用度表示角度,用秒来表示时间,那这个值的单位就是 度/秒。这就是陀螺仪检测的东西

但是,在实际运用中,陀螺仪一般都不会给你一个单位为度/秒(除非它是一个特殊的数字陀螺仪)。这就像加速度计一样,你回得到一个ADC值,并且要用类似公式2的式子将其转换为单位为 度/秒的值。让我们来介绍陀螺仪输出值转换中的ADC部分(假设使用10位ADC模块,如果是8位ADC,用255代替1023,如果是12位,用4095代替1023)。

                   (公式3)

AdcGyroXZ,AdcGyroYZ-这两个值由ADC读取,它们分别代表矢量R的投影在XZ和YZ平面内里转角,也可等价的说,旋转可分解为单独绕Y和X轴的运动。Vref-ADC的参考电压,上例中我们使用3.3V。VzeroRate-是零变化率电压,换句话说它是陀螺仪不受任何转动影响时的输出值,对Acc
Gyro板来说,可以认为是1.23V(此值通常可以在说明书中找到——但千万别相信这个值,因为大多数的陀螺仪在焊接后会有一定的偏差,所以可是使用电压计测量每个通道的输出值,通常这个值在焊接后就不会改变,如果有跳动,在设备使用前写一个校准程序对其进行测量,用户应当在设备启动的时候保持设备静止以进行校准)。

Sensitivity-陀螺仪的灵敏度,单位mV/(deg/s),通常写为mV/deg/s,它的意思就是如果旋转速度增加1deg/s,陀螺仪的输出值就会增加多少mV。Acc_Gyro板的灵敏度值是2mv/deg/s或0.002V/deg/s。

让我们举个例子,假设我们的ADC模块返回以下值:


按照公式3,再带入Acc Gyro板的参数,可得:


换句话说设备绕Y轴(也可以说在XZ平面内)以306deg/s的速度和绕X轴(或者说YZ平面内)以-94deg/s的速度旋转。请注意:负号表示该设备朝着反方向旋转。按照惯例,一个方向的旋转是正值。一份好的陀螺仪说明书会告诉你哪个方向是正的,否则你就要自己测试出哪个方向会使得输出角电压增加。最好使用示波器进行测试,因为一旦你停止了旋转,电压就会调回零速率水平。如果,你使用的万用表,你得保持一定的旋转速度几秒钟并同时比较电压值和零速率电压值。如果值大于零速率电压值那说明这个旋转方向是正向。


第三章  融合加速度计和陀螺仪的数据,将它们综合起来

在使用整合了加速计和陀螺仪的IMU设备时,首先要做的就是统一它们的坐标系。最简单的办法就是将加速度计作为参考坐标系。大多数的加速计技术说明书都会指出对应于物理芯片或设备的XYZ轴方向。例如,下面就是Acc Gyro板的说明书中给出的XYZ轴方向:

接下来的步骤是:

——确定陀螺仪的输出对应到上述的RateAxz,RateAyz值。

—---根据陀螺仪和加速计的位置决定是否要反转输出值

不要设想陀螺仪的输出有XY,它会适应加速度计坐标系里的任何轴,尽管这个输出是IMU模块的一部分。最好的办法就是测试。

接下来得实例用来确定哪个陀螺仪的输出对用RateAxz。

——首先将设备保持水平。加速度计的XY轴输出会是零加速度电压(Acc Gyro板的值是1.65V)

—--接下来将设备绕Y轴旋转,换句话说就是设备在XZ平面内旋转,所以X,Z的加速度输出值会变化而Y轴保持不变。

——当以匀速旋转设备的时候,注意陀螺仪的哪个通道输出值变化了,其他输出应该保持不变。

——在陀螺仪绕Y轴旋转(在XZ平面内旋转)的时候,输出值变化的就是AdcGyroXZ,用于计算RateAxz。

------最后一步,确认旋转的方向是否和我们的模型对应,因为陀螺仪和加速度的位置关系,有时候你可能把RateAxz值反向

——重复上面的测试,将设备绕Y轴旋转,这次查看加速度计的X轴输出(也就是AdcRx)。如果,AdcRx增大(从水平位置开始旋转的第一个90度),那AdcGyroXZ应当减小。这是因为我们观察的是重力矢量,当设备朝一个方向旋转时矢量会朝相反的方向旋转(相对坐标系运动)。所以,如果你不想反转RateAxz,你可以再公式3中引入正负号来解决这个问题:


其中:或者

同样的方法可以用来测试RateAyz,将设备绕X轴旋转,你就能测出陀螺仪的哪个输出对应于RateAyz,以及它是否需要反转。一旦你确定了InvertAyz,你就能可以用下面的公式来计算RateAyz:

如果对Acc Gyro板进行这些测试,你会得到下面的这些结果:

——RateAxz的输出管脚是GX4,InvertAxz =1

——RateAyz的输出管脚是GY4,InvertAyz=1

_____________________________________________________

______________________________________________________

从现在开始我们认为你已经设置好了IMU模块并能计算出正确的Axr,Ayr,Azr值(在第一部分加速度计中定义)以及RateAxz,RateAyz(在第二部分陀螺仪中)。下一步,我们分析这些值之间的关系并得到更准确的设备和地平面之间的倾角。

你可能会问自己一个问题,如果加速度计已经告诉我们Axr,Ayr,Azr的倾角,为什么还要费事去得到陀螺仪的数据?答案很简单:加速度计的数据不是100%准确。有几个原因,还记加速度计测量的是惯性力,这个力可以由重力引起(理想情况只受重力影响),当也可能由设备的加速度(运动)引起。因此,就算加速度计处于一个相对比较平稳的状态,它对一般的震动和机械噪声很敏感。这就是为什么大部分的IMU系统都需要陀螺仪来使加速度计的输出更平滑。但是怎么办到这点呢?陀螺仪不受影响吗?

陀螺仪也会有噪声,但由于它检测的是旋转,因此对线性机械运动没那么敏感,不过陀螺仪有另外一种问题,比如漂移(当选择停止的时候电压不会回到零速率电压)。然而,通过计算加速度计和陀螺仪的平均值我们能得到一个相对更准确的当前设备的倾角值,这比单独使用加速度计更好。

接下来的步骤我会介绍一种算法,算法手卡尔曼滤波中的一些思想启发,但是它更简单并且更容易在嵌入式设备中实现。在此之前。让我们先看看我们需要算法计算什么值。所要算的就是重力矢量,它可由其他值推导出来,如

Axr,Ayr,Azr或者cosX,cosY,cosZ,由这些值我们能得到设备相对于地平面的倾角值,这些关系我们再第一部分已经讨论过。有人可能会说-根据第一部分的公式2,我们不是已经得到Rx,Ry,Rz的值了吗?是的,但是记住,这些值只是由加速度计数据推导出来的,如果你直接将它们用于你的程序你会得到难以忍受的噪声。为了避免进一步的混乱。我们重新定义加速度计的测量值:

Racc-是由加速度计测量到得惯性力矢量,它可分解为下面的分量(在XYZ轴上的投影):



现在我们得到了一组只来自加速度计ADC的值。我们把这组数据叫做"vector",并使用下面的符号:

因为这些Racc的分量可由加速度计数据得到,我们可以把它当做算法的输入。

请注意Racc测量的是重力,如果你得到的矢量长度约等于1g那么你就是正确的:

但是请确定把矢量转换成下面的矢量非常重要:

这可以确保保准化Racc始终是1。

接下来我们引进一个新的向量:


这就是算法的输出值,它经过陀螺仪数据的修正和基于上一次估算的值。

这是算法所做的事:

——加速度计告诉我们:"你现在的位置是Racc"。

我们回答:"谢谢,但让我确认一下"。

—--然后根据陀螺仪的数据和上一次的Rest值修正这个值并输出新的估算值Rest。

我们认为Rest是当前设备姿态的”最佳值“。

让我们看看它是怎么实现的。

数列的开始,我们先认为加速度值正确并赋值:

Rest和Racc是向量,所以上面的式子可以用3个简单的式子代替,注意别重复了:


接下来我们再每个等时间间隔T秒做一次测量,得到新的测量值,并定义为Racc(1),Racc(2),Racc(3)等。同时,在每个时间间隔我们也计算出新的估计值Rest(1),Rest(2),Rest(3),等等。

假设我们再第n步。我们有两列已知的值可以用,即Rest(n-1)和Racc(n)。

Rest(n-1)代表前一个估算值,Rest(0)=Racc(0),Racc(n)代表加速度计测量值。

在计算Rest(n)前,我们先引进一个新的值,它可由陀螺仪和前一个估算值得到,叫做Rgyro,同样它是个矢量并由3个分量组成:

我们分别计算这个矢量的分量,从RxGyro开始。



首先观察陀螺仪模型中下面的关系,根据由Rz和Rxz组成的直角三角形我们能推出:

你肯能从未用过atan2这个函数,它和atan类似,但atan返回值范围是(-PI/2,PI/2),atan2返回值范围是(-PI,PI),并且他有个参数。它能将Rx,Rz值转换成360(-PI,PI)内的角度。更多信息查看atan2

所以,知道了RxEst(n-1)和RzEst(n-1),我们发现:

记住,陀螺仪测量的是Axz角度变化率,因此,我们可以按如下方法估算新的角度Axz(n):



同理可得:

好了。现在我们有了Axz(n),Ayz(n)。现在我们如何推导出RxGyro/RyGyro?根据公式1,我们可以把Rgyro长度写成下式:

同时,因为我们已经将Racc标准化,我们可以认为它的长度是1并且旋转后保持不变,所以写成下面的方式相对比较安全:


我们暂时采用更短的符号进行下面的计算:

根据上面的关系可得:

分子分母除以,得到:

注意

所以:

注意:

所以最后可得

替换成原来的符号可得:

同理可得:

提示:这个公式还可以更进一步简化。分式两边同除以,可得:



继续简化得:


上面这个公式只用了2个三角函数,计算量低。

—————————————————————————————————————————————————————————————————————————————

现在我们发现:

其中,当时,,当时,

一个简单的估算方法:

在实际应用中,当心趋近于0时。这时候你可以跳过整个陀螺仪阶段并赋值:可以用作计算倾角的参考,当它趋近于0时,它可能会溢出并引发不好的结果。这时你会得到很大的浮点数据,并且

函数得到的结果会缺乏精度。


现在我们回顾一下已经得到的结果,我们再算法中的第n步,并计算出了下面的值:

代表加速度计读取的当前值

代表根据和当前陀螺仪读取值所得

我们根据哪个值来更新呢?你可能已经猜到,两者都采用。我们用一个加权平均值,得:

分子分母同除以,公式可简化为:

现在,再次标准化矢量:

现在,可以再次进行下一轮循环了。



抱歉!评论已关闭.