載電腦與QGC的無線MAVLink鏈路)
干無人機(jī)調(diào)試的兄弟應(yīng)該都有過這種經(jīng)歷飛控和地面站之間拖著一根USB線調(diào)試的時候人得蹲在機(jī)架旁邊想站遠(yuǎn)一點(diǎn)觀察就束手束腳。后來換數(shù)傳電臺距離是遠(yuǎn)了但一對電臺幾百上千不同協(xié)議還有兼容性坑。其實(shí)大多數(shù)實(shí)驗(yàn)室和室內(nèi)調(diào)試場景根本用不到電臺——機(jī)載電腦和地面站電腦之間用現(xiàn)成的WiFi就能把MAVLink數(shù)據(jù)傳得穩(wěn)穩(wěn)當(dāng)當(dāng)。下面這套配置就是把PX4機(jī)載電腦和QGC地面站通過WiFi搭成無線鏈路。核心思路不復(fù)雜機(jī)載端把飛控的串口數(shù)據(jù)轉(zhuǎn)發(fā)進(jìn)局域網(wǎng)地面站QGC通過UDP或TCP去接收。適合正在做PX4二次開發(fā)、經(jīng)常在實(shí)驗(yàn)場地來回跑、或者單純想擺脫USB線束縛的開發(fā)者。只要你的機(jī)載電腦能連WiFi這套配置基本都能照搬。1. 無線連接的原理與方案選型1.1 MAVLink數(shù)據(jù)鏈路的核心概念MAVLink是PX4與地面站之間通信的基礎(chǔ)協(xié)議。飛控通過串口或USB口把姿態(tài)、位置、遙控信號、任務(wù)信息等封裝成MAVLink消息發(fā)出來地面站收到后解析成可視化界面上的數(shù)據(jù)和指令。這個鏈路在傳統(tǒng)調(diào)試?yán)锞褪且桓鵘SB線在機(jī)載方案里則需要一個中間進(jìn)程幫你把飛控口的數(shù)據(jù)“搬”到WiFi網(wǎng)絡(luò)上。機(jī)載端承擔(dān)這個搬運(yùn)任務(wù)的常用工具有兩個mavlink-router和MAVProxy。mavlink-router是PX4社區(qū)推薦的輕量級路由啟動后監(jiān)聽飛控串口再根據(jù)配置把數(shù)據(jù)復(fù)制轉(zhuǎn)發(fā)到多個UDP或TCP端點(diǎn)。MAVProxy是老牌地面通信組件功能更多但配置略重調(diào)試期好用長期跑任務(wù)我反而更傾向于mavlink-router原因后面細(xì)說。理解這個數(shù)據(jù)鏈路是排查一切問題的前提。飛機(jī)端的飛控只是老老實(shí)實(shí)把MAVLink消息發(fā)到串口機(jī)載電腦上的路由進(jìn)程負(fù)責(zé)轉(zhuǎn)發(fā)地面站QGC負(fù)責(zé)接收和展示。任何一段出問題表現(xiàn)都是“連不上飛機(jī)”但排查路徑完全不同。所以我習(xí)慣把鏈路拆成三段去看飛控到機(jī)載電腦的串口段、機(jī)載電腦內(nèi)部的路由轉(zhuǎn)發(fā)段、WiFi網(wǎng)絡(luò)到QGC的接收段。1.2 三種WiFi組網(wǎng)方式怎么選無線方案先要確定網(wǎng)絡(luò)拓?fù)?。最省事的是AP模式機(jī)載電腦和地面站一起連同一個無線路由器兩臺設(shè)備IP在同一個子網(wǎng)內(nèi)互相能直接ping通。這是大多數(shù)實(shí)驗(yàn)室和室內(nèi)場地的標(biāo)準(zhǔn)做法路由器固定放在場地一角即可配置最透明出問題也好定位。第二種是機(jī)載端自建熱點(diǎn)。樹莓派或NUC上把無線網(wǎng)卡切成AP模式地面站筆記本去連這個熱點(diǎn)。好處是不需要額外路由器適合沒有固定網(wǎng)絡(luò)的野外空地缺點(diǎn)是熱點(diǎn)一般都帶NAT轉(zhuǎn)發(fā)機(jī)載端和地面站雖然還在同一個局域網(wǎng)但如果地面站同時還想著上互聯(lián)網(wǎng)就需要機(jī)載端做IP轉(zhuǎn)發(fā)配置多一層調(diào)試時容易分心。第三種是機(jī)載端連接已有的園區(qū)WiFi地面站也連同一個WiFi。這種方案一般在半室外場景用但園區(qū)WiFi的AP部署、頻段選擇、IP分配策略都不可控調(diào)試時經(jīng)常出現(xiàn)信號抖動。我的建議是除非環(huán)境特別簡單否則別選這條路。自己帶一個雙頻路由器比什么都穩(wěn)。1.3 UDP與TCP調(diào)試場景下的取舍MAVLink數(shù)據(jù)的傳輸協(xié)議不外乎UDP和TCP。QGC默認(rèn)在UDP 14550端口上監(jiān)聽機(jī)載端把數(shù)據(jù)發(fā)到這個端口QGC收到就能解析。UDP的特點(diǎn)是只管發(fā)和收丟包不重傳對于遙測類數(shù)據(jù)姿態(tài)、電量、GPS來說非常合適實(shí)時性優(yōu)先偶爾丟幾個包影響不大下一幀數(shù)據(jù)很快就補(bǔ)上來了。TCP則強(qiáng)調(diào)可靠性數(shù)據(jù)包丟了會重傳代價是延遲會跳動在WiFi信號弱的場景下甚至?xí)霈F(xiàn)明顯的滯后。但TCP有個好處連接關(guān)系明確QGC作為客戶端主動去連機(jī)載端的TCP端口機(jī)載端不用關(guān)心QGC的IP只要QGC知道機(jī)載端IP就能建立鏈路。所以我的建議是默認(rèn)用UDP廣播方式調(diào)試信號差、需要穩(wěn)定傳輸完整日志時再切TCP。MAVLink生態(tài)對端口有一個約定俗成的用法14550是QGC監(jiān)聽的UDP端口5760是mavlink-router默認(rèn)的TCP端口。這兩個數(shù)字會貫穿整篇配置建議直接記在筆記里。2. 環(huán)境準(zhǔn)備與通信參數(shù)規(guī)劃2.1 硬件與軟件版本清單以我手頭這套典型配置為例飛控是Pixhawk 6C機(jī)載電腦是樹莓派4B地面站是一臺Windows 11筆記本路由器是支持5GHz的雙頻設(shè)備。這套組合在社區(qū)里覆蓋度很高你手里的硬件即使型號不同配置邏輯也完全一樣。軟件方面機(jī)載端我用Ubuntu 22.04mavlink-router用最新release版本PX4固件1.14.x以上都行QGC用4.x。有一點(diǎn)需要提醒mavlink-router的編譯依賴會隨版本更新如果你拉的是老版本代碼在Ubuntu 22.04上可能會遇到個別依賴缺失按照報錯提示裝齊就行不是大問題。2.2 IP、端口與串口規(guī)劃統(tǒng)一IP規(guī)劃很重要。我習(xí)慣把機(jī)載電腦固定成靜態(tài)IP地面站保持DHCP或也固定一個。比如下面這個例子設(shè)備IP地址說明機(jī)載電腦192.168.1.100靜態(tài)配置DHCP保留地面站192.168.1.50靜態(tài)或DHCP均可路由器192.168.1.1默認(rèn)網(wǎng)關(guān)端口方面前面提到的14550和5760是核心。如果你有多個飛控或者多臺地面站同時接端口需要錯開否則數(shù)據(jù)會串。一般情況下一套飛控對應(yīng)一臺地面站這兩個端口就夠了。串口規(guī)劃容易被忽略。飛控通過USB接到樹莓派Linux下設(shè)備節(jié)點(diǎn)通常是/dev/ttyACM0。如果走的是飛控的TELEM口那就是/dev/ttyUSB0或/dev/ttyUSB1。一定要先搞清楚飛控對應(yīng)的設(shè)備節(jié)點(diǎn)是哪個后面所有配置都依賴這個路徑。2.3 串口聯(lián)調(diào)WiFi之前必須做的一步在配置WiFi之前先確認(rèn)機(jī)載電腦能正常讀取飛控數(shù)據(jù)。飛控通過USB接到樹莓派后執(zhí)行l(wèi)s /dev/ttyACM*大概率看到/dev/ttyACM0。如果什么都沒有檢查USB線是不是只能充電不能傳數(shù)據(jù)這種線在調(diào)試現(xiàn)場太常見了我至少有兩次卡在這上面換了根數(shù)據(jù)線立刻就好。然后看權(quán)限。如果設(shè)備節(jié)點(diǎn)的屬主是root當(dāng)前用戶打開會有Permission denied問題。把當(dāng)前用戶加入dialout組sudo usermod -a -G dialout $USER重新登錄后生效。不然后面mavlink-router每次啟動都要sudo做開機(jī)自啟時更是麻煩。接下來驗(yàn)證串口數(shù)據(jù)是否正常。最簡單的辦法是用QGC通過USB先連一次確認(rèn)姿態(tài)數(shù)據(jù)能刷新。這一步別省串口聯(lián)不通后面WiFi鏈路全白搭。如果你手頭有分線板或者邏輯分析儀也可以直接抓串口波形但對大多數(shù)人來說QGC能看到飛機(jī)姿態(tài)就是串口沒問題的鐵證。3. 機(jī)載端mavlink-router配置3.1 編譯安裝樹莓派上可以直接用apt裝mavlink-router但版本可能偏老我建議源碼編譯過程不復(fù)雜。先裝依賴sudo apt update sudo apt install -y git cmake g ninja-build拉代碼git clone https://github.com/mavlink/mavlink-router.git cd mavlink-router git submodule update --init --recursive編譯安裝mkdir build cd build cmake .. make -j4 sudo make install編譯時間在樹莓派4B上大概幾分鐘如果用的樹莓派5會更快。裝完后驗(yàn)證一下mavlink-routerd --version能輸出版本號就沒問題。有一個小坑某些版本安裝后二進(jìn)制名帶d叫mavlink-routerd有些版本則叫mavlink-router寫systemd服務(wù)時留意一下。3.2 主配置文件詳解mavlink-router的主配置文件默認(rèn)路徑是/etc/mavlink-router/main.conf。我推薦的最小配置如下[General] DebugLogLevel1 TcpPort5760 ReportStatsfalse [UdpEndpoint broadcast] Address255.255.255.255 Port14550 [UdpEndpoint localhost] Address127.0.0.1 Port14550 [SerialEndpoint PX4] Device/dev/ttyACM0 Baudrate115200幾個關(guān)鍵點(diǎn)拆開講。Address設(shè)置為255.255.255.255是廣播地址mavlink-router會把MAVLink數(shù)據(jù)包發(fā)給整個局域網(wǎng)。這樣QGC端不需要知道機(jī)載電腦的IP只要在同一個WiFi下、監(jiān)聽14550端口就能自動收到心跳包。省去了換網(wǎng)絡(luò)就要改IP的麻煩。Baudrate這一項(xiàng)如果飛控是USB連接到機(jī)載電腦的其實(shí)不生效因?yàn)閁SB虛擬串口沒有真正的波特率概念但mavlink-router要求必須填填115200即可。如果走TELEM口接波特率必須和PX4里設(shè)置的一致TX1/TX2口默認(rèn)值不一樣去QGC的參數(shù)列表里看MAV_1_CONFIG或MAV_2_CONFIG對應(yīng)的波特率就對了。如果你不想讓數(shù)據(jù)滿局域網(wǎng)廣播可以把UdpEndpoint的Address改成特定IP[UdpEndpoint GroundStation] Address192.168.1.50 Port14550廣播和定點(diǎn)兩種方式各有利弊。定點(diǎn)發(fā)送流量干凈不打擾其他設(shè)備但每次換網(wǎng)絡(luò)都要改配置廣播省心QGC開機(jī)就能識別代價是每個連到同一個WiFi的設(shè)備都能收到MAVLink包。調(diào)試階段我?guī)缀醵奸_廣播省下來的時間比什么都值。還有個細(xì)節(jié)文件里我加了localhost的UdpEndpoint意思是同時向本機(jī)的14550端口發(fā)一份。這個有時候調(diào)試有用比如機(jī)載電腦上本地跑MAVSDK或者M(jìn)AVProxy去讀數(shù)據(jù)時能直接用。如果你不需要刪掉這節(jié)不影響正常連接。3.3 系統(tǒng)服務(wù)與開機(jī)自啟配置寫好后啟動mavlink-router服務(wù)sudo systemctl enable mavlink-router sudo systemctl start mavlink-router如果是編譯安裝mavlink-router大概率已經(jīng)自帶systemd service文件如果沒有手動創(chuàng)建一個sudo nano /etc/systemd/system/mavlink-router.service內(nèi)容[Unit] DescriptionMAVLink Router Afternetwork.target [Service] ExecStart/usr/bin/mavlink-routerd -c /etc/mavlink-router/main.conf Restarton-failure Useryour_username [Install] WantedBymulti-user.target注意把ExecStart的路徑換成你實(shí)際的二進(jìn)制路徑用which mavlink-routerd查一下。如果不用User指定用戶服務(wù)會以root跑串口權(quán)限沒問題但安全上不太優(yōu)雅。啟動后看日志確認(rèn)journalctl -u mavlink-router -f看到類似“Serial connection on /dev/ttyACM0”和“UDP endpoint created”的信息說明串口和網(wǎng)絡(luò)端點(diǎn)都正常了。這里要分享一個真實(shí)踩過的坑樹莓派上如果同時插了USB轉(zhuǎn)串口和測距儀/dev/ttyACM*的順序可能不固定這次是/dev/ttyACM0那次是/dev/ttyACM1。穩(wěn)妥做法是寫udev規(guī)則按設(shè)備序列號把飛控固定成軟鏈接/dev/ttyACM_px4。操作方法是udevadm info -a -n /dev/ttyACM0在輸出里找到ATTRS{serial}的值然后創(chuàng)建規(guī)則文件把設(shè)備固定下來。這個技巧可以徹底避免開機(jī)后識別錯設(shè)備多飛控調(diào)試時尤其有用。3.4 MAVProxy替代方案有朋友習(xí)慣用MAVProxy做機(jī)載路由也行。一條命令搞定mavproxy.py --master/dev/ttyACM0,115200 --outudp:192.168.1.50:14550或者廣播形式mavproxy.py --master/dev/ttyACM0,115200 --outudpbcast:14550MAVProxy可以隨時在終端里用命令行操作MAVLink消息調(diào)試期確實(shí)方便比如直接發(fā)指令切換飛行模式。但長期運(yùn)行時它的日志輸出比mavlink-router多出錯時關(guān)鍵信息容易被刷屏。我的習(xí)慣是調(diào)試抓包用MAVProxy穩(wěn)定飛行任務(wù)跑mavlink-router各管一段。4. QGC地面站連接配置4.1 UDP模式一把梭連上打開QGC點(diǎn)擊左上角的“Q”圖標(biāo)進(jìn)入Application Settings再進(jìn)Comm Links。點(diǎn)Add添加一個鏈路Type選擇UDP端口填14550。這個鏈路本質(zhì)上是讓QGC在14550端口上默默監(jiān)聽一旦收到MAVLink包就會自動連接。如果機(jī)載端用的廣播模式地面站這邊什么都不用多改。QGC開在那里飛控加電、mavlink-router啟動之后最多幾秒鐘右上角就會從Disconnected變成你的飛機(jī)型號和固件版本。我實(shí)際使用中UDP方式的自動發(fā)現(xiàn)基本是秒連這也是我推薦UDP廣播作為首選的原因。4.2 TCP模式主動連接更可控如果你在mavlink-router里開了TcpPort5760QGC也可以走TCP。添加Link時Type選擇TCPServer Address填機(jī)載電腦的IP比如192.168.1.100Server Port填5760點(diǎn)Connect即可。TCP的優(yōu)點(diǎn)前面說過QGC是主動連接方哪怕機(jī)載端廣播鏈路關(guān)了只要TCP端口開著QGC一直重試也能連上。缺點(diǎn)同樣明顯每次開機(jī)機(jī)載電腦的IP一變QGC這邊就再也連不上了。所以選TCP方案的前提是先給機(jī)載電腦配好靜態(tài)IP不然每次重啟都像開盲盒。4.3 連接成功后的三步驗(yàn)證連上之后先別急著解鎖起飛。在QGC里做三件事第一看主界面右上角的連接狀態(tài)和飛機(jī)型號確認(rèn)固件版本被正確識別。第二打開MAVLink Inspector路徑在Analyze工具里確認(rèn)消息流里有HEARTBEAT、GPS_RAW_INT、ATTITUDE等常見消息。如果消息頻率特別低八成是無線鏈路不穩(wěn)去查信號。第三切到Fly頁面把飛機(jī)放在桌上手動輕輕晃動飛控看姿態(tài)是否跟著動。這一步能確認(rèn)遙測數(shù)據(jù)是實(shí)時通著的不是只有心跳包。如果發(fā)現(xiàn)MAVLink消息頻率很低優(yōu)先排查WiFi信號其次檢查mavlink-router日志。具體排查方法看下一節(jié)。5. 高頻問題排查與避坑實(shí)錄5.1 高頻問題速查表我整理了一份問題對照表基本覆蓋了WiFi連接配置中八成的情況現(xiàn)象可能原因處理方法QGC一直顯示W(wǎng)aiting for vehicle機(jī)載端沒發(fā)心跳包查mavlink-router日志確認(rèn)/dev/ttyACM存在機(jī)載和地面站能互相ping通但QGC連不上UDP端口被防火墻攔截放行14550/5760端口或臨時關(guān)閉ufw連上后數(shù)據(jù)刷新很慢WiFi信號差或頻段擁擠近距離測試或換5GHz頻段重啟機(jī)載電腦后連接失效靜態(tài)IP沒配、串口設(shè)備名變了配靜態(tài)IP用udev固定串口mavlink-router啟動報Permission denied當(dāng)前用戶不在dialout組usermod -a -G dialout并重新登錄廣播模式下QGC還是收不到路由器開了AP隔離進(jìn)路由器后臺關(guān)閉客戶端隔離防火墻這里多說一句。Ubuntu的ufw默認(rèn)一般沒開但如果你曾經(jīng)配過防火墻記得加規(guī)則sudo ufw allow 14550/udp sudo ufw allow 5760/tcp sudo ufw allow 5760/udp很多人在Windows筆記本上折騰半天結(jié)果問題是機(jī)載端Linux防火墻把UDP廣播擋了這類問題最費(fèi)時間。5.2 無線信號與延遲優(yōu)化我實(shí)際調(diào)試中最常見的問題不是配置而是信號干擾。實(shí)驗(yàn)室WiFi環(huán)境特別擁擠2.4GHz頻段經(jīng)常有幾十個熱點(diǎn)藍(lán)牙鼠標(biāo)、無線鍵鼠也都在這個頻段附近湊熱鬧。第一次測試的時候飛機(jī)在地面站旁邊不到三米數(shù)據(jù)卻一波一波地卡頓最后發(fā)現(xiàn)是2.4GHz被干擾得厲害。處理辦法是近場用5GHz遠(yuǎn)場降到2.4GHz。5GHz近距離延遲低、吞吐高但穿墻衰減明顯2.4GHz覆蓋遠(yuǎn)但干擾源多。如果你不確定當(dāng)前信號質(zhì)量在QGC的MAVLink Inspector里看消息頻率正常連接下消息刷新應(yīng)該是每秒十幾到幾十條明顯低于這個數(shù)值就要處理信號了。還有一個容易被忽略的點(diǎn)是天線方向。筆記本天線通常集成在屏幕邊框樹莓派小鐵盒里的天線位置又朝向另一邊。調(diào)試時把雙方的天線方位大致對齊信號質(zhì)量能改善不少。另外路由器盡量放在場地中間偏高的位置不要放在金屬桌面或機(jī)架旁邊金屬對WiFi信號的衰減比你想象中大得多。5.3 無路由器場景的AP熱點(diǎn)應(yīng)急方案如果外出場地沒有路由器機(jī)載電腦開熱點(diǎn)是最后的兜底方案。樹莓派上NetworkManager切AP模式很容易先查看無線網(wǎng)卡名稱nmcli device status創(chuàng)建熱點(diǎn)假設(shè)網(wǎng)卡是wlan0nmcli device wifi hotspot ifname wlan0 ssid px4-link password 12345678創(chuàng)建完查看熱點(diǎn)的IP段nmcli connection show Hotspot | grep IP4.ADDRESS一般是192.168.2.1/24這類網(wǎng)段。此時mavlink-router不用大改還是廣播模式地面站筆記本連上這個熱點(diǎn)后IP會自動從熱點(diǎn)網(wǎng)段拿一個QGC監(jiān)聽14550自動就能收到廣播數(shù)據(jù)包。有兩點(diǎn)提醒一是熱點(diǎn)名稱別太復(fù)雜個別老式網(wǎng)卡對特殊字符的SSID支持有問題二是機(jī)載電腦開了熱點(diǎn)多半就沒法同時上外網(wǎng)了如果還需要遠(yuǎn)程SSH或者其他聯(lián)網(wǎng)服務(wù)建議準(zhǔn)備第二塊USB無線網(wǎng)卡一塊做熱點(diǎn)一塊上網(wǎng)互不干擾。跑這套配置踩過不少坑最大的體會是“先有線再無線”這個順序千萬不能亂。很多人一上來就急著配mavlink-router和WiFi鏈路結(jié)果串口那頭根本沒數(shù)據(jù)后面排查全是白費(fèi)功夫。從飛控到機(jī)載電腦再經(jīng)WiFi到QGC鏈路一段一段通任何一步出問題都容易定位。最后分享一個小技巧如果調(diào)試時不方便帶路由器又想讓地面站和機(jī)載端同時上網(wǎng)可以在機(jī)上把USB tethering和WiFi熱點(diǎn)配合使用。手機(jī)USB共享網(wǎng)絡(luò)給樹莓派樹莓派再開熱點(diǎn)給地面站這樣地面站既能看到飛機(jī)又能正常上云臺控制和其他網(wǎng)絡(luò)服務(wù)。這套組合在戶外實(shí)測過很多次穩(wěn)定性非常不錯。WiFi鏈路本身做室內(nèi)調(diào)試和集群測試已經(jīng)很夠用了實(shí)在要飛遠(yuǎn)再上數(shù)傳電臺也不遲。