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