
很多人第一次玩无人机手里同时捏着两块板子一块 Pixhawk 飞控一块树莓派。Pixhawk 负责飞行控制树莓派拿来跑高级功能但真到接线的时候不少人卡在“树莓派到底怎么和飞控说话”这一步。我最早也在这个问题上折腾了一整个周末后来搞明白其实核心就一件事让两者通过 MAVLink 协议在串口上建立连接。这篇文章就是把树莓派连接 Pixhawk 的完整流程拆开讲一遍从硬件选型、系统配置到实际接线、数据验证再到后面跑 MAVROS、做数传中继所有环节我都会按自己踩过的坑来写。不管你用 USB 还是 GPIO 串口看完之后应该都能自己把链路调通。1. 整体设计与思路拆解1.1 为什么要在飞控旁边放一台树莓派Pixhawk 这类飞控说白了是一个实时控制器。它跑的是 PX4 或 ArduPilot 固件负责姿态解算、位置估计、电机控制这些对实时性要求极高的工作。但它的 CPU 和内存都很有限跑不了 Linux也装不了 OpenCV、深度学习模型这类东西。而树莓派是一台完整的 Linux 小电脑算力比飞控高一个量级还能接摄像头、接 Wi-Fi、跑 ROS。把树莓派和飞控组合起来就成了无人机开发圈里最常见的伴机电脑方案官方叫 companion computer。这个组合能做的事很多。最典型的是机载视觉摄像头接在树莓派上跑目标检测或者避障算法再把计算结果通过 MAVLink 发给飞控让飞控去执行。其次是通信中继树莓派连上 Wi-Fi 或 4G地面站通过局域网或公网连到树莓派就相当于给飞控加了一条网络数传。哪怕你只是想在飞行过程中多存一份日志或者在飞控不方便插线的时候远程改参数树莓派都能接得上。在选型上树莓派 4B 是目前性价比最稳的选择4GB 版本足够跑 MAVROS 加简单的视觉程序树莓派 5 性能更强但散热和功耗要额外照顾如果只是做伴机电脑、不想太重Zero 2W 也能胜任只是 GPIO 排针需要自己焊。飞控这边Pixhawk 4、Pixhawk 6C、Cube 系列都支持标准的 MAVLink 串口和 USB选型时重点看有没有引出 TELEM 接口别买那种阉割版飞控板。1.2 三种连接方式怎么选树莓派和 Pixhawk 之间的物理连接我实际试过的主要有三种USB、UART飞控上的 TELEM 口、SPI。SPI 一般是 Pixhawk 6X 这类新板子给高速外设准备的配置相对复杂普通玩家用得少。真正日常用到的就是 USB 和 UART两者各有各的适用场景。连接方式优点缺点适合场景USB即插即用驱动简单不用改飞控参数线重、接口松动风险、占用 USB 口桌面调试、开发验证UARTTELEM连接稳定适合装机后长期使用重量轻需要改树莓派串口配置和飞控参数机载部署、飞行使用SPI/其他带宽高、延迟低配置复杂板子兼容性不一高速外设、特殊项目我的建议是第一次调通先用 USB因为 USB 是插上就能用先把 MAVLink 数据链路跑起来确认整个流程没问题了再换成 UART 做最终装机。这个顺序能帮你把“线没接对”和“软件配置不对”两类问题分开排查少走很多弯路。另外要注意USB 连接虽然方便但在多旋翼上长时间飞行时不推荐因为 USB 头容易在振动中松脱一旦松了通信就断了。1.3 通信协议先搞明白MAVLink 是什么不管是 USB 还是 UART树莓派和飞控之间“说话”用的都是同一个协议MAVLink。它是一套轻量的消息协议飞行数据、姿态、GPS 坐标、遥控指令、参数读写全都封装成一条条消息在线路上传输。飞控每隔一定时间会主动往外发一个心跳包告诉对端“我还活着”这也是我们判断链路通了没有的最直观标志。你不需要把 MAVLink 的每个字段都背下来但心里要有个数树莓派上的所有工具不管是 MAVProxy、MAVROS 还是 QGroundControl本质上都是在收发 MAVLink 消息。链路通不通就看能不能收到心跳功能做不成大概率也能从消息流里看出来是哪条消息没对上。理解了这一层后面所有操作都会变得顺理成章。2. 准备工作与软件环境2.1 树莓派系统安装连接之前先把树莓派的系统准备好。我用的镜像一直是 Raspberry Pi OS 64 位版本可以用官方 Raspberry Pi Imager 烧录。烧录完成后首次开机前建议在 Imager 里就把 SSH 打开、设置好 Wi-Fi 和用户名密码这样你就不需要外接显示器和键盘直接通过 SSH 进树莓派操作后面全程命令行就行。系统启动后先用sudo apt update sudo apt upgrade把系统更新一遍再装几个后面一定会用到的包python3-pip、git、screen。如果你的网络环境访问官方源慢就顺手换个国内镜像源操作按你的发行版版本改/etc/apt/sources.list和对应的 sources.list.d 文件即可。这里提醒一句树莓派 5 和树莓派 4 的系统源路径略有差别别直接复制别人的配置文件看清楚版本再动手。树莓派的用户名建议设置得简单点后面连接飞控和定义串口权限都会用到。我个人习惯默认的pi用户因为很多现有教程、脚本和 systemd 服务都默认写pi的路径如果你改成别的用户名可能会遇到一些莫名其妙找不到目录的问题。2.2 打开 GPIO 串口并处理端口权限这是整个教程里最容易踩坑的一步。树莓派的 GPIO 14 和 GPIO 15 引脚是板载 UART但默认情况下树莓派系统并没有把这对引脚作为普通串口暴露出来尤其是树莓派 3B/4B 这一代板载 UART 默认被蓝牙占用GPIO 上的串口状态很混乱。为了让飞控能接在 GPIO 上你需要手动开启串口并把蓝牙占用的那个 PL011 UART 释放出来。具体操作是编辑/boot/config.txt树莓派 5 上是/boot/firmware/config.txt在文件末尾加两行enable_uart1 dtoverlaydisable-bt第一行让 GPIO 上的 UART 生效第二行把 PL011 UART 从蓝牙手上拿回来给 GPIO 用。保存后重启再用ls -l /dev/serial*检查正常情况下你会看到/dev/serial0这个符号链接它指向真正的串口设备。拿不准用哪个设备名的时候用/dev/serial0准没错。串口设备默认权限是 root 用户普通用户直接访问会报 Permission denied。把当前用户加进 dialout 组sudo usermod -a -G dialout $USER然后注销重新登录或者干脆重启一次权限就生效了。这里一个小细节如果系统里还有蓝牙相关的服务disable-bt 之后可以顺手执行sudo systemctl disable hciuart避免它反复抢占串口资源。还有一点树莓派默认把启动日志输出到串口如果不去掉内核参数里的consoleserial0,115200系统启动日志会一直霸占这个串口MAVLink 数据就没法正常收发这一步在后面排查乱码时特别重要。2.3 飞控端该准备的参数飞控端不用动硬件但要确认两件事固件版本以及对应的串口参数。如果你用的是 USB 连接大多数固件根本不用改参数插上就能通信。但如果你打算用 UARTTELEM 口就需要在飞控上把对应串口配置成 MAVLink 模式。以 ArduPilot 固件为例TELEM2 口一般是 SERIAL2 端口对应的参数是SERIAL2_PROTOCOL把它设为 2表示 MAVLink2波特率参数SERIAL2_BAUD设为 57表示 57600。固件不同参数名会有差异比如 PX4 里一般是SER_TEL2_BAUD这类名字。改完参数后一定要重启飞控让它生效然后在 QGroundControl 里重新连接确认参数确实被写进去了。出门右转第一次接触飞控的读者可能对“刷固件”也不熟。刷固件的方式很简单先把飞控用 USB 连到电脑打开 QGroundControl它会自动识别飞控型号和当前固件在 Firmware 页面选择 PX4 或 ArduPilot 对应的固件版本点烧录即可。刷完固件之后再进参数页面去改刚才说的串口参数顺序不要反。另外一个最容易忽略的点Pixhawk 的 TELEM 口引脚定义。虽然大部分飞控的 TELEM2 都兼容标准 JST-GH 6 针接口排列是 TX、RX、VCC、GND、CTS、RTS但不同品牌会做调整。接线之前先把你的飞控说明书翻出来看清楚哪个是 TX、哪个是 RX千万别想当然接反了串口一点都不工作。3. 连接实操两种方式都给你走一遍3.1 先用 USB 把链路打通如果你手头有 Pixhawk 和树莓派都在桌面上第一步别纠结 GPIO直接找一根能传数据的 USB 线把飞控和树莓派连起来。树莓派上电后飞控也会通过 USB 取电启动。这时候在树莓派终端里跑lsusb应该能看到飞控对应的厂商 ID。然后再看ls /dev/ttyACM*正常情况会列出/dev/ttyACM0这就是 Pixhawk 通过 USB 枚举出来的串口设备。如果设备名没出现先检查 USB 线是不是只能充电不能传数据的线这个问题我遇到不下三次。别小看这一点很多人的飞控在地面站里能连插到树莓派上就不识别最后发现是用的充电线。树莓派上要跟飞控对话最顺手的是 MAVProxy。安装很简单pip3 install --user mavproxy然后启动连接mavproxy.py --master/dev/ttyACM0 --baudrate 115200启动后如果看到MAV提示符并且终端里持续滚动 logged、heartbeat 这类信息说明链路已经通了。你可以输入status查看飞控发来的消息统计看看有没有收到 HEARTBEAT、GPS_RAW_INT、ATTITUDE 这些核心消息。这一条链路通了后面接什么都好说。3.2 换成 UARTGPIO 直连飞控USB 验证没问题后开始做正式装机用的 UART 连接。接线原则很简单树莓派的 TX 接飞控的 RX树莓派的 RX 接飞控的 TX然后 GND 和 GND 必须连在一起也就是所谓的共地。简单说就是交叉接别同名单连。树莓派 40pin 排针上GPIO14 是 TXDGPIO15 是 RXDGND 随便选一个比如 pin6。飞控端用 TELEM2 口多数标准接口定义如下引脚信号1TX2RX3VCC5V4GND5CTS6RTS实际接线只用 TX、RX、GND 三根。树莓派 GPIO14TX接到飞控 TELEM2 的 RX 引脚树莓派 GPIO15RX接到飞控 TELEM2 的 TX 引脚两边 GND 相连。至于 VCC 那根线一般不建议接——树莓派和飞控各自供电VCC 接了反而可能造成电源冲突用共地来保证电平基准一致就够了。这里再强调一次电平问题树莓派 GPIO 是 3.3V TTL 电平Pixhawk 的 TELEM 口同样是 3.3V 逻辑所以可以直接互连不需要电平转换模块。但千万别把飞控的电源输出直接怼到树莓派 5V 引脚上虽然都是 5V但两边电源没有隔离负载变化时容易互相干扰。接好线后树莓派上访问的串口设备是/dev/serial0。先快速验证一下有没有数据用 Python 串口库简单读一下python3 -m serial.tools.miniterm /dev/serial0 57600如果屏幕上出现各种乱码一样的二进制内容其实是好信号说明飞控在源源不断地往这个串口发 MAVLink 数据。乱码只是因为你直接看了原始二进制。真正的调试还是用 MAVProxy 更舒服mavproxy.py --master/dev/serial0 --baudrate 57600看到心跳输出UART 链路就正式完工了。3.3 如何判断链路质量好坏链路通了只是第一步判断链路好不好同样重要。在 MAVProxy 里输入status重点看 heartbeat 的计数是不是持续增长再输入show arming或者观察遥控器通道值有没有更新能更清楚地看到数据流的连续性。如果只是桌面短距离测试UART 一般很稳。真正装机以后电机运转会产生电磁干扰串口线尽量用双绞线或者屏蔽线并且远离电调、电机线。线束长度超过 20 厘米时更要留意信号完整性必要时把波特率从 57600 降到 38400以换取更强的抗干扰能力。这个经验是我在四轴机架上吃过亏之后总结出来的千万别觉得波特率越高越好稳定才是第一位的。4. 进阶让树莓派真正干起活来4.1 跑 MAVROS把飞控接进 ROS树莓派连接飞控的核心目的是做更复杂的任务而 ROS 是这一圈子里绕不开的框架。以 ROS 1 Noetic 为例装 MAVROS 之后一条命令就能把串口数据转成 ROS topicsudo apt install ros-noetic-mavros ros-noetic-mavros-extras roslaunch mavros px4.launch fcu_url:serial:///dev/serial0:57600USB 连接时把fcu_url改成fcu_url:serial:///dev/ttyACM0:115200启动后rostopic echo /mavros/state能看到飞控的连接状态/mavros/imu/data能看到 IMU 数据。到这一步飞控和树莓派之间的数据通路就完整地接进了 ROS 生态后面你想做视觉避障、自主航点都是在这个基础上加功能。如果你是 ArduPilot 固件启动文件要用apm.launch而不是px4.launch两者对消息命名空间的处理有些差异。另外MAVROS 启动时会自动做飞控和机载电脑的时间同步如果启动日志里出现 time sync 失败的告警多半是串口波特率或者设备节点没配对回 3.2 节重新检查一遍连线。4.2 把树莓派当成网络数传中继另一个很实用的玩法是把树莓派变成飞控的地面站中转。飞控本身带的数传模块距离有限但树莓派如果连着 Wi-Fi就能把 MAVLink 数据包转发到局域网内的任何设备上地面站软件不用再插 USB 线。MAVProxy 启动时就支持转发mavproxy.py --master/dev/serial0 --baudrate 57600 --outudp:192.168.1.100:14550其中192.168.1.100改成你的地面站电脑 IP。QGroundControl 里添加一个 UDP 连接监听 14550 端口就能远程看到飞控的所有数据。这个方法在调试机架、试飞不太方便插线时特别有用等于给飞控加了一条 Wi-Fi 数传。如果要做多路转发比如一边给 QGC 用一边给 ROS 节点用MAVProxy 的--out可以写多个也可以直接用mavlink-router这种更现代的工具。mavlink-router 的配置文件里把 Endpoint 分别指向 UDP、TCP 和串口一个进程统一管理比开好几个 MAVProxy 窗口干净得多。4.3 从数据链路到机载大脑如果你已经走到这一步树莓派就从简单的数据透传工具升级成了真正的伴机电脑。我在实际项目里最常用的是在树莓派上跑一个 Python 脚本订阅 MAVLink 的 GPS 和姿态消息结合摄像头图像做简单的目标跟随稍微复杂一点的会直接用 MAVSDK 写几行 Python 代码控制飞机执行航线。MAVSDK 的用法非常直观。装好之后几行代码就能读飞控状态import asyncio from mavsdk import System async def run(): drone System() await drone.connect(system_addressserial:///dev/serial0:57600) async for state in drone.core.connection_state(): print(连接状态:, state) asyncio.run(run())这个例子比 MAVROS 轻量很多适合快速验证链路也适合写一些小工具。不过它不像 MAVROS 那样直接集成 TF、坐标系转换这些机器人中间件所以做完整自主系统时大部分人还是回到 ROS 生态。我的建议是简单任务用 MAVSDK复杂系统用 MAVROS两个都装也不冲突。刚开始不要一上来就冲视觉和自主飞行给自己定一个递进目标先做到树莓派能实时读到飞控姿态再做能通过树莓派发送指令最后再加根据外部输入自动改航线。每一步都验证链路可靠再往下一步走这个节奏能让你少掉很多头发。5. 常见问题与排查技巧实录5.1 飞控插上 USB树莓派里看不到设备最常见的三个原因USB 线是充电线系统没有用最新镜像导致缺少 CDC 驱动Raspberry Pi OS 一般不会或者设备名不是 ttyACM 而是别的。先用lsusb确认飞控有没有被识别再看dmesg | tail的内核日志里面会直接告诉你设备被识别成了什么。如果确认是设备节点名不同比如/dev/ttyUSB0问题不大把后续所有命令里的设备名替换掉就行。另外要注意树莓派上如果同时插了多个串口设备ttyACM0 的编号可能漂移建议用 udev 规则给 Pixhawk 做一个固定别名网上有现成规则配置一次能省掉后面不少麻烦。5.2 串口有数据但 MAVProxy 一堆报错如果 MAVProxy 启动后反复出现 link error 或者 parse error先查波特率是否一致。飞控端 SERIAL2_BAUD57 代表 57600树莓派端就要用--baudrate 57600两边差一位都不行。还有一个隐蔽坑串口设备被系统 console 占用了。如果/boot/config.txt里存在consoleserial0,115200这类内核参数必须把它去掉不然树莓派系统启动日志会一直在串口上跑直接跟 MAVLink 数据打架。检查 console 参数的方法很简单执行cat /proc/cmdline如果输出里带着consoleserial0或者consolettyAMA0就是在占用串口。把/boot/config.txt或/boot/cmdline.txt里对应内容删掉重启再试。5.3 接上 UART 后飞控没反应、不启动先检查接线是不是 RX 和 TX 接反了这个问题概率最高。其次确认 GND 有没有接没有共地的话电平基准都不一致数据根本没法解调。最后看飞控的 TELEM 口是不是被其他外设占用了——比如某些飞控的 TELEM2 同时接数传模块串口上同时挂着两个设备也会导致通信异常。还有一个小坑是飞控端波特率参数没生效。ArduPilot 的参数改动有些必须重启飞控才生效有些人改完直接在 QGC 里点断开参数确实保存了但飞控还在旧参数下运行这时候树莓派怎么连都连不上。所以改完参数一定要整机断电重启不是软重启是断电再上电。5.4 飞控在测试中不断重启这是我见过的最危险的坑。树莓派和飞控同时由一个 5V BEC 供电电机功率一上来电压被拉低飞控就重启了。解决办法是分开供电飞控用独立的 BEC 供电树莓派用独立的 5V 电源两者只通过信号线共地。不要为了少一根线把两个电源并在一起这不是偷懒的地方。如果你实在只有一个电源就必须加一个大电容或者用带足够余量的 BEC。很多 30A 以上的电调内置 BEC 输出标称 5V 3A看起来够用但低速堵转或者舵机猛打的时候瞬时电流可以拉到很大飞控对这种电压跌落非常敏感。树莓派也有同样问题它比飞控更挑电电压稍微低一点就直接重启或者 SD 卡报错。5.5 最终排查速查表现象大概率原因处理方向/dev/ttyACM0 不存在USB 线、驱动换数据线查 dmesgserial0 不存在串口没开启检查 config.txtMAVProxy 报错波特率不一致两端参数核对有数据但解析不出系统 console 占用去掉 consoleserial0飞控重启供电不足独立供电通信时好时坏线材干扰或接触不良换屏蔽线、重新压线有连接但无法解锁飞控预解锁检查不通过看 QGC 报错信息逐个排除如果你已经照着上面这些步骤走完应该能在树莓派上看到飞控的心跳数据了。我个人在实际操作中的体会是树莓派连接 Pixhawk 这件事真正的难点从来不是哪条命令记不住而是从不稳定的链路里找出问题所在。所以第一次动手别着急往机架上装先在桌面上把 USB 链路、UART 链路都调通再考虑往真机上搬。最后再分享一个小技巧装机之后给树莓派和飞控之间留一点间距别叠得太紧。飞控上的 IMU 对震动和磁场敏感树莓派的 SD 卡读写、风扇电机会带来额外干扰两者靠得太近容易让飞控解锁时报警。分开布置再加一层减震泡沫能省掉很多后续排查时间。这个方案还能怎么扩展等你跑通 MAVLink就可以继续加数传模块、加摄像头、接 ROS一步步把它做成真正的机载大脑。