摘 要: 在Linux下通過(guò)串口編程對(duì)MEMS IMU數(shù)據(jù)采集和解算,實(shí)現(xiàn)了其高速實(shí)時(shí)采集,。其中,,設(shè)計(jì)的IIR低通濾波器有效消除了信號(hào)中的噪聲成分,并通過(guò)Qt編程設(shè)計(jì)了應(yīng)用程序窗口將MEMS IMU的輸出數(shù)據(jù)動(dòng)態(tài)顯示在ARM開(kāi)發(fā)板上,。該設(shè)計(jì)在小體積,、低功耗、低成本的慣性測(cè)量中具有重要的工程應(yīng)用意義,,可廣泛應(yīng)用于動(dòng)態(tài)測(cè)量,、動(dòng)態(tài)控制、輔助導(dǎo)航等領(lǐng)域,。
關(guān)鍵詞: ARM-Linux,;MEMS IMU;慣性測(cè)量,;數(shù)據(jù)采集,;IIR濾波器
微機(jī)械慣性器件是集微型精密機(jī)械、微電子學(xué),、半導(dǎo)體集成電路等新技術(shù)于一身的世界前沿新技術(shù),。隨著微電子技術(shù)的發(fā)展,目前微機(jī)械慣性器件憑借其價(jià)格低,、可靠性高,、尺寸小、重量輕等特點(diǎn)引起了國(guó)內(nèi)慣性技術(shù)及微電子技術(shù)領(lǐng)域的廣泛關(guān)注,。以陀螺儀和加速度計(jì)為核心部件的慣性導(dǎo)航系統(tǒng)已成為現(xiàn)代飛機(jī),、大型艦只和潛艇的一種重要導(dǎo)航設(shè)備,在其他一些民用領(lǐng)域中也有著十分廣泛和重要的應(yīng)用,。以慣性系統(tǒng)為基礎(chǔ)發(fā)展起來(lái)的慣性測(cè)量和慣性定位系統(tǒng),,可以用于大地測(cè)量、地圖繪制,、海洋調(diào)查,、地球物理勘探、管道鋪設(shè)選線,、石油鉆井定位和機(jī)器人等需要大范圍測(cè)量及精確定位的場(chǎng)合[1],。
本文在嵌入式Linux環(huán)境下使用ARM9開(kāi)發(fā)板實(shí)現(xiàn)了對(duì)IMU輸出數(shù)據(jù)的采集和動(dòng)態(tài)顯示,為進(jìn)一步的工程應(yīng)用打下基礎(chǔ),。
1 微慣性測(cè)量單元IMU
微慣性測(cè)量單元由6個(gè)傳感器組成,,包括3個(gè)微機(jī)械陀螺儀和3個(gè)微機(jī)械加速度計(jì),,配置在立方體的3個(gè)正交平面上。其基本原理為古典的牛頓力學(xué)原理,,由三根軸的陀螺確定載體的姿態(tài),,安裝在三根軸上的加速度計(jì)測(cè)出載體的加速度值,積分得到速度,,再積分得到位移[1,,2]。
本文所采用的慣性測(cè)量單元為XW-IMU5200,。它以DSP為核心處理器,,采用16 bit高精度多通道并行A/D轉(zhuǎn)換。其A/D轉(zhuǎn)換器的采樣率至少是慣性傳感器帶寬的4倍,,能夠保持慣性傳感器的固有頻率,。6路并行采集通道可實(shí)時(shí)接收加速度計(jì)和陀螺儀以及溫度傳感器的信號(hào),保證了數(shù)據(jù)采集的一致性,。圖1所示為本文所采用的XW-IMU5200的外觀,。
XW-IMU5200內(nèi)部有一個(gè)0.8 μs的計(jì)時(shí)器。計(jì)時(shí)器計(jì)數(shù)從0~216,,然后開(kāi)始新的周期(高位溢出后繼續(xù)),。每個(gè)數(shù)據(jù)周期中,在讀取內(nèi)部計(jì)時(shí)器之前和之后,,分別對(duì)兩組慣性測(cè)量數(shù)據(jù)進(jìn)行采樣,,然后將得到的數(shù)據(jù)做數(shù)字濾波并封裝;慣性測(cè)量數(shù)據(jù),、計(jì)時(shí)器數(shù)據(jù),、溫度數(shù)據(jù)通過(guò)XW-IMU5200的RS232口送出。
如圖2所示,,Ti是周期的起點(diǎn),。從Ti到Ti1為0.1 ms,實(shí)現(xiàn)第一組數(shù)據(jù)的采樣,;從Ti1到Ti2為1 ms,,讀取內(nèi)部計(jì)時(shí)器;從Ti2到Ti3為0.1 ms ,,實(shí)現(xiàn)第二組數(shù)據(jù)的采樣,;從Ti3到Ti4進(jìn)行濾波并封裝數(shù)據(jù),對(duì)IMU為1.8 ms,, 對(duì)IMU而言,,最大數(shù)據(jù)輸出速率約為100 Hz,波特率為115 200 b/s,。
XW-IMU5200的測(cè)量數(shù)據(jù)包為19 bit,,其定義如表1所示,數(shù)據(jù)為L(zhǎng)ittle Endian格式,,即低位(LSB)字節(jié)在先,。
2 Arm-linux環(huán)境下的MEMS IMU數(shù)據(jù)采集實(shí)現(xiàn)
2.1 交叉編譯環(huán)境的建立
本設(shè)計(jì)所采用的ARM9開(kāi)發(fā)板為S3C2440處理器,內(nèi)嵌Linux系統(tǒng),。
因嵌入式開(kāi)發(fā)一般需要在PC機(jī)上進(jìn)行,,需要在宿主機(jī)建立交叉編譯環(huán)境,以下給出建立交叉編譯環(huán)境的步驟:
(1)安裝linux環(huán)境,;
(2)下載交叉編譯文件包 cross-2.95.3.tar.bz2,;
(3)建立交叉編譯環(huán)境目錄 /usr/local/arm/;
(4)復(fù)制安裝包到目錄下,,在此目錄下解包文件,,命令為:tar jxvf cross-2.95.3.tar.bz2;
(5)配置環(huán)境變量,,修改bashrc文件,,在文件最后一行添加環(huán)境變量,代碼為export,。
PATH=/usr/local/arm/2.95.3/bin: $PATH,,保存退出后重啟Linux。
至此,,交叉編譯環(huán)境建立完成,。
2.2 串口通信的實(shí)現(xiàn)
本設(shè)計(jì)所采用的微慣性單元數(shù)據(jù)通過(guò)RS232串口輸出,同時(shí)所使用的ARM開(kāi)發(fā)板上也附有串口,,因此完成數(shù)據(jù)采集必須通過(guò)串口通信,。
串口通信是儀器儀表設(shè)備通用的通信方式,它用于ASCII碼的字符傳輸,,主要由地線,、發(fā)送和接收數(shù)據(jù)線3根數(shù)據(jù)線完成,其他線用于握手,。
串口通信的最重要的參數(shù)配置是:波特率,、數(shù)據(jù)位和奇偶校驗(yàn)位,在進(jìn)行串口通信時(shí),,必須正確設(shè)置參數(shù),。Linux中所有的設(shè)備一般位于/dev下,串口1和2的名稱分別為/dev/ttyS0和/dev/ttyS1.通過(guò)對(duì)struct termios結(jié)構(gòu)體的各成員值的設(shè)置來(lái)進(jìn)行串口設(shè)置,,如下:
#include<termios.h>
Struct termio
{
unsigned short c_iflag; /*輸出控制模式標(biāo)志*/
unsigned short c_oflag; /*輸出模式標(biāo)志*/
unsigned short c_cflag; /*控制模式標(biāo)志*/
unsigned short c_lflag; /*本地模式標(biāo)志*/
unsigned char c_line; /*行標(biāo)志*/
unsigned char c_cc[NCC; /*控制字符*/
},;
其中,c_cflag包含對(duì)數(shù)據(jù)傳輸率、字符大小,、數(shù)據(jù)位,、停止位、奇偶校驗(yàn)位和硬件流控的設(shè)置,。
串口配置主函數(shù)如下:
int main(void)
{
int fd;
int nread,i;
char buff[512]="0";
if((fd=open_port(fd,1))<0)
{
perror("open_port error");
return;
}
if((i=set_opt(fd,38400,8,'N',1))<0)
{
perror("set_opt error");
return;
}
printf("fd=%d\n",fd);
while(1)
{
while((nread = read(fd,buff,sizeof(buff)))>0)
{
if(buff[i]==0xaa&&buff[i+1]==0x18),;
printf("header found\n ");
}
}
close(fd);
return;
}
串口波特率為9 600 b/s,數(shù)據(jù)位為8 bit,,無(wú)奇偶校驗(yàn)位,,1 bit停止位。對(duì)于串口的操作同讀寫(xiě)文件,,使用read,、write函數(shù)。如上串口調(diào)通后,,根據(jù)產(chǎn)品的解碼進(jìn)行數(shù)據(jù)的解算,,其算法可表示為:
IMU_meas.gyro[i]=IMU_data.gyro[i]*G_S/SCALAR;
//陀螺儀輸出數(shù)據(jù)解算,i取值1、2,、3分別代表正交方向三路陀螺儀
IMU_meas.acc[i]=IMU_data.acc[i]*A_S/SCALAR; //加速度計(jì)輸出數(shù)據(jù)解算,,i取值1、2,、3,,分別代表三路加速度計(jì)
本文忽略溫度信息只考慮6路傳感器信息,其中G_S為陀螺儀的角度范圍,,A_S為加速度計(jì)測(cè)量范圍,,scalar為常值215。
2.3 數(shù)字低通濾波
低通濾波屬于經(jīng)典濾波的范疇,,它通過(guò)一定的運(yùn)算關(guān)系改變輸入信號(hào)頻率成分的相對(duì)比例或?yàn)V除某些頻率成分,,對(duì)MEMS IMU進(jìn)行濾波的目的就是盡量濾除信號(hào)中的各種噪聲成分,因?yàn)镸EMS IMU輸出信號(hào)的有用成分基本位于低頻段,,加之實(shí)時(shí)性能的要求,,這里只選擇相比FIR濾波器階次低得多的IIR濾波器[3]。
隨機(jī)采集一組數(shù)據(jù)進(jìn)行濾波說(shuō)明,,如圖3為轉(zhuǎn)臺(tái)靜止?fàn)顟B(tài)下y軸MEMS陀螺儀輸出的5 000點(diǎn)數(shù)據(jù),,采樣頻率為100 Hz。
為了確定濾波器的通帶截止頻率,,對(duì)這組數(shù)據(jù)進(jìn)行Yule Walker功率譜密度分析[5],,為了獲得較高的精度,此處取AR模型的階數(shù)為30,,功率譜密度分析結(jié)果如圖4所示,。
從圖4中可以看出陀螺儀輸出信號(hào)中存在兩個(gè)明顯的尖峰,,分別位于14.6 Hz和28.5 Hz處,所以通帶的截止頻率必須小于14.6 Hz,。這兩個(gè)尖峰是指陀螺儀輸出數(shù)據(jù)隨機(jī)誤差的正弦成分,,由圖中可知它們對(duì)陀螺儀輸出數(shù)據(jù)的零點(diǎn)漂移起主導(dǎo)作用??紤]到過(guò)渡帶寬的因素,,截止頻率的設(shè)置最大也應(yīng)為7 Hz左右。但這一濾波器的任務(wù)除了要濾除正弦成分外,,也應(yīng)該濾除大部分的近似白噪聲統(tǒng)計(jì)特性的噪聲成分,并且在沒(méi)有噪聲情況下陀螺儀的輸出數(shù)據(jù)應(yīng)為常數(shù),,所以截止頻率設(shè)得越低越好,。
設(shè)計(jì)IIR數(shù)字低通濾波器必須確定的另一個(gè)重要參數(shù)是濾波器的階數(shù)。階數(shù)低時(shí),,濾波時(shí)延較小,,但過(guò)渡帶寬過(guò)大,濾波效果不明顯,,階數(shù)高時(shí),,過(guò)渡帶寬較小,但濾波時(shí)延較大,。為了既能獲得較好的濾波效果,,又能夠最大限度地滿足實(shí)時(shí)應(yīng)用,在選擇濾波器的階數(shù)時(shí)需要做折中考慮,?;谝陨戏治觯x擇具有單調(diào)下降幅頻特性的巴特沃斯濾波器,。
采用巴特沃斯直接型結(jié)構(gòu),,系統(tǒng)函數(shù)為:
通過(guò)分析比較,當(dāng)通帶截止頻率設(shè)為4 Hz左右,、濾波器階數(shù)設(shè)為4時(shí),,能得到理想的綜合濾波效果。圖5所示為濾波后的數(shù)據(jù),。
對(duì)濾波后的數(shù)據(jù)進(jìn)行Yule Walker功率譜密度分析,,結(jié)果如圖6所示。
比較圖4和圖6可以看出,,濾波后的功率譜密度原來(lái)的兩個(gè)尖峰完全消失了,,除0 Hz附近整體變得十分平坦。這正是期望的濾波效果,,說(shuō)明設(shè)計(jì)的濾波器達(dá)到了預(yù)期的濾波目的,。計(jì)算濾波前后的均值與方差,,結(jié)果如表2所示。
可以看出,,濾波后的均值與濾波前的均值相比在誤差允許的范圍內(nèi)可以認(rèn)為是相等的,,濾波后的方差比濾波前的方差小兩個(gè)數(shù)量級(jí)。這說(shuō)明合理地選擇巴特沃斯數(shù)字低通濾波器的截止頻率和階數(shù),, MEMS陀螺儀輸出
的數(shù)據(jù)可產(chǎn)生較好的濾波效果,。通過(guò)計(jì)算得出低通濾波器的權(quán)系數(shù)ak和br,便可根據(jù)差分方程編制C語(yǔ)言程序,。
2.4 輸出數(shù)據(jù)基于Qt的界面顯示
Qt是一個(gè)跨平臺(tái)的C++圖形界面庫(kù),,主要通過(guò)匯集C++類的形式來(lái)實(shí)現(xiàn)應(yīng)用程序界面開(kāi)發(fā)所需要的一切,包括Qt/X11,、Qt Embedded,、Qtdesigner和Qt linguist等[4]。Qt是基于面向?qū)ο蟮腃++語(yǔ)言,,它提供了signal(信號(hào))和slot(槽)的對(duì)象通信機(jī)制,,具有可查詢和設(shè)計(jì)的屬性以及強(qiáng)大的事件和事件過(guò)濾器。本文主要用到其面向嵌入式開(kāi)發(fā)的Qt Embedded及其設(shè)計(jì)器Qtdesigner,。
Qt界面開(kāi)發(fā)通常有以下步驟:
(1)用Qt生成file.ui和main.cpp,;
(2)用uic生成file.h和file.cpp;
(3)用qmake生成file.pro,;
(4)通過(guò)./setenv命令設(shè)置環(huán)境變量,;
(5)用tmake生成二進(jìn)制代碼。
主函數(shù)部分如下:
int main( int argc, char ** argv)
{
QApplication a(argc, argv);
IMU_display w;
QTimer *t = new QTimer(&w );
a.connect(t,SIGNAL(timeout()),&w,SLOT(imu()));
t->start( 10, FALSE);
w.show();
a.connect(&a,SIGNAL(lastWindowClosed()),&a, SLOT(quit()) );
return a.exec();
}
IMU數(shù)據(jù)輸出速率為100 Hz,,將Qtimer定時(shí)器設(shè)置為10 ms刷新一次,,保證數(shù)據(jù)輸出的完整性。IMU數(shù)據(jù)的具體輸出可以進(jìn)行定制,。在上位機(jī)開(kāi)發(fā)完系統(tǒng)之后,,可以利用虛擬幀緩存技術(shù)(qvfb)技術(shù)在PC機(jī)上測(cè)試Qt/Embedded 程序。經(jīng)過(guò)反復(fù)的測(cè)試修改,,測(cè)試成功之后制作圖標(biāo)和桌面啟動(dòng)器,,通過(guò)minicom拷貝到ARM-Linux系統(tǒng)下的指定目錄,便完成了程序的開(kāi)發(fā)工作,,需要注意的是交叉編譯前需要將程序中上位機(jī)的串口名改為ARM開(kāi)發(fā)板的指定串口名,,否則程序?qū)⒉粫?huì)正常運(yùn)行。
本文實(shí)現(xiàn)了ARM-Linux環(huán)境下對(duì)于MEMS IMU的數(shù)據(jù)采集處理,,功耗低,、成本低、體積小,,可廣泛應(yīng)用到各種慣性測(cè)量領(lǐng)域,。文中所述IIR數(shù)字低通濾波器,,設(shè)計(jì)簡(jiǎn)單,適合運(yùn)用于有用信號(hào)和噪聲的頻帶不重疊的非高速變化運(yùn)動(dòng)的場(chǎng)合,。其不足之處在于雖然可以取得較為理想的濾波效果,,但同時(shí)產(chǎn)生了一定的延遲,所以不適合對(duì)于實(shí)時(shí)性要求很高的慣性測(cè)量場(chǎng)合,,但可以通過(guò)改進(jìn)濾波算法來(lái)實(shí)現(xiàn),。
參考文獻(xiàn)
[1] 劉俊,石云波,李杰.微慣性技術(shù)[M].北京:電子工業(yè)出版社,2005.
[2] 牛徐明,王田苗,梁建宏.基于ARM與MEMS器件的微慣性測(cè)量裝置設(shè)計(jì)[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2007,,7(3):62-64.
[3] 丁楊斌,王新龍,王縝,等.數(shù)字濾波在光纖陀螺數(shù)據(jù)處理中應(yīng)用研究[J].傳感器世界,,2005,11(11):13-16.
[4] 倪繼利.Qt及Linux操作系統(tǒng)窗口設(shè)計(jì)[M].北京:電子工業(yè)出版社,,2006.
[5] 張賢達(dá).現(xiàn)代信號(hào)處理(第二版)[M]..北京:清華大學(xué)出版社,,2002.