六軸加速度計和三軸陀螺儀所組成的九軸姿態(tài)傳感器是無人機中必備重要器件。本微信號之前已經(jīng)對加速度計和陀螺儀的物理工作原理探討過無數(shù)次了,在這里也不再絮叨了。目前很多開發(fā)板上也會安裝這種傳感器,從而獲得開發(fā)板實時姿態(tài),可用于無人機和體感游戲等應用的開發(fā),本文以Genuino101中RawImuDataSerial的例子進行分析,從代碼角度來和大家探討一下姿態(tài)參數(shù)的獲得。
1.Genuino101中使用的是USB虛擬串口,所以先進行串口初始化,設置波特率。
什么是USB虛擬串口呢,字面上好像很難的樣子,可能很多新手都不知道,但是不用擔心,USB虛擬串口就是把USB當作串口的串口來使用,在Nano,Mega板上都有USB轉TTL的芯片,連接到電腦后,電腦就識別出了端口號。但是101上并未使用USB轉TTL的芯片,101有USB接口,而USB可以作為幾種使用類型,像HID鼠標鍵盤,大容量存儲,攝像頭等,其中有一種類型叫虛擬串口,使用的方法跟普通的串口是一樣的。虛擬串口屬于USB CDC,
也叫VCP。
2.while (!Serial); 這里是判斷串口是否完成,為什么這樣使用呢?看看參考資料。
意思就是判斷USB CDC串口是否已經(jīng)打開了,如果已經(jīng)打開,剛返回true,否則是false
3.開始進行IMU的初始化,這里的IMU包含在Intel Curie模塊里面。輸出
Initializing IMU device...
初始化的函數(shù)是: CurieImu.initialize();
看看里面做了什么
可以看到,首先是SPI的初始化,SPI連接的是型號為BMI160的六軸加速度計和陀螺儀傳感器。具體是如何通過寄存器的讀取加速度值的我們先不去研究,CurieImuClass里面已經(jīng)做好了這些操作,我們只要知道使用,CurieImuClass就能得到六軸的原始數(shù)據(jù)就行了。那為什么要打開看看里面做了什么呢,其實我也就是好奇,想看看。
4.這里字面上的意思是測試CurieImu是否連接成功,我們打開CurieImu.testConnection()看看里面是啥。
其實就是通過SPI讀取BMI160寄存器到的DeviceID,如果讀到了,說明連接成功。
這里是讀取寄存器里偏移量的值。這幾個是已經(jīng)默認在寄存器里了。
5.這里是進行陀螺儀校準,校準函數(shù)是 CurieImu.autoCalibrateGyroOffset();有點奇怪,為什么陀螺儀有三個軸,但是只用了一個校準呢?我們打開這個函數(shù)看一下。
看了一下注釋,這個函數(shù)就是對3個軸進行校準。那就不管它了,具體那幾個寄存器是什么也不用去理會。
6.這里對加速度計進行校準。用了三個校準函數(shù),XY是0,Z的參數(shù)是1,為什么呢。是不是因為Z軸自身就收到重力呢?保留疑問。
7.校準好了之后,再讀取一次偏移量。
8.這里字面上的意思是使能偏移量校準,也就是說,上面只是求出偏移量的值,而這里要進行使能。
9.接下來的便是loop()循環(huán)了。getMotion6()函數(shù)直接讀取六個軸的值到變量。
10.接下來便是打印數(shù)據(jù)到串口了。
11.把程序燒寫的板子上,打開串口,便能看到數(shù)據(jù)啦。
12.這里做一點小改動。把打印到串口的數(shù)據(jù)改成如下:
選擇tools->Serial Plotter
Oh my god,好強大的功能,實時畫六軸波形圖啊。
最后小編向大家提一個問題,你們對于無人機的應用而言,多大的姿態(tài)數(shù)據(jù)刷新率最為合適?
-
usb
+關注
關注
60文章
8190瀏覽量
272916 -
SPI
+關注
關注
17文章
1804瀏覽量
95977 -
代碼
+關注
關注
30文章
4900瀏覽量
70739
原文標題:代碼分析:如何獲得九軸姿態(tài)數(shù)據(jù)?
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網(wǎng)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
評論