飛控與外界無線數據通信

遙控器用于用戶手動操縱指令傳達。除此之外,四旋翼無人機還需要與地面站或其他四旋翼有數據交互,用于狀態監控,集群協同等

硬件與協議

無人機與外界通信主流方案包括三種:WiFi,藍牙,2.4G無線數傳。其中WiFi與藍牙也是傳輸信號也在2.4G頻段,一般硬件設備都內置有WiFi,藍牙功能,2.4G收發端都需要額外配置模塊

飛控與外界無線數據通信的圖1

也有部分數傳模塊可以工作在433MHz915MHz頻段,相同功率,頻率低衍射性能好,傳輸距離遠;頻率高則帶寬大一點,傳輸速度快

通常開發這三類硬件需要一個2.4G射頻芯片,在上層開發協議棧。這三類方案一些常見產品指標對比如下,其中藍牙5.04.0在帶寬和傳輸距離上有提升,數傳模塊產品性能區間較大,可以結合價格和場景需要選用

市面上這三種都是模塊產品如ESP8366 WiFi模塊,3DR 915MHz無線數傳模塊,對外屏蔽協議棧細節。與飛控走串口協議,在PX4中只需要讀寫串口解析應用層MAVLink協議即可

MAVLink協議

MAVLink定義了輕量級無人機之間傳輸數據格式,支持多種語言和多種平臺,支持至多255種機型,并且高度可靠與安全。2009年發布MAVLink v12017年發布版本MAVLink v2. MAVLink系列無論是數據幀格式還是交互過程,都和socket十分相似,我們下面一起來看一下

1 MAVLink實現

1.1 協議

MAVLink v2相比于v1,頭部標記由8字節升級到14字節,擴展性進一步提高。我們重點關注MAVLink v2,下面為MAVLink v2序列化后的數據幀格式 

飛控與外界無線數據通信的圖2

飛控與外界無線數據通信的圖3

收發端首先四次握手進行版本協商,然后即建立連接

系統與組件的認證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 MAVLinkPX4中的使用

對于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

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP