PX4是目前最流行的開源飛控板之一。PX4的軟件系統實際上就是一個firmware,其核心OS爲NuttX(http://www.nuttx.org/)實時ARM系統(中文介紹:http://blog.csdn.net/zhumaill/article/details/24197637)。其固件同時附帶了一系列工具集、系統驅動/模塊與外圍軟件接口層,全部這些軟件(包括用戶自定義的飛控軟件)隨OS內核一塊兒,統一編譯爲固件形式,而後上傳到飛控板中,從而實現對飛控板的軟件配置。linux
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的軟件架構模式反倒更容易實現較高處理性能,不容易產生控制擁塞,提高無人機側系統的併發處理效率。
算法
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的腳本工具鏈開發模式,使用起來很靈活,有興趣的能夠看看。安全