1. 先想明白WiFi链路到底解决什么问题又有哪些不讲情面的限制做无人机调试的人基本都经历过这个场景无人机摆在桌上USB线连着飞控和电脑QGC地面站一切正常参数、地图、日志都能看。可一旦想把飞机挪到窗户边、天台、或者空旷的草坪上试机线缆长度就成了最大的瓶颈。USB线超不过3米拖着一条延长线在场地上来回走一不小心电脑被绊一下飞控直接掉线重启心态瞬间崩掉。WiFi无线连接要解决的就是这个“不想被线缆绑死”的痛点机载端通过一个WiFi模块或者伴机把飞控的MAVLink数据包送到局域网里地面站的笔记本连同一个热点QGC就能像插着USB线一样实时看到姿态、航点、日志和参数。这套方案在PX4生态里其实非常成熟。开源自驾仪本身不挑链路MAVLink协议设计之初就考虑过通过UDP、TCP在局域网内传输。也就是说飞控只要把数据发给某个串口串口那头接一个能“串口转WiFi”的设备数据就能被地面站收到。反过来地面站下发的指令也能原路返回飞控。整条链路的关键词就两个一个是MAVLink负责数据格式和消息类型另一个是UDP/TCP透传负责把MAVLink字节流装上网络协议的壳。但WiFi并不是万能的。它和数传电台、4G模块有着本质区别WiFi基于2.4G/5.8G频段、使用CSMA/CA机制传输延迟不稳定抗干扰能力一般覆盖距离通常只有几十米到几百米。所以WiFi链路适合的场景主要是室内调试、机库内检查、短距离实验飞行、编队地面联调。真要飞几公里远还是老老实实上433M/915M数传或者4G模块。这一点必须在一开始就明确免得有人拿着WiFi链路去飞远航结果信号一弱就失控还反过来骂配置指南有问题。明确了边界之后我们再看WiFi方案在PX4体系里的几种常见形态。下面这章会把形态、选型和接线一次说透。2. 机载端硬件准备与接线串口、供电、电平这三关缺一不可2.1 三种常见组网形态先对号入座在PX4开源生态里WiFi链路不是只有一种装法。我见过比较多、也比较靠谱的无非下面三种形态各有各的适用对象。第一种是串口透传WiFi模块直接挂TELEM串口。典型硬件就是ESP8266/ESP32这类低成本的WiFi模组刷一个“串口到UDP/TCP透传”固件接在飞控的TELEM1或TELEM2口上。飞控的MAVLink数据从串口出来模块直接打包成UDP数据包发到局域网。优点是非常轻量、成本低、功耗小适合小四轴、室内调试机。缺点是ESP8266的WiFi性能相对一般信号强度、稳定性都算不上优秀而且很多廉价模块的供电设计很糟糕容易导致飞控重启。第二种是伴机电脑MAVLink Router转发。也就是在树莓派、香橙派这类Linux小主机上跑一个mavlink-router或者MAVProxy进程伴机通过串口或USB连飞控然后伴机再通过自己的WiFi网卡接入热点把MAVLink数据用UDP转发到局域网。这种形态最灵活可以做很多机载任务处理比如视觉识别、日志备份、远程调试。稳定性和转发性能都远胜单纯的串口WiFi模块适合做正经的科研、二次开发项目。缺点是需要多一块板子、多一份供电预算配置复杂度也更高。第三种是飞控板载WiFi比如某些自带WiFi功能的飞控或者通过USB转WiFi的即插即用模块。这种最省事但兼容性和可定制性最差。部分非开源闭源飞控经常这么干在PX4上也有少数板子支持原生WiFi但对大多数自组机来说还是前两种更通用。2.2 接线细节RX、TX必须交叉共地是底线无论选哪种形态接线都是第一道坎。以常用的Pixhawk 6C/6X系列和TELEM2口为例TELEM2的排针定义从官方手册上能查到其中与WiFi模块相关的四个引脚是VCC(5V)、GND、TX、RX。这里有一个几乎每个新手都会踩的坑飞控的TX引脚要接WiFi模块的RX飞控的RX引脚要接WiFi模块的TX。很多人第一次接线习惯性看了引脚名字就直接同名相连TX对TX、RX对RX结果数据完全不通。原因是串口通信里两个设备必须交叉连接一个设备发送另一个设备接收。这个错误在串口屏、GPS、数传模块上也很常见属于嵌入式通信的经典翻车点。再说共地。飞控和WiFi模块如果分别由不同的电源供电必须把两个系统的GND接在一起否则串口电平根本没有参考地数据线看起来好像接了实际上信号完全乱掉。我实测过不共地的情况模块能通电、能连WiFi但飞控发过来的数据全是乱码或者干脆一个字节都收不到。而且这里还有个隐患如果两个系统之间地电位差过大甚至可能烧毁串口引脚。再说供电。ESP8266这种模块的峰值电流很容易到300mA甚至更高如果直接从飞控TELEM口的5V引脚取电飞控的板载稳压器压力会很大。尤其在电机启动、舵机动作的时候全机电平波动一下WiFi模块就在那重启飞控也跟着重启。我见过很多“WiFi连上就掉、连上就掉”的问题最后发现就是供电不足。稳妥做法是WiFi模块用独立稳压供电比如BEC或者降压模块但前提是供电的BEC必须和飞控共地。这是我从几块飞控和几个ESP8266模块身上总结出来的血泪教训。2.3 电平匹配3.3V和5V之间不要硬碰电平问题也值得单独说一下。现代PX4飞控的串口多数是3.3V电平而不少WiFi串口模块是5V兼容设计甚至是纯5V逻辑。如果模块的TX输出5V高电平直接接到飞控的3.3V串口RX引脚轻则工作异常重则烧掉飞控的串口引脚。反过来如果模块只接收3.3V电平还好一点但最好不要赌这个兼容性。最稳妥的方案是选择明确标注“3.3V逻辑电平”的模块或者在中间加一个电平转换板。市面上有不少串口转WiFi模块自带电平转换电路价格贵几块钱但对飞控来说安全了很多。另外接线之前建议用万用表量一下模块的VCC和GND之间的电压确认模块的工作电压再决定怎么接。这一步很多人会跳过觉得多此一举但烧过一两次之后就知道这几十秒有多值钱。3. 机载软件配置PX4参数、模块透传、伴机服务三线并进3.1 先确认固件版本和串口分配原则硬件接好之后接下来就是软件层面的配置。PX4固件的版本不同参数命名略有差异但核心逻辑是一样的。我这里以目前比较主流的PX4 1.13/1.14版本为例。基本思路是先把某个物理串口分配给MAVLink然后把MAVLink的模式设为合适的工作模式最后根据外接WiFi模块的串口速率设置波特率。需要先理解PX4串口分配的几个关键参数。以TELEM2口为例涉及的主要参数是MAV_2_CONFIG指定MAVLink实例绑定到哪个串口。MAV_2_MODEMAVLink的工作模式可选项包括Onboard、Normal、External等。SER_TEL2_BAUDTELEM2串口波特率默认是57600。如果你用的是TELEM1口对应的参数就是MAV_1_CONFIG和SER_TEL1_BAUD。在QGC的参数界面里搜索“MAV_2_CONFIG”就能找到这些参数。需要特别提醒的是修改完这些参数后飞控会要求重启或者重新连接这个过程中参数写入不会立即生效别着急。从PX4源码的串口驱动设计来看每个串口在同一时间只能绑定一个功能模块。也就是说如果TELEM2已经被分配给了GPS或者其它传感器你再设置MAV_2_CONFIG绑定TELEM2就会引发冲突。这也是很多奇怪故障的来源明明配置了MAVLink串口就是不出数据查到最后发现是外设抢占了这个物理串口。3.2 ESP8266/ESP32串口透传配置AT命令的几个关键步骤如果你用的是ESP8266/ESP32这类模块最常见的固件形态是“串口透传到网络”。不同固件配置方式不太一样我这里说一种比较通用的流程。第一步把模块先通过USB转串口工具接到电脑上打开串口终端工具波特率设成模块默认值通常是115200或9600发一个AT命令能收到OK就说明模块工作正常。然后分三步设置# 设置WiFi模式为Station并连接热点 ATCWMODE1 ATCWJAP你的热点名称,热点密码 # 设置波特率实际使用时要和PX4串口波特率保持一致 ATUART_CUR57600,8,1,0,0 # 建立UDP透传连接目标为地面站电脑IP和QGC端口 ATCIPSTARTUDP,192.168.1.100,14550,14550,2不同固件对ATCIPSTART的UDP参数定义略有差异有的要求带本地端口有的只需要远程IP和远程端口。如果你用的是市面上常见的“串口转WiFi模块”厂商通常会给一个网页配置界面直接在网页里填目标IP和端口就行比纯AT命令更直观。这里有一个关键点UDP模式下模块要清楚知道地面站的IP地址。如果地面站电脑的IP是动态分配的重新连接WiFi之后IP变了模块就会把数据发到旧地址上。我的做法是在无线路由器里给地面站电脑绑定一个固定IP或者在电脑上手动设置静态IP这样模块的配置就不用频繁改。波特率也是一个大坑。ESP8266串口默认115200但PX4的TELEM串口默认是57600。如果两边不一致飞控的数据模块收了等于没收到输出就是一堆乱码。我的建议是先在PX4参数里把SER_TEL2_BAUD改成57600再在模块端把串口波特率也设成57600两边对齐。有人可能会说那我把两边都设成921600不是更快吗理论上没错但ESP8266这类模块对高波特率下的稳定性普遍一般而且WiFi链路本身带宽有限57600完全够用。别为了那一点点理论速率牺牲稳定性。3.3 伴机方案mavlink-router配置和PX4侧设置如果你走的是树莓派伴机方案配置思路就不一样了。飞控通过串口连树莓派树莓派上跑mavlink-router把串口的数据转发到UDP让局域网内多个地面站都能收到。PX4侧需要设置的就是把TELEM2口当作MAVLink串口波特率建议直接用SER_TEL2_BAUD921600因为树莓派和飞控之间是本地有线串口跑高波特率没有WiFi不稳定的问题。PI接线时注意树莓派的UART引脚TX/RX分别接飞控的RX/TX同样要交叉且必须共地。很多树莓派默认把GPIO串口分配给了系统控制台使用前要在/boot/config.txt里打开enable_uart1并且禁用串口控制台服务否则系统日志会和MAVLink数据混在一起。mavlink-router的配置很简单装好后编辑主配置文件核心就是定义一个串口端点和一个UDP端点[General] TcpServerPort5760 ReportStatsfalse [UdpEndpoint qgc] ModeNormal Address0.0.0.0 Port14550 [UartEndpoint px4] Device/dev/ttyAMA0 Baud921600配置好之后启动mavlink-router服务就可以看到日志显示串口设备打开成功UDP端点监听正常。伴机方案的好处这时就体现出来了局域网里任何一台电脑打开QGC只要连上同一个WiFi连接方式选择UDP监听14550端口就能收到数据。4. QGC地面站连接配置UDP监听、TCP直连各自怎么设4.1 QGC“通讯连接”界面手把手设置机载端配置完成后接下来就是地面站的操作。来到QGC主界面左上角点击那个像“信号塔”一样的图标进入通讯连接设置页。点击左下角的“添加”按钮这里可以同时配置多套连接方案比如平时的USB连接、数传连接、WiFi连接切换时只需要点一下对应的连接项。如果你用的是串口透传WiFi模块而且模块配置成向电脑的特定IP和端口发送UDP数据那么QGC这边的设置要选“UDP”然后在下面的参数里选“侦听”模式端口填14550点击“连接”。QGC就会在本机的14550端口上监听UDP数据包。机载模块发来的数据只要是发往这个端口的QGC就能收到。这个过程不需要QGC知道飞控的IP因为UDP是单向发过来的QGC只管接收并回发。如果你用的是伴机方案mavlink-router的UDP端点是监听所有地址的14550端口那么QGC同样选UDP、监听模式、14550端口。看起来设置和上面一样但背后的数据通道完全不同一个是模块直接发数据给电脑的IP一个是电脑从路由器接收伴机转发出来的数据。搞清楚这个区别排查问题时就能少绕很多弯。还有一个很实用的功能QGC支持多连接共存。你可以在通讯连接里同时选中“USB”和“UDP”这样既可以通过WiFi看数据也可以通过USB线缆做烧录和应急调试。这种双通道模式在实际外场调试中非常好用数据链路断的时候不用手忙脚乱重新接线。4.2 TCP和UDP选哪个别拍脑袋QGC连接类型里除了UDP还有TCP。TCP和UDP的区别很多人第一反应是“TCP更可靠”然后就直接选TCP。这种直觉不能说错但在无人机链路里未必是最优解。UDP是面向无连接的数据报协议数据包发出去之后有没有收到协议本身不负责。正因为这样UDP很适合MAVLink这种实时性要求高、允许少量丢包的场景。姿态、加速度这些数据每秒更新几十次偶尔丢几个包完全无所谓下一次数据马上就补上了。而TCP为了保证可靠传输引入了重传机制和拥塞控制一旦无线链路出现延迟抖动TCP就会因为超时重传导致数据堆积反而可能出现延迟越来越大、画面越来越卡的现象这在实飞中是比较危险的。所以我的建议是在局域网内、WiFi信号稳定的前提下UDP完全够用而且延迟更低。TCP适合跨网段、需要保证数据完整性的场景比如你在办公室控制另一栋楼的测试台架中间隔了好几层路由UDP丢包严重的情况下才考虑TCP。当然具体还取决于你的WiFi模块支不支持TCP Server模式。很多ESP8266透传固件默认做TCP ServerQGC端就需要填写模块的IP和端口去连而不能用监听模式。4.3 多地面站同时连接换个思路利用UDP组播如果你带着两台电脑出外场一台屏幕大用来盯航线路点一台用来调PID参数你不需要在两台电脑之间来回切换。利用UDP的广播或者组播特性可以做到一个MAVLink数据流同时被多个地面站接收。mavlink-router天然支持多个UdpEndpoint在配置文件里定义两个UDP端点、分别指向两台电脑的IP数据就能同时发给两个QGC。串口透传模块的方案稍麻烦一点需要看模块是否支持UDP组播或广播我见过有模块支持把数据同时发往多个目标地址但配置界面千奇百怪具体得看固件手册。5. 实测连接过程与踩坑记录从“连不上”到“稳如老狗”的完整排查链路5.1 一次典型的WiFi连接测试流程配置写了一大堆不实测等于零。我这里分享一次我从零开始连接WiFi链路的完整流程你照着走一遍大概率能顺利跑通。第一步先不开WiFi模块用USB线把飞控和QGC连上确认飞控固件版本、参数默认值都正常。在参数界面搜索MAV_2_CONFIG把它设为TELEM2同时把SER_TEL2_BAUD设为57600并写入飞控重启。第二步把WiFi模块接上TELEM2口但先不要把它接入任何WiFi热点直接用串口工具或者模块自带的网页配置界面把模块设置成Station模式并连接一个测试热点的SSID。确认模块已经拿到IP地址这个IP后续会用到。第三步把模块的串口波特率调到和飞控一致57600把UDP透传目标设成地面站电脑的IP端口设成14550。第四步QGC连上同一个WiFi热点在通讯连接设置里新建一个UDP监听连接端口14550点击连接。如果一切顺利几秒钟之内QGC的状态页面就会从“等待MAVLink”变成“连接中”地面站开始显示姿态和卫星数。这时候把飞机轻轻晃动一下QGC的人工地平仪会跟着动说明双向通信已经建立。再试一下“参数读取”和“日志下载”进一步确认链路质量。5.2 经典故障QGC一直显示“等待MAVLink”这是所有人都会遇到的第一道坎。QGC收不到数据原因基本逃不出下面这几类按从最常见到最不常见排序波特率不一致飞控串口和WiFi模块串口的波特率没对齐。先检查飞控的SER_TEL2_BAUD再把模块端改成相同数值。乱码输出大概率就是这个问题。IP地址配错模块的UDP目标IP和地面站电脑当前IP不一致。尤其是用手机热点的时候电脑IP经常在变。用命令行查一下电脑当前的IP确认和模块里填的一致。端口不匹配模块发往的端口和QGC监听的端口不一致。默认建议两边都是14550。Windows防火墙拦了UDP入站流量这个非常坑。很多时候模块配置没问题QGC也没问题但Windows防火墙默认不放过陌生端口的UDP入站。排查方法是临时关掉防火墙测试或者在防火墙里给QGC程序添加一个入站规则如果临时关防火墙后能连上问题就锁定在这里。Linux系统上也要检查ufw状态。这四类问题占了WiFi连接失败场景的九成。剩下的一成里有接线虚焊、RX/TX接反、模块供电不足、热点开启AP隔离等等。热点AP隔离值得单独提一下很多公共场所WiFi和部分手机热点会开启“AP隔离”或“客户端隔离”使得连接同一个热点的设备之间无法互相通信。这种情况下即使IP、端口全对UDP数据也无法在设备之间传输。解决办法是换一个路由器或者在路由器设置里关掉AP隔离。5.3 链路不稳定、延迟忽高忽低的处理连通之后下一个更棘手的问题是链路不稳定。表现是QGC能连上但画面卡顿遥测数据偶尔断几秒甚至经常“连接超时”。这类问题要从几个方面去排查。信号质量永远是第一位的。WiFi模块的天线位置、朝向、附近是否有金属遮挡、是否有其他2.4G设备干扰都会直接影响传输质量。我建议在QGC的飞行日志或使用无线工具里观察信号RSSI如果低于-70dBm链路稳定性就很难保证。改善办法包括调整模块天线方向、把热点路由器放高一些、避开微波炉和蓝牙设备的干扰频段。供电也是老问题。前面说过ESP8266在发射瞬间电流很大如果供电压降严重模块就会频繁重启或丢包。用独立稳压供电并共地后很多“信号不好”其实就自愈了。实测下来同一个模块从飞控串口供电改为独立BEC供电后延迟从动不动断线变成稳定几十毫秒差别非常大。参数层面的优化也有空间。比如UDP数据包的大小会影响传输效率MAVLink的流控策略在PX4侧也有相关参数可调。不过大多数情况下不需要动到这么深把波特率、供电、信号这三个基础环节做好WiFi链路完全可以胜任室内和短距离外场调试。5.4 安全加固别把飞控裸奔在局域网里最后说一下安全意识。WiFi链路打通之后飞控就等于暴露在局域网里了。局域网里任何一台设备只要知道你用的UDP端口默认14550几乎是公开常识都可以往这个端口发MAVLink指令。MAVLink协议本身几乎没有鉴权机制这意味着别人可以远程解锁电机、修改航点、切换飞行模式——在一个开放的WiFi环境里这是非常危险的事情。我的建议很简单不要把你的调试热点SSID起得和无人机有关也别设置成公开无密码的热点。WiFi密码使用WPA2或WPA3加密别用WEP或者开放网络。调试完毕后随手关闭WiFi模块或者在PX4里把MAV_2_CONFIG重新设为禁用防止飞控一直对外广播数据。如果是伴机方案可以在mavlink-router层面配置IP白名单只允许地面站电脑的IP访问UDP端口。这些操作都很基础成本几乎为零但能避免绝大多数“被人连上来解锁电机”的极端事故。搞无人机系统安全这根弦永远不能松。6. 一些关于WiFi链路后续扩展的个人体会写到这里其实还有一个很大的话题没有展开WiFi链路打通之后能做的事情远不止“QGC显示姿态”这么简单。因为MAVLink数据已经上了局域网理论上任何能发UDP包的设备都能接入这条链路。你可以写一个Python脚本监听MAVLink消息做飞行数据实时分析可以让多台地面站同时接管监控可以把伴机的摄像头视频流一起推到局域网里做一个简易的图传甚至可以在QGC之外自己写一套地面控制界面只订阅自己关心的消息主题把不相关的高频遥测屏蔽掉减轻无线链路负担。我在实际项目里做过最多的一件事是把伴机上的MAVLink数据转发到了多个端口一路给QGC用一路给自研的数据记录程序还有一路给了远程诊断脚本。三个终端共享同一份飞行状态互不干扰这比一根USB线插一台电脑的模式灵活得多。等你自己跑通了WiFi链路大概率也会被这种灵活性打动开始琢磨更多基于局域网的应用。最后再分享一个我自己的小习惯每次完成WiFi配置之后我会用笔在模块上贴一条标签写上SSID、波特率、目标端口和配置日期。因为这类模块的配置很容易被遗忘隔几个月回来调试重新接线的时候还得一个一个试波特率、猜IP效率极低。贴上标签下次直接照着恢复几分钟就能重新跑通。这个习惯在一些野外调试、临时架设地面站的场景下帮过我太多次了有条件的话你也可以试试。
