六軸加速度計和三軸陀螺儀所組成的九軸姿態傳感器是無人機中必備重要器件。本微信號之前已經對加速度計和陀螺儀的物理工作原理探討過無數次了,在這里也不再絮叨了。目前很多開發板上也會安裝這種傳感器,從而獲得開發板實時姿態,可用于無人機和體感游戲等應用的開發,本文以Genuino101中RawImuDataSerial的例子進行分析,從代碼角度來和大家探討一下姿態參數的獲得。
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串口是否已經打開了,如果已經打開,剛返回true,否則是false
3.開始進行IMU的初始化,這里的IMU包含在Intel Curie模塊里面。輸出
Initializing IMU device...
初始化的函數是: CurieImu.initialize();
看看里面做了什么
可以看到,首先是SPI的初始化,SPI連接的是型號為BMI160的六軸加速度計和陀螺儀傳感器。具體是如何通過寄存器的讀取加速度值的我們先不去研究,CurieImuClass里面已經做好了這些操作,我們只要知道使用,CurieImuClass就能得到六軸的原始數據就行了。那為什么要打開看看里面做了什么呢,其實我也就是好奇,想看看。
4.這里字面上的意思是測試CurieImu是否連接成功,我們打開CurieImu.testConnection()看看里面是啥。
其實就是通過SPI讀取BMI160寄存器到的DeviceID,如果讀到了,說明連接成功。
這里是讀取寄存器里偏移量的值。這幾個是已經默認在寄存器里了。
5.這里是進行陀螺儀校準,校準函數是 CurieImu.autoCalibrateGyroOffset();有點奇怪,為什么陀螺儀有三個軸,但是只用了一個校準呢?我們打開這個函數看一下。
看了一下注釋,這個函數就是對3個軸進行校準。那就不管它了,具體那幾個寄存器是什么也不用去理會。
6.這里對加速度計進行校準。用了三個校準函數,XY是0,Z的參數是1,為什么呢。是不是因為Z軸自身就收到重力呢?保留疑問。
7.校準好了之后,再讀取一次偏移量。
8.這里字面上的意思是使能偏移量校準,也就是說,上面只是求出偏移量的值,而這里要進行使能。
9.接下來的便是loop()循環了。getMotion6()函數直接讀取六個軸的值到變量。
10.接下來便是打印數據到串口了。
11.把程序燒寫的板子上,打開串口,便能看到數據啦。
12.這里做一點小改動。把打印到串口的數據改成如下:
選擇tools->Serial Plotter
Oh my god,好強大的功能,實時畫六軸波形圖啊。
最后小編向大家提一個問題,你們對于無人機的應用而言,多大的姿態數據刷新率最為合適?
-
usb
+關注
關注
60文章
7945瀏覽量
264690 -
SPI
+關注
關注
17文章
1706瀏覽量
91591 -
代碼
+關注
關注
30文章
4788瀏覽量
68617
原文標題:代碼分析:如何獲得九軸姿態數據?
文章出處:【微信號:weixin21ic,微信公眾號:21ic電子網】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論