飛控與外界無線數據通信
遙控器用于用戶手動操縱指令傳達。除此之外,四旋翼無人機還需要與地面站或其他四旋翼有數據交互,用于狀態監控,集群協同等
一 硬件與協議
無人機與外界通信主流方案包括三種:WiFi,藍牙,2.4G無線數傳。其中WiFi與藍牙也是傳輸信號也在2.4G頻段,一般硬件設備都內置有WiFi,藍牙功能,2.4G收發端都需要額外配置模塊
也有部分數傳模塊可以工作在433MHz、915MHz頻段,相同功率,頻率低衍射性能好,傳輸距離遠;頻率高則帶寬大一點,傳輸速度快
通常開發這三類硬件需要一個2.4G射頻芯片,在上層開發協議棧。這三類方案一些常見產品指標對比如下,其中藍牙5.0比4.0在帶寬和傳輸距離上有提升,數傳模塊產品性能區間較大,可以結合價格和場景需要選用
市面上這三種都是模塊產品如ESP8366 WiFi模塊,3DR 915MHz無線數傳模塊,對外屏蔽協議棧細節。與飛控走串口協議,在PX4中只需要讀寫串口解析應用層MAVLink協議即可
二 MAVLink協議
MAVLink定義了輕量級無人機之間傳輸數據格式,支持多種語言和多種平臺,支持至多255種機型,并且高度可靠與安全。2009年發布MAVLink v1,2017年發布版本MAVLink v2. MAVLink系列無論是數據幀格式還是交互過程,都和socket十分相似,我們下面一起來看一下
1 MAVLink實現
1.1 協議
MAVLink v2相比于v1,頭部標記由8字節升級到14字節,擴展性進一步提高。我們重點關注MAVLink v2,下面為MAVLink v2序列化后的數據幀格式
收發端首先四次握手進行版本協商,然后即建立連接
系統與組件的認證ID標識了發送端可以廣播給網絡中的全部系統或組件,也可以發給指定系統或組件
接收端等待數據幀開始標志位,然后讀取包長度的字節序列,并且做一些校驗工作,再放入緩存做拼接,最后提供給上層應用
有兩個很重要的API用于程序中數據結構和二進制消息相互轉化,對MAVLink協議感興趣的朋友可以閱讀它的實現來了解協議設計細節
反序列化mavlink_parse_char
https://github.com/mavlink/c_library_v2/blob/master/mavlink_helpers.h#L988
序列化mavlink_msg_to_send_buffer
https://github.com/mavlink/c_library_v2/blob/master/mavlink_helpers.h#L445
1.2 消息類型
MAVLink消息定義在XML文件中,形式上可以參考下面的內容
https://github.com/mavlink/mavlink/blob/18955a04c7c7467e00ea42b704addb4a9c12b53a/message_definitions/v1.0/common.xml
MAVLink內置消息可以分為兩類,主協議通用消息和子協議,如果內置消息仍然不能滿足用戶需要,MAVLink也支持用戶自定義消息
a.主協議通用消息
通用消息設計已經足夠滿足大多數應用場景需求
https://mavlink.io/en/messages/common.html
包括飛機機型,飛行模式,飛機傳感器數據,飛行狀態的細節等
b.子協議
子協議通常用于特定場景,比較Domain-Specific。比如心跳協議用于確認組件狀態,計算丟包率;參數協議用于交換組件參數等
有個比較有意思的是解鎖認證協議
https://mavlink.io/en/services/arm_authorization.html
意思是說需要第三方認證如空管部門或一些私人認證機構,才允許解鎖飛行
c.自定義消息
XML完成自定義消息后,可以用官方提供的codegen工具生成對應語言的消息定義源碼。對C語言官方提供了一份已經生成好的消息定義頭文件,并且針對嵌入式系統高度優化。
PX4作為發送端中用到的common消息可以參考
https://github.com/PX4/PX4-Autopilot/tree/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/streams
其中主要是定義了send接口,用于uORB訂閱話題后序列化為二進制并發送到串口
對其他語言的支持可以參考官方開發者手冊
https://mavlink.io/en/
1.3 測試
官方提供了一份測試用例,實現了串口和UDP簡單收發接口
https://github.com/mavlink/c_uart_interface_example
另外也有一份比較完善的基于C++17的軟件開發包,支持包括同步、異步回調更多好用的上層封裝
https://github.com/mavlink/MAVSDK/tree/main
我們留到后面實踐篇再做詳細測評
2 MAVLink在PX4中的使用
對于MAVLink消息上層接口需求,總體可以歸為同步、異步兩類。既需要同步消息統一處理關心的數據,又需要異步接口來支持隨時打印調試信息
2.1通過MAVLink發布異步調試信息
比較常見的是mavlink_log_info
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/lib/systemlib/mavlink_log.h#L82
不過這類接口將會逐漸被Events機制替代,events::send()接口封裝調試信息,實際上是通過uORB發布事件
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/platforms/common/events.cpp#L48
下面訂閱進隊列,再統一發布MAVLink消息,這樣方便和同步消息統一管理
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2545
2.2 通過MAVLink例行發布接收關心的數據
此時飛控設備既是發送端,又是接收端,相應任務由兩個task執行
(1)發送端
在MAVLink模塊發送任務中,完成外設配置,需要輸出消息訂閱發送以及接收消息的反序列化和發布
在主循環中,統一對關注的消息進行訂閱和發布:
結合帶寬調整發送速率
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2320
對udp或串口外設進行配置
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2332
兼容舊MAVLink版本,直接調MAVLink序列化接口發布云臺消息
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2463
檢查通過shell傳進來的消息,通過MAVLink發送
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2486
從MAVLinkShell實現來看,主要是對于父子關系的兩個任務,子任務會繼承得到文件描述符,并通過stdio管道通信,從shell讀入消息并且發送,很顯然,可用于調試
通過uORB訂閱消息,并逐個通過MAVLink發送
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_main.cpp#L2503
(2)接收端
接收端啟動
https://github.com/PX4/PX4-Autopilot/blob/2f448e9d9f3996698dffc5d24e90b405bc55c045/src/modules/mavlink/mavlink_receiver.cpp#LL3276C4-L3276C24
流程上和發送端剛好相反,不過消息反序列化后,都是直接實現的處理函數,也包括一些子協議的處理,如FTP協議、Mission子協議等,然后通過uORB發布
這就是飛機與外部數據交互的軟硬件層面原理以及PX4實現。
源自:SantyNotebook
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















