嵌入式应用中使用IMU(加速度计或陀螺仪)指南——加速度计

Accelerometer and Gyroscope Device

引言

 

这份指南是针对于所有对于惯性MEMS(微机电系统)传感器有兴趣的人所撰写的,特别是加速度计和陀螺仪还有混合式的IMU设备(惯性测量单元)。

我试着在这篇文章中涵盖一些基础的但是重要的主题。

  • 一个加速度计测量的是什么?
  • 一个陀螺仪(又名陀螺)测量的是什么?
  • 如何对得到传感器的数据进行模拟到数字的转换(ADC),来得到物理单位的数据(对于加速度计而言就是g,对于陀螺仪而言就是deg/s)。
  • 如何融合加速计与陀螺仪读数来获得较为准确的设备关于地平面的倾斜信息。

在整篇文章中我会尽量少的提及数学。如果你知道正弦(Sine)/余弦(Cosine)/正切(Tangent)是什么,那么你将能够在诸如Arduino,Propeller,Basic Stamp,Ateml芯片,Microchip PIC等平台开发工程时使用本文所讲到的想法。有许多人认为要使用一个IMU单元需要使用要复杂的数学知识(如复杂的FIR或IIR滤波器如Kalman滤波器,Parks-McClellan滤波器等)。你可以去研究这些然后得到一个很好的但是很复杂的结果。使用我的方法来对这些进行解释只需要很简单的数学知识。我是简单的忠实信任者。我主伙一个简单的系统会更容易去控制与监测,此外,大部分的嵌入式设备也没有足够的功率和资源去执行要求矩阵的复杂算法。

我将使用一个我制作的IMU单元——加速度计加陀螺仪,来作为示例。我将在下面的例子中使用这个设备的参数。这个单元是一个很好设备用来起步,因为它包含了三个部件:

  • LIS33AL(数据手册)——模拟的3轴2G加速度计。
  • LPR550AL(数据手册)——一个双轴(Pitch和Roll),500d/s陀螺仪。
  • LY550ALH(数据手册)——一个单轴(Yaw)陀螺仪(这最后一个设备在这篇教程中不会使用,但是他是相关,当你看DCM的矩阵应用时)。

它们一起表示一个6个自由度的惯性测量单元。这是一个很酷炫的名字!尽管如此,在这个名字下是一个很有用的混合设备,我们会 下面进行详细解释。

第一部分:加速计

为了理解这个单元, 我们先从加速计开始。当我们研究加速计时,这通常是非常有用地来想像一个立方体的盒子,里面有一个小球。你可以想像里面有一个饼干或是一个面包圈,但我为想像成一个球:

如果我们把这个盒子放置在一个没有重力的场中或者是一个不会影响球位置的场中——这个球将仅悬浮于盒子中间。你可以想像这个盒子是在外太空中,远离所有的宇宙体,如果这样的一个地方难以想到,可以想像一艘太空飞船绕着一颗行星在轨道上飞行,太空飞船中的所有物体都是处于无重力状态。从上面的图中我们可以看出我们对于每一个轴都分配了一对墙面(我们移除那个Y+墙面,所以我们可以看到盒子的内部)。想像每个墙面都是对压力敏感的。如果我们突然将盒子移向左(我们对它以加速为1g=9.8m/s^2进行加速),这个球就会撞击到那个X-墙面。我们接下来测量球对于墙面施加的压力然后在X轴上输出一个数值-1g。

请注意加速度计检测到的力实际上是与加速度矢量方向相反的。这个力通常叫做惯性力或假想力。你从中应该学到的一件事是一个加速度计是通过一个施加到它的一面墙上的力来间接得到加速度(根据我们的模型,在实际生活中的加速度中,它可能是一个弹簧或是一些其他东西)。这个力可能由加速度产生,但是从下一个例子中我们可以看到它并不总是由于加速度而产生。

如果我们把我们的模型放到地球上,那个球就会掉落到Z墙面上并且会施加一个1g的力到底面上,正如下图所示:

在这一情况下盒子并没有移动,但是仍然在Z轴上受到-1g的力。球施加到墙面的压力是由引力造成的。理论上,它可以是不同类型的力——举个例子,如果你想像我们的球是金属的,放置一块磁铁在盒子附近可以使球移动并撞击到另一墙面上。以上的讲述是为了说明,加速度计本质上测量的是力而不是加速度。仅当加速度造成惯性力,并被加速度计中的力检测机械装置捕获。

尽管我们的模型并非是准确的微机电系统的构成方式,但在解决加速度计的相关问题时通常是很有用处的。现实中有一些相似的传感器,内部有金属小球,被称为tilt switch,无论如何,这些传感器更加基本并且通常只能告诉我们在一定范围内物体是否倾斜而不能给出倾斜的程度。

迄今为止,我们已经分析了在一个轴上加速度的输出,这也是你对于单轴加速度计所能学到的所有。三轴加速度的真实值是来自于它们在三个轴上检测到惯性力。让我们回顾一下我们的盒子模型,并顺时针旋转45度。球现在将触碰到2个面:Z-与X-正如下图所示:

那个值0.71并非是随意的,它们是对于SQRT(1/2)的近似。这将会变得更加的清晰,当我们引入下一个模型。

在上一个模型中,我们固定了引力的大小,并旋转了我们想像的盒子。在上两个例子中,我们分析了在两个不们的盒子位置上的输出,但力矢量还是保持为常数。但是这有用的,在理解加速度计与外界力之间的关系,这是更加实用的来进行计算,如果我们固定加速度计的坐标系统并想像力矢量围绕着我们旋转。

请先看一下以面的模型,我保留了坐标轴的颜色所以你可以做一个心理上的转换,从上一个模型到这个新的模型。想像一下新模型中的每一个坐标轴是垂直于上一个盒子模型中的每个面。矢量R是加速度计下在测量的力矢量(它可以是引力也可以是惯性力,如同上面的例子,也可以是两者的结合)。Rx,Ry,Rz是R矢量在X,Y,Z轴上的投影。请注意以下的关系:

R^2=Rx^2+Ry^2+Rz^2 (Eq.1)

这就是3维空间中的勾股定理。

记得早些时候我告诉你,SQRT(1/2)~0.71并非偶然。如果你把它们代入到上面的式子吧,并且记得我们的引力是1g,我们可以验证:

1^2=(-SQRT(1/2))^2+0^2+(-SQRT(1/2))^2

只是进行了替换,R=1,Rx=-SQRT(1/2),Ry=0,Rz=-SQRT(1/2) in Eq.1

在一大段的理论前言之后,我们更加接近现实生活中的加速度计。那个Rx,Ry,Rz实际上是线性的,对于真实生活中的加速度计输出而言,所以你可以进行各种各样的计算。

在我们谈到那些内容之前,我们来讲一点关于加速度计将信息传输给我们的一些方式。大部分的加速度计使用两种方法:数字和模拟。数字加速度计通过串行协议,比如I2C,SPI或是USART给出信息,而模拟加速度计将会输出一个电平在一个预定的范围内,你可以转换为一个数字值使用ADC(模拟数字转换器)模块。我不会太深入的讲解ADC是如何工作的,部分是因为这是一个扩展话题,还有一部分原因是因为在不同的平台上ADC是有差异的。一起微控制器有内建ADC模块,一些需要外部的模块来执行ADC转换。不管你使用哪种的ADC模块你最后都将得到一个一定范围内的数据。比如10-bit的ADC模块,将会输出0-1023范围内的一个数值,注意到1023=2^10-1。而12bit的ADC模块将会输出一个0-4095范围内的数值,记住4095=2^12-1。

让我们继续,考虑一个简单的例子,假定我们10bit的ADC模块给我们三个轴的数值:

AdcRx=586

AdcRy=630

AdcRz=561

每一个ADC模块将会有一个参考电压,让我们假定在我们的例子中是3.3V。为了转换10bit的adc值到电压,我们使用以下的公式:

VoltsRx=AdcRx*Vref/1023

一个快速笔记:对于8bit的ADC,最后的分母是255=2^8-1,对于12bit的ADC,最后的分母会是4095=2^12-1。

对三个通道使用这个公式,我们可以得到:

VoltsRx = 586 * 3.3V / 1023 =~ 1.89V (对于所有的结果我们取小数点后2位,十进制)
VoltsRy = 630 * 3.3V / 1023 =~ 2.03V
VoltsRz = 561 * 3.3V / 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

我们现在有以Volts为单位的加速度计的读数,它仍然不是以g(9.8m/s^2)为单位的,为了做最后的转换,我们使用加速度敏感度,通常以mV/g来表达。让我们定义敏感度为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 (Eq.2)
Ry = (AdcRy * Vref / 1023 – VzeroG) / Sensitivity
Rz = (AdcRz * Vref / 1023 – VzeroG) / Sensitivity

现在我们有组成惯性力适量的所有的三个部分,如果我们的设备不如除重力外的其他力,我们可以假定这个方向就是重力矢量的方向。如果你想计算设备对于地面的倾斜,你可以计算这个矢量关于Z轴的角度。如果你对每个轴上的倾斜方向都有兴趣的话你可以把结果分离成两个部分:对于X和Y轴上的倾斜,可以力矢量关于X、Y轴上的角度。计算这些角度比你想像中的要简单。还记得你已经计算出Rx、Ry和Rz。让我们回到最后一个加速度计模型,并做一起额外的标记:

我们所感兴趣的角度是力矢量与X、Y、Z轴间的角度。我们定义这些角度为Axr,Ayr,Azr。由R和Rx组成的直角,你可能注意到:

cos(Axr) = Rx / R , 同样的:
cos(Ayr) = Ry / R
cos(Azr) = Rz / R

从 Eq.1 我们可以推导出  R = SQRT( Rx^2 + Ry^2 + Rz^2)。

我们可以使用arccos()(cos()的逆函数)来得到最后的角度

Axr = arccos(Rx/R)
Ayr = arccos(Ry/R)
Azr = arccos(Rz/R)

我们花了很大的精力来讲解加速度计模型,只提出了几个式子。你可能会使用中间的一些公式根据你的应用需求。稍后我也会提出陀螺仪模型,并且我们会明白如何将加速度计和陀螺仪的数据进行融合,来得到更加准确的倾斜估计。

在此之后我们做一些有用的笔记:

cosX = cos(Axr) = Rx / R
cosY = cos(Ayr) = Ry / R
cosZ = cos(Azr) = Rz / R

这三个一组的方程称为方向余弦,它代表了单位矢量(矢量的长度为1),方向和R矢量相同。你可以很容易验证:

SQRT(cosX^2 + cosY^2 + cosZ^2) = 1

这是一个很好的性质,我们可以不用去管R矢量的长度。大多数情况下我们只想知道R矢量的方向,所以进行标准化是有意义的,可以用来简化计算。

未经允许不得转载:TacuLee » 嵌入式应用中使用IMU(加速度计或陀螺仪)指南——加速度计

赞 (2)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址