最近做的一個國防背景的field UAV項目,細節不能多談,簡單寫點技術體會。
1、PX4/Pixhawk飛控軟件架構簡介
PX4是目前最流行的開源飛控板之一。PX4的軟件系統實際上就是一個firmware,其核心OS為NuttX實時ARM系統。其固件同時附帶了一系列工具集、系統驅動/模塊與外圍軟件接口層,所有這些軟件(包括用戶自定義的飛控軟件)隨OS內核一起,統一編譯為固件形式,然后上傳到飛控板中,從而實現對飛控板的軟件配置。
PX4配套的軟件架構主要分為4層。理解其軟件架構是開發用戶自定義飛控應用軟件的基礎。
a) API層:這個好理解。
b) 框架層:包含了操作基礎飛行控制的默認程序集(節點)
c) 系統庫:包含了所有的系統庫和基本交通控制的函數
d) OS內核:提供硬件驅動程序、網絡、UAVCAN和故障安全系統
上述是個面向PX4系統實現者的相對具體的軟件架構。實際上還有另外一種面向PX4自定義飛控應用開發者的高層軟件架構描述,相對抽象,但更簡單,就是整個PX4的軟件從整體上分為2層:
a) PX4 flight stack:一系列自治無人機自動控制算法的集合
b) PX4 Middleware:一系列針對無人機控制器、傳感器等物理設備的驅動及底層通信、調度等機制的集合
PX4軟件架構中,最有意思的一點在於整個架構的抽象性(多態性)。即,為了最大限度保障飛控算法代碼的重用性,其將飛控邏輯與具體的底層控制器指令實現進行了解耦合。一套高層飛控算法(如autopilot、GeoFence等)在不做顯著修改的情況下,能夠適用於固定翼、直升機、多旋翼等多種機型的控制場合,這時候就體現出PX4飛控的威力來了:在用戶程序寫好之后,如果需要替換無人機機架的話,僅需簡單的修改一下機架配置參數即可,高層的用戶自定義飛控應用幾乎無需修改。
理解上述初衷至關重要。有很多搞自動化出身、沒太多軟件經驗的朋友傾向於直接使用底層控制協議來控制飛控板,但實際上PX4架構已經在更高的抽象層面上提供了更好的選擇,無論是代碼維護成本、開發效率、硬件兼容性都能顯著高於前者。很多支持前者方式的開發者的理由主要在於高層封裝機制效率較低,而飛控板性能不夠,容易給飛控板造成較大的處理負載,但實際從個人感覺上來看,遵循PX4的軟件架構模式反倒更容易實現較高處理性能,不容易產生控制擁塞,提升無人機側系統的並發處理效率。
2、PX4/Pixhawk飛行控制協議與邏輯
Mavlink是目前最常見的無人機飛控協議之一。PX4對Mavlink協議提供了良好的原生支持。該協議既可以用於地面站(GCS)對無人機(UAV)的控制,也可用於UAV對GCS的信息反饋。其飛控場景一般是這樣的:
a) 手工飛控:GCS -> (MavLink) -> UAV
b) 信息采集:GCS <- (Mavlink) <- UAV
c) 自治飛控:User App -> (MavLink) -> UAV
也就是說,如果你想實現地面站控制飛行,那么由你的地面站使用Mavlink協議,通過射頻信道(或 wifi etc.)給無人機發送控制指令就可以了。如果你想實現無人機自主飛行,那么就由你自己寫的應用(運行在無人機系統上)使用Mavlink協議給無人機發送本地的控制指令就可以了。
然而,為實現飛控架構的靈活性,避免對底層實現細節的依賴,在PX4中,並不鼓勵開發者在自定義飛控程序中直接使用Mavlink,而是鼓勵開發者使用一種名為uORB((Micro Object Request Broker,微對象請求代理)的消息機制。其實uORB在概念上等同於posix里面的命名管道(named pipe),它本質上是一種進程間通信機制。由於PX4實際使用的是NuttX實時ARM系統,因此uORB實際上相當於是多個進程(驅動級模塊)打開同一個設備文件,多個進程(驅動級模塊)通過此文件節點進行數據交互和共享。
在uORB機制中,交換的消息被稱之為topic,一個topic僅包含一種message類型(即數據結構)。每個進程(或驅動模塊)均可“訂閱”或“發布”多個topic,一個topic可以存在多個發布者,而且一個訂閱者可也訂閱多個topic。而正因為有了uORB機制的存在,上述飛控場景變成了:
a) 手工飛控:GCS -> (MavLink) -> (uORB topic) -> UAV
b) 信息采集:GCS <- (Mavlink) <- (uORB topic) <- UAV
c) 自治飛控:User App -> (uORB topic) -> (MavLink) -> UAV
有了以上背景基礎,便可以自寫飛控邏輯了,僅需在PX4源碼中,添加一個自定義module,然后使用uORB訂閱相關信息(如傳感器消息等),並發布相關控制信息(如飛行模式控制消息等)即可。具體的uORB API、uORB消息定義可參考PX4文檔與源碼,所有控制命令都在firmware代碼的msg里面,不再敷述。
最后值得一提的是,在PX4系統中,還提供了一個名為mavlink的專用module,源碼在firmware的src/modules/mavlink中,這貨與linux的控制台命令工具集相當相似,其既可以作為ntt控制台下的命令使用,又可作為系統模塊加載后台運行。其所實現的功能包括:1)uORB消息解析,將uORB消息實際翻譯為具體的Mavlink底層指令,或反之。2)通過serial/射頻通信接口獲取或發送Mavlink消息,既考慮到了用戶自寫程序的開發模式,也適用於類似linux的腳本工具鏈開發模式,使用起來很靈活,有興趣的可以看看。