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