無人機已經(jīng)擁有自己的內(nèi)部 IMU,但這些 IMU 的精度不足以完成較大的飛行任務。對于短途飛行和娛樂飛行,內(nèi)部 IMU 的精度足以保證無人機按預期運行。A
我們嘗試將 MicroStrain IMU 的支持集成到 Ardupilot 自主飛行軟件套件中。我們這樣做是為了獲得 CSU 的學分,是與 CSU 無人機中心合作開展的一項獨立研究。這個學期的大部分時間都花在了研究和學習上,因為我們使用的大多數(shù)技術(shù)和現(xiàn)有庫對我們來說都是全新的。經(jīng)過大量的學習,我們開始在帶有 MicroStrain 3DM-CX5-GNSS/INS IMU 的 Pixhawk 4 上開發(fā)和測試定制的 Ardupilot。學期結(jié)束時,我們完成了一次試飛,使用我們的定制 Ardupilot 構(gòu)建,在自主模式下成功發(fā)射并飛行了一架固定翼飛機,其中只使用了 MicroStrain IMU 的加速度計、陀螺儀、氣壓計和磁力計數(shù)據(jù),而完全禁用了 Pixhawk 的內(nèi)置 IMU。要將我們對 Ardupilot 的修改應用于生產(chǎn),還有很多工作要做,我們希望將來能繼續(xù)這個項目。
我們項目的目標是創(chuàng)建固件,將高精度慣性測量單元(IMU)成功集成到現(xiàn)有的無人機設置中。無人機已經(jīng)有了自己的內(nèi)部 IMU,但這些 IMU 缺乏完成大型飛行任務所需的精度。對于短途飛行和娛樂飛行,內(nèi)部 IMU 的精度足以保證無人機按預期運行。隨著時間的推移,IMU 讀數(shù)中的微小誤差會逐漸增加,到長途飛行結(jié)束時,總誤差可能會非常大。通過使用高精度 IMU,我們可以通過提高讀數(shù)精度來延長無人機的飛行時間,從而減少微小誤差。我們選擇了 MicroStrain IMU,這是一款專為航天器設計的高精度 IMU。由于它是為需要幾乎精確測量的設備而設計的,因此 IMU 的精度可以讓我們的無人機在更長的時間內(nèi)保持正確的飛行軌跡。
擁有一架可以長時間飛行的無人機對執(zhí)行各種任務非常有用。估價師和林業(yè)人員都可以使用這些無人機對野生動物和火災造成的結(jié)構(gòu)性破壞進行大規(guī)??睖y。目前,全國范圍內(nèi)的郵政和包裹遞送公司都在研究無人機遞送,這就需要無人機有足夠的精確度和飛行時間,以遞送許多包裹。隨著人們探索不同無人機和機器人的更多用途,高精度的選擇甚至可以幫助考古學家和海洋生物學家完成他們的工作,到達人類無法到達的地方。提高現(xiàn)有無人機軟件的精確度為無人機幫助人們和取得新發(fā)現(xiàn)提供了更多可能性,這也是我們開展這個項目的原因。
在這個項目中,我們的團隊可以使用三個 MicroStrain IMU 和兩個 Pixhawk 飛行控制器。三個 IMU 分別是 3DMCX5-45、3DM-CX5-AHRS 和 3DM-GX5-GNSS/INS。兩個 Pixhawk 分別是 Pixhawk 4 和 Pixhawk 1。我們的目標是通過 UART 電纜將 Pixhawk 4 與 3DM-CX5-45 連接起來,使用 Pixhawk 上的 UART / I2C B 端口,該端口傳統(tǒng)上用于連接外部 GPS 設備。我們能夠在所有三個 IMU 上測試數(shù)據(jù)包配置,并使用 SITL 運行我們的自定義 Ardupilot 構(gòu)建,但我們只能使用一個 Pixhawk 4 和一個 3DM-CX5-45 作為在完整硬件上測試構(gòu)建的唯一方法。在整個學期中,我們多次嘗試使用 Arduino Uno R3 和 Raspberry Pi Pico 設置額外的硬件配置,但這些嘗試大多導致了更多的復雜問題。事實證明,使用 SITL 進行開發(fā)并在 Pixhawk 4 上進行測試是最有效的策略。
我們嘗試的第一種方法是使用 MicroStrain 通信庫 (MSCL)。由于創(chuàng)建 MSCL 是為了簡化與 MicroStrain IMU 的交互,因此 MSCL 似乎是讓 MicroStrain 以我們想要的方式進行通信的一個很有前途的解決方案。在研究 MSCL 的過程中,我們發(fā)現(xiàn) MSCL 需要許多其他庫作為依賴庫,而獲取這些依賴庫將使構(gòu)建的結(jié)果超過 Pixhawk 4 內(nèi)存的總?cè)萘?。由于?nèi)存是個問題,我們無法使用 MSCL;不過,我們能夠了解 MSCL 中每個數(shù)據(jù)包的校驗和是如何計算的,我們在創(chuàng)建自己的固件時使用了這些信息。
用于設置和測試 MicroStrain IMU 的圖形用戶界面工具對我們的研究和開發(fā)也很有幫助。它們使我們能夠在學期初獲得二進制 (BIN) 文件。使用 BIN 文件,我們可以開始處理數(shù)據(jù)包并解析出我們需要的數(shù)據(jù),即使我們的所有團隊成員都無法訪問物理 IMU。圖形用戶界面還能讓我們輕松檢查我們解析的數(shù)據(jù)是否正確。它提供了一個易于使用的平臺,使我們能夠快速配置 IMU,以一定的速率傳輸數(shù)據(jù),而無需通過 uart 端口發(fā)送數(shù)據(jù)包。我們還利用它進行調(diào)試,檢查是否在 Ardupilot 中獲得了與 IMU 相同的值。
剛開始使用 Ardupilot 時,我們發(fā)現(xiàn)學習代碼庫以便進行擴展是一項艱巨的任務。我們花了幾周時間研究文檔,試圖了解現(xiàn)有的傳感器庫是如何為軟件的其他部分提供數(shù)據(jù)的。最初,我們發(fā)現(xiàn) InertialSensor 庫提供了從大多數(shù)飛行控制器的內(nèi)部 IMU 讀取數(shù)據(jù)的代碼,并認為這將是一個很好的方法。我們記錄并追蹤代碼,以確定 Pixhawk 4 的內(nèi)部 IMU 如何向其他庫提供數(shù)據(jù)。我們發(fā)現(xiàn),傳感器庫被分成兩個部分,一個是每個傳感器模型的特定后臺類,用于直接與硬件通信;另一個是通用后臺類,用于接收來自后臺的數(shù)據(jù)并將其提供給軟件的其他部分。我們集成 MicroStrain IMU 的首次嘗試包括編寫一個新的后端類,擴展 AP_InertialSensor_Backend 類。當我們朝著這個方向前進時,我們開始意識到這種方法更適合集成內(nèi)部傳感器,而不是通過 UART 連接的 IMU。
在進一步探索代碼庫時,我們發(fā)現(xiàn) Ardupilot 中新增了 AP_ExternalAHRS 類。編寫該類的目的是為了支持 VectorNav VN-300 IMU 的集成,該傳感器的用途與我們的 MicroStrain IMU 非常相似。我們意識到,利用該類將使我們的工作變得更加輕松。
為了了解串行設備如何與計算機協(xié)同工作,我們首先用 python 編寫了一個簡單的腳本,向 IMU 發(fā)送 ping 并從 IMU 接收信息。腳本運行后,我們開始將腳本翻譯成 C++,以便與同樣使用 C++ 的 Ardupilot 庫配合使用。兩種語言之間的轉(zhuǎn)換有些棘手。第一個 C++ 腳本是使用以 pyserial 為模型的庫開發(fā)的,但它有太多的依賴關系,無法與 Ardupilot 庫兼容。隨后,C++ 腳本被改寫成一個測試草圖,使用 Ardupilot 庫中的串行通信資源,一旦該腳本可以正常工作,就進一步開發(fā)該腳本以讀取和解析數(shù)據(jù)包。
如前所述,在項目過程中,我們只能使用一對正常工作的 IMU 和 Pixhawk。這意味著大部分開發(fā)和測試都是在 Ardupilot SITL(環(huán)路軟件)模擬器上完成的。當我們學會使用 SITL 時,我們發(fā)現(xiàn)它實際上提供了許多好處。使用 SITL 運行代碼可以更方便地進行斷點調(diào)試,而且 SITL 的代碼構(gòu)建速度比硬件快得多。我們在 SITL 開發(fā)過程中遇到的一個難題是連接 IMU。最終,我們找到了將其插入 USB 端口并將 USB 端口映射到 Ardupilot 串行管理器中的設備的方法,使我們能夠通過 SITL 有效地測試與 IMU 的通信。
雖然 SITL 的調(diào)試相當簡單,但當我們在 Pixhawk 和 IMU 上運行新代碼并遇到問題時,故障排除就比較困難了。起初,許多調(diào)試都是通過在代碼周圍放置打印語句來確定故障所在。這種策略有明顯的缺點,即效率低下,而且會造成更多混亂。為了進行硬件斷點調(diào)試,我們購買了一臺 Segger J-Link EDU Mini。我們將 JLink GDB 服務器與內(nèi)置的 Ardupilot GDB 調(diào)試命令結(jié)合使用。這種設置使我們能夠更精確地分析代碼在硬件上運行時的情況。
通過測試草圖實現(xiàn)與 IMU 的通信后,下一步就是收集和解析 IMU 的信息。
雖然我們知道 IMU 工作時的數(shù)據(jù)包大小和速率,但以指定速率讀取數(shù)據(jù)包的字節(jié)數(shù)并不是一種 有效的數(shù)據(jù)包收集方法。我們需要知道數(shù)據(jù)包開始和結(jié)束的時間,處理數(shù)據(jù)包損壞的可能性,并處理數(shù)據(jù)包之間的垃圾字節(jié)。我們想出的解決方案是建立一個單獨的線程,以 MicroStrain 向我們提供數(shù)據(jù)的速度,將字節(jié)讀入一個足夠大的環(huán)形緩沖區(qū)。該線程運行一個循環(huán),執(zhí)行三項操作:將字節(jié)讀入緩沖區(qū),將可用字節(jié)解析為數(shù)據(jù)包,當構(gòu)建了一個完整的數(shù)據(jù)包后,解析該數(shù)據(jù)包中的傳感器數(shù)據(jù)并將其發(fā)送出去。MIP 協(xié)議包括兩個同步字節(jié),告訴我們數(shù)據(jù)包的開始位置,以及一個弗萊徹校驗和,允許我們驗證字節(jié)的正確性。環(huán)形緩沖區(qū)允許我們在構(gòu)建數(shù)據(jù)包時保留字節(jié),并在同步字節(jié)后重新開始,以防校驗和不匹配。
在研究了 MicroStrain IMU 使用的 MIP 協(xié)議并閱讀了 IMU 手冊以了解數(shù)據(jù)包結(jié)構(gòu)之后,我們查看了從 IMU 收集到的數(shù)據(jù)包,并開始對其進行解析。我們將數(shù)據(jù)包頭和校驗和分離到各自的變量中,然后將數(shù)據(jù)包有效載荷發(fā)送到另一個可以解析數(shù)據(jù)包的函數(shù)中。通過查看 Ardupilot 的 AP_ExternalAHRS 庫,我們確定了需要解析的數(shù)據(jù)。起初,使用該庫非常復雜,因為它主要是為 VectorNav 傳感器構(gòu)建的,但我們發(fā)現(xiàn) Ardupilot 的一位首席開發(fā)人員正在創(chuàng)建可分割前端和后端固件的代碼。這種拆分使我們能夠使用現(xiàn)有的后端為 MicroStrain 傳感器進行開發(fā)。我們以現(xiàn)有實現(xiàn)為指導,從 MicroStrain 數(shù)據(jù)集中解析信息,并將數(shù)據(jù)發(fā)送到相應的處理程序。由于我們首先在測試草圖中編寫了數(shù)據(jù)包解析程序,因此無論有無硬件,都能輕松進行測試和調(diào)試,但在將代碼移入 AP_ExternalAHRS 庫時,我們必須進行修改。
當我們最初將代碼從測試草圖中移出時,我們的目標是以任何能讓代碼工作的方式將其移入庫中。我們從測試草圖中復制和粘貼了大量代碼,并對其進行了處理,直到它可以構(gòu)建和運行為止。這項工作導致了一些混亂的實現(xiàn)和一些艱苦的編碼,以使構(gòu)建能夠正確運行。運行成功后,我們又回頭清理了實現(xiàn)過程,制作了與我們正在做的事情相關的函數(shù),整理了代碼以提高可讀性,并研究了我們在飛行前無人機檢查中需要使用的不同標志和字段。在數(shù)據(jù)包解析方面,我們實現(xiàn)了一個帶有開關語句的函數(shù),該函數(shù)可以檢查我們需要的數(shù)據(jù)集中的數(shù)據(jù)包,并將它們發(fā)送到不同的函數(shù)中進行更多解析。這些單獨的函數(shù)確定所給數(shù)據(jù)的類型,并將數(shù)據(jù)存儲在相應的變量中。這些變量隨后會被傳遞給不同函數(shù)中的相應處理程序。通過以這種方式構(gòu)建代碼,我們可以在開關語句中引入更多新變量,并構(gòu)建任何必要的函數(shù)來解析和處理更多數(shù)據(jù),這使得我們可以繼續(xù)進一步集成 IMU,與開始集成時相比相對容易。
經(jīng)過大量的研究、測試和開發(fā),我們成功地將定制的 Ardupilot 部署到固定翼平臺上,并使用僅來自 MicroStrain IMU 的加速度計、指南針、氣壓計和陀螺儀數(shù)據(jù)進行飛行。為了達到這一點,我們必須解決許多棘手的問題,其中最主要的是在 Ardupilot 中與 MicroStrain IMU 通信的問題,以及將傳感器數(shù)據(jù)傳送到固件中正確位置以便其他 Ardupilot 庫能夠訪問和利用這些數(shù)據(jù)的問題。此外,我們還在 ExternalAHRS_MicroStrain 類中創(chuàng)建了一個結(jié)構(gòu),使我們能夠在未來實現(xiàn) GNSS 數(shù)據(jù)。我們的首次試飛在自主模式下出現(xiàn)了嚴重的振蕩。不過,飛機能夠穩(wěn)定下來,在航點之間飛行,甚至能夠利用 MicroStrain IMU 的數(shù)據(jù)自主起飛。
我們未來工作的主要目標是將 MicroStrain IMU 支持合并到 Ardupilot 庫中。這將涉及重寫我們現(xiàn)有的代碼,使其更加簡潔并為生產(chǎn)做好準備,以更加優(yōu)雅的方式實現(xiàn)當前硬編碼的一些功能,并為我們的代碼及其使用方法創(chuàng)建詳盡的文檔。除了這些后勤工作,我們還需要添加對 MicroStrain 數(shù)據(jù)的全面支持。這項工作包括將我們目前讀取的原始數(shù)據(jù)轉(zhuǎn)換為過濾數(shù)據(jù),以及添加對 GPS 的支持。此外,我們還需要添加代碼,以便在初始化過程中發(fā)送數(shù)據(jù)包,確保 IMU 每次都配置正確。我們還將在 Ardupilot 中添加 MicroStrain 參數(shù),并提供詳細的文檔說明如何構(gòu)建支持 MicroStrain IMU 的 Ardupilot。雖然還有很多工作要做,但我們已經(jīng)克服了最大的障礙,因此完成我們的主要目標是可行且有希望的。
? G-Link-200-8G 無線三軸加速度傳感器
? 3DM-CX5-IMU 高性能工業(yè)級慣性測量單元
? 3DM-CV7-AHRS 戰(zhàn)術(shù)級 OEM IMU/AHRS
? 3DM-CX5-AR 高性能傾斜/垂直參考傳感器
備注:本文轉(zhuǎn)載自 MicroStrain 官網(wǎng)。