惯性传感器在嵌入式系统中的应用.docx
《惯性传感器在嵌入式系统中的应用.docx》由会员分享,可在线阅读,更多相关《惯性传感器在嵌入式系统中的应用.docx(18页珍藏版)》请在冰豆网上搜索。
惯性传感器在嵌入式系统中的应用
文章出处:
引言
本文是介绍惯性MEMS(微电子机械系统)传感器,尤其是加速度计和陀螺仪,同时介绍IMU(惯性测量单元)的数据融合。
文中使用的是IMU单元是具有6个自由度的加速度计和陀螺仪的组合,通过MCU控制。
文中将会涉及到以下的知识点:
(1)加速度计是测量什么的
(2)陀螺仪是测量什么的
(3)传感器的输出值经过ADC采样,怎么ADC转换的值转换成物理单位(加速度计输出值的单位是g,陀螺仪输出值的单位是deg/s)
(4)怎么融合加速度计和陀螺仪的值,获得就正确的角度(传感器对水平面的角度)估计。
贯穿全文我会将数学推导减少到最小。
如果你懂得正弦,余弦,正切函数,就能理解这篇文章。
能够将文章介绍的思想应用到你自己的平台。
本文的说明是在一个示例IMU单元进行的,这个模块包含以下三部分:
LIS331AL:
三轴模拟式加速度计
LPR550AL:
两轴精度为500deg/second的陀螺仪。
LY550ALH:
单轴陀螺仪(在文中没有用到)
将以上几个芯片联合在一起就能组成一个6个自由度的惯性测量单元。
模块如下图所示:
第一部分:
加速度计
我们从加速度计开始,来了解这个单元的工作原理。
当去了解加速度计的时候,通常我们想象将一个球放在一个立方体的盒子里面,当然你也可以想象将其它的物体放在里面。
如果我们将盒子放在一个没有重力场的地方,也就是没有其它的场影响球的位置,球会漂浮在盒子的中间。
可以设想这个盒子在外太空中,远离宇宙中的其他任何物体。
如果这样的地方很难找到,我们可以设想一艘宇宙飞船在其轨道环绕着一个行星飞行,飞船里的一切物体都处在一个无重力的环境中。
在上面的图片中,我们为每对面建立一个坐标轴(为了能看见盒子的里面,我们将Y+轴移走)。
假设每一个面都是压力传感器。
如果我们突然向左移动盒子(我们以1g=9.8m/s^2的加速度移动它),球会撞击X-这个面。
然后我们测量球对面施加的压力,就会在X轴输出一个-1g的加速度。
请注意,加速度计实际上测量是一个与加速度向量方向相反的一个力,通常称这个力为惯性力。
由此我们可以认识到,加速度计是通过测量施加在一个面上的力来间接的测量出加速度(在我们的模型中是一个弹性力,在实际中施加给加速度计的可能是其它力)。
这个力是由加速度产生的,但是在接下来的例子中这这个力不是总是由加速度产生。
如果我们将我们的模型放在地球上,球会落在Z-轴上,他会向底面施加一个1g的惯性力,如下图所示:
在这种情况下,盒子并没有移动,但是在Z轴仍然能够读出一个-1g的加速度。
球给底面施加的压力是由于重力所产生的。
理论上这是另外一种力,例如:
如果我们设想这个球是金属的,在盒子外面放置一个磁铁可以移动这个球,所以球能够撞击另外一个面。
所说的这些仅仅是证明加速度计的本质是测量力,而不是加速度。
也就是说由加速度会产生惯性力被加速度计里面的机械装置所测量到。
这个模型不能精确的说明为电子机械系统(MEMS)是怎么被建立的,它通常在解决一些和加速度计有关联的一些问题中很有用。
到此为止我们分析了加速度计在一个轴上的输出,我们可以从一个单轴的加速度计中得到这样的信息。
一个三轴加速度计的输出值可以测量三个轴上的惯性力。
让我们重新回到盒子的模型,将盒子向右旋转45°。
这时球会和Z-、X-这两个轴接触,如下图所示:
0.71这个数字不是任意得到的,它实际上是1/2的平方根的一个近似值。
当我们介绍加速度计的另外一个模型是,这将变得很清晰。
在之前的模型的我们确定了重力旋转盒子。
在最后的两个模型中我们分析了两个不同位置的输出,然而力的向量保持不变。
这虽然有助于我们理解加速度计和外力的相互作用关系,如果将加速度计的各个轴固定在一个坐标系中,这便于实际应用中的计算。
请看上面的模型,我保留各个轴的颜色,这有助于我们联系以前的模型。
只要设想一下在新模型的各个轴是相互垂直的,就像在盒子模型中的各个面一样。
向量R是加速度计所需要测量的力向量(它可以是重力或者惯性力或者是二者的结组合)。
Rx,Ry,Rz是R在X,Y,Z轴上的投影。
请注意下面的关系:
R^2=Rx^2+Ry^2+Rz^2 (Eq.1)
这就是基本的立体几何的勾股定理。
之前我们提过1/2的平方根(0.71)不是一个随机的数字。
如果我们将各项关系待遇上面的公式,重力为1g,可以得到:
只要将
,
,
,
代入(Eq.1)中即可。
经过这些准备之后我们已经离真正的加速度计很近了。
Rx,Ry,Rz的值和实际加速度计的输出值是呈线性关系的,我们可以利用它们进行各种计算。
到这里我们谈一下加速度计是怎么将信息反馈给我们的。
多数加速度计有两种类别:
数字的和模拟的。
数字式加速度计是通过IIC,SPI,或USART等通信协议传送信息的。
模拟式加速度计的输出是在一个范围内的电压值,我们要通过数模转换器将电压信号转换成数字信号。
在这里不再赘述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的参考电压。
我们利用下面的公式来将ADC的转换结果转换成电压:
VoltsRx=AdcRx*Vref/1023
注:
如果是使用8位的ADC模块最后的一个数字是255(2^8-1),如果是12位的ADC最后一位数字则是4095(2^12-1)。
利用该公式我们可以计算出3轴的电压:
VoltsRx=586*3.3V/1023=~1.89V
VoltsRy=630*3.3V/1023=~2.03V
VoltsRz=561*3.3V/1023=~1.81V
每个加速度计都会有一个零重力输出值,我们可以在对应的数据手册中找到。
这个值相当于0g。
为了得到一个有符号的电压值,我们要计算电压的偏移值。
我们使用的0g对应的电压值VzeroG=1.65V,以下是计算偏移电压的过程。
DeltaVoltsRx=1.89V–1.65V=0.24V
DeltaVoltsRy=2.03V–1.65V=0.38V
DeltaVoltsRz=1.81V–1.65V=0.16V
现在我们的加速度计的读数是电压值,而不是加速度,在最后的转换中我们将用到加速度计的灵敏度,通常表示为mV/g,我们所用的加速度计的灵敏度是478.5mV/g=0.4785V/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三个轴与力向量R之间的夹角。
我们定义这些角度分别表示为:
Axr、Ayr、Azr。
我们可以从空间直角坐标系中得出:
cos(Axr)=Rx/R
cos(Ayr)=Ry/R
cos(Azr)=Rz/R
由Eq.1可以得到
,现在我们可以根据arccos()函数来求出角度:
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
这三组公式我们叫做方向余弦,它们表示和向量R方向相同的单位向量(向量的长度为1),我们可以证明:
当我们只需要关注向量的方向的时候而不去计算向量的长度,这个性质很实用。
第二部分:
陀螺仪
我们介绍陀螺仪的时候,不再像介绍加速度计那样用盒子的模型,我们直接使用加速度计的第二个模型,我们可以依据下面这个模型来解释陀螺仪:
每个陀螺仪的通道能够测量围绕这个轴的旋转。
例如一个2轴的陀螺仪,可以测量围绕X轴和Y轴的旋转。
为了更好的表这种旋转我们定一些标识符:
Rx—表示惯性力向量R在XZ平面内的投影
Ry—表示惯性力向量R在YZ平面内的投影
在直角坐标系中利用勾股定理可得:
,
。
同时根据Eq.1的结论可得:
,
。
在文章里我们并不会用到这些公式,但是他们有利于表示模型里面的一些数据关系。
我们谈论Z轴和向量Rxz、Ryz之间的角度关系,做出下列定义:
Axz—表示Rxz(向量R在XZ平面上的投影)和Z轴之间的夹角;
Ayz—表示Ryz(向量R在YZ平面上的投影)和Z轴之间的夹角。
现在我们逐渐清楚陀螺仪是用来测量什么的,陀螺仪是用来测量角度的变化率(角速度),在这里是测量上面我们描述的两个角度的变化率。
为了更好的解释我们假设测量的是Y轴的旋转(Axz这个角度),设在t0时刻角度为Axz0,在t1时刻测得的角度为Axz1,则角度的变化率可以表示为:
RateAxz=(Axz1-Axz0)/(t1-t0)
如果我们将角度的单位选为度,时间的单位选为秒,则这个数值的单位为deg/s这就是陀螺仪所测量的量。
实际上陀螺仪(除非是特别的数字式陀螺仪)很难输出一个以deg/s为单位的数值。
和加速度计一样,得到的是一个ADC转换值,我们要将其转换成以deg/s为单位的数值。
在此介绍将陀螺仪的ADC值转换成以deg/s的数值的公式(我们仍然假设用10位精度的ADC模块,如果利用8位精度的ADC要将1023替换成255,12位精度的ADC将1023替换成4095就可以了)。
RateAxz=(AdcGyroXZ*Vref/1023-VzeroRate)/SensitivityEq.3
RateAyz=(AdcGyroYZ*Vref/1023-VzeroRate)/Sensitivity
AdcGyroXZ,,AdcGyroYZ是经过ADC转换得来的数字,它们分别表示向量R的旋转在XZ,YZ面上的投影,也就是说等价于围绕X轴和Y轴旋转的变化量。
Vref是ADC模块的参考电压,我们任然使用3.3V。
VzeroRate是陀螺仪没有旋转时的输出电压。
假设这个电压是1.23V(这个数值可以在对应陀螺仪的数据手册里面找到,但是我们不要完全的按照手册上的数值,这个值在芯片焊接的过程中会有所改变。
因此我们要里用电压表通过实验测出实际的值)
Sensitivity陀螺仪的灵敏读,用mV/(deg/s)表示,通常我们写成mV/deg/s。
表示每当转速增加1deg/s的时候陀螺仪的输出会增加多少毫伏。
我们设使用的陀螺仪的灵敏度为2mV/deg/s或0.002V/deg/s。
举例:
如果经过ADC转换器陀螺仪传回来的数据为:
AdcGyroXZ=571
AdcGyroYZ=323
则可以通过上面的公式和芯片数据手册上面提供的数据得出计算:
RateAxz=(571*3.3V/1023–1.23V)/(0.002V/deg/s)=~306deg/s
RateAyz=(323*3.3V/1023–1.23V)/(0.002V/deg/s)=~-94deg/s
上面的数据表明,设备绕着Y轴(或者说XZ平面)以306deg/s的速度旋转和设备绕着X轴(或者说YZ)以-94deg/s的速度旋转。
值得注意的是这里的符号表示旋转的方向是和我们规定的正方向是相反的。
一份好的陀螺仪数据手册会给出旋转的正方向。
否则我们则需要通过实验来测的方向,即测出哪一个引脚上的电压在增加。
最好的方法是通过示波器来测量,当旋转停止的时候陀螺仪的输出电压立马会回到零点的电压值。
如果使用万用表的话,读书的变化是滞后的不能实时测量陀螺仪的输出。
将在旋转中测得的电压值与零点的电压值比较,如果测量的值比零点电压值大,则此时的旋转方向为正,否则反之。
第三部分:
加速度计和陀螺仪的结合
要联合惯性测量单元,既融合加速度计和陀螺仪需要统一它们的坐标系。
最简单的方法是选取加速度计的坐标系作为参考坐标系。
大多数加速度计的芯片手册都会标明将X,Y,Z轴与芯片的位置对应。
例如下图所示:
下一步:
(1)确认陀螺仪的输出值和上面讨论的RateAxz,RateAyz一致。
(2)对于加速度计关于陀螺仪的的位置,判断取得的值是否需要取相反数。
不能去假设陀螺仪的X,Y轴,需要参考加速度计的坐标系去确定,最好的方法是通过实验测试。
这里举一个简单的例子确定陀螺仪的哪一路输出是RateAxz:
首先将传感器放在水平的位置。
这时加速度计的X轴和Y轴的输出都是0g时的电压(1.65V);然后围绕Y轴旋转传感器,也就是我转动传感器的XZ面,所以加速度计的X轴和Y轴的输出会改变,而Y轴的输出保持不变。
将传感器以一个恒定的速度旋转,注意陀螺仪的哪路输出发生改变,则陀螺仪的另一路输出恒定。
在传感器围绕Y轴旋转(XZ面旋转)的过程中,陀螺仪的输出在改变,则说明输入的AdcGyroXZ(ADC转换的数值)是来自我们计算出的RateAxz。
最后是确定旋转的方向。
由于陀螺仪的物理位置与加速度计的物理位置摆放的关系,在有些情况下我们需要将测得的RateAyz取相反数。
重复一次上面所描述的测试,将模块围绕Y轴旋转,这是监测加速度计的X轴输出(在我们模型中AdcRx值)。
如果AdcRx增加(从水平位置的第一个90°旋转),这时陀螺仪的输出AdcGyroXZ会减小。
这是犹犹如我们测量的是重力向量,当模块向一个方向旋转的时候,重力向量是朝着相反的方向旋转的(在我们使用的坐标系中)。
否则需要使用一个转换系数RateAxz,如下所示:
RateAxz=InvertAxz*(AdcGyroXZ*Vref/1023–VzeroRate)/Sensitivity
式中的InvertAxz取值为+1或-1。
将模块围绕着X轴旋转,通过同样的测试可以测出RateAyz。
RateAyz=InvertAyz*(AdcGyroYZ*Vref/1023–VzeroRate)/Sensitivity
通过测试,在我们使用的Acc_Gyro模块中有以下结果:
输出引脚GX4输出值为RateAxz;InvertAxz=1。
输出引脚GY4输出值为RateAyz;InvertAyz=1。
到此为止,已经设置好我们的IMU模块了,我们可以计算出正确的Axr,Ayr,Azr(在Part1加速度计中定义的)和RateAxz,RateAyz(在Part2陀螺仪中定义的)。
接下来分析加速度计和陀螺仪输出数值之间的关系,以此能正确的估计模块相对于水平的倾角信息。
或许有人会问,我们已经能够从加速度计中获得角度信息:
Axr,Ayr,Azr。
为什么还需要同时使用陀螺仪的数据。
理由很简单,加速度计输出的信息不是完全正确的。
这是因为加速度计是测量惯性力的,这可以由重力产生的(当然理想情况仅仅由重力产生),但是这也有可能有其它的加速度所产生的。
即使当加速度计处在一个相对稳定的状态,但是它仍然对一些机械振动之类的噪声很敏感。
这正是为什么在大多数IMU系统中使用陀螺仪来修正加速度计的误差的原因。
但是陀螺仪也会有也会受到噪声的干扰,然而它是测量旋转的的。
陀螺仪对于线性的机械运动的敏感度会小很多,但这对加速度计的干扰很大。
但是陀螺仪也会有自身的干扰,比如漂移(当旋转停止时数据不能回到原始值)。
不过通过陀螺仪和加速度计值的互补我们可以正确的估计角度。
这比单独的使用加速度计要精确很多。
下面将介绍一种算法,这是从卡尔曼滤波算法中收到启发的。
但它在嵌入式设备中使用起来更为简单。
先让我们了解一下我们的算法是如何工作的。
R=[Rx,Ry,Rz]这是重力向量,我们可以推导出其它的值比如:
Axr,Ayr,AzrorcosX,cosY,cosZ。
为了避免混淆,我们将加速度计测量的结果做如下定义:
Racc:
这是又加速度计测量出的惯性力,有以下三部分组成(在X,Y,Z轴上的投影)
RxAcc=(AdcRx*Vref/1023–VzeroG)/Sensitivity
RyAcc=(AdcRy*Vref/1023–VzeroG)/Sensitivity
RzAcc=(AdcRz*Vref/1023–VzeroG)/Sensitivity
现在我们获得一组由加速度计经过ADC转换得来的数据,我们这组数据为向量并做一下记法:
Racc=[RxAcc,RyAcc,RzAcc]
由于这组数据是由加速度计获得的,所以可以将其作为我们算法的输入数据。
请注意Racc是测量重力的,我们可以保证向量的长度是1g或做如下等效:
再做如下变化换:
Racc(normalized)=[RxAcc/|Racc|,RyAcc/|Racc|,RzAcc/|Racc|].
这可以确保向量Racc的长度始终都是1。
接下来介绍一个新的向量:
Rest=[RxEst,RyEst,RzEst]
这是算法的输出值,这是基于陀螺仪和上一次估计的值所的到的。
在算法中将会做些什么呢:
(1)加速度计告诉我们:
“当前的Racc值”
(2)我们说:
“好,让我们检验一下”
(3)然后由陀螺仪的值和上一次的Rest值我们可以得到新的修正信息,既输出一个新的向量Rest
下面我们看看它是怎么工作的:
开始我们设定:
Rest(0)=Racc(0),要记住Rest和Racc是向量,所以这个等式可以写成三部分:
RxEst(0)=RxAcc(0)
RyEst(0)=RyAcc(0)
RzEst(0)=RzAcc(0)
然后我们没间隔T秒做一次测量,所以我们可以获得新的测量值,如我们上面提到的Racc
(1),Racc
(2),Racc(3)等。
同时也能在每个时间间隔得到新的估计值Rest
(1),Rest
(2),Rest(3)等。
假设运行到N步的时候,我们有两个有用的值:
Rest(n-1):
我们上一步的估计值
Racc(n):
当前陀螺仪测得的值
之前我们可以计算Rest(n),我们再介绍一个新的测量值,我们可以从陀螺仪的上一个测量结果中获得。
我们称之为Rgyro,这同样是一个向量由三部分组成:
Rgyro=[RxGyro,RyGyro,RzGyro]
我们每次计算向量的一部分,下面从计算RxGyro开始。
在直角坐标系中我们在陀螺仪模型中有以下关系,由Rz和Rxz组成的三角形中:
tan(Axz)=Rx/Rz=>Axz=atan2(Rx,Rz)
或许atan2()是我们以前没有使用过的函数,它和atan()相类似,只是它的返回值的范围是(-PI,PI),而atan()的返回值范围是(-PI/2,PI/2)。
它有两个参数。
这允许我们将Rx,Rz的值转换成在360°范围内的角度值。
知道了RxEst9(n-1),和RzEst(n-1),我们可以得到:
Axz(n-1)=atan2(RxEst(n-1),RzEst(n-1))
要知道陀螺仪是测量角度Axz的变化率,所以我么可以估计新的角度Axz(n):
Axz(n)=Axz(n-1)+RateAxz(n)*T
RateAxz是陀螺仪经过ADC读取的数值,为了得到更精确的值我们可以使用角速度的平均值:
RateAxzAvg=(RateAxz(n)+RateAxz(n-1))/2
Axz(n)=Axz(n-1)+RateAxzAvg*T
通过同样的方法我们可以得到:
Ayz(n)=Ayz(n-1)+RateAyz(n)*T
现在我们有了Axz(n)和Ayz(n),我们从哪里出发扣除RxGyro/RyGyro呢?
由Eq.1可以得到向量Rgyro的长度:
因为我们将Racc向量标准化,我们可以假设它的程度为1并且不随这旋转而改变,因此我们可以这样写:
|Rgyro|=1
我们通过一个简短的符号代替他们,进行以下计算:
x=RxGyro,y=RyGyro,z=RzGyro
由以上关系我们可以得出:
将分子分母同时除以
可以得到:
因为:
,所以:
在根号内部分子分母同时乘以
由
、
,最后可以得到:
所以有:
同理可以得到: