news 2026/10/6 3:47:28

树莓派与Pixhawk飞控串口连接教程:机载计算机链路搭建与排错指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派与Pixhawk飞控串口连接教程:机载计算机链路搭建与排错指南

前阵子帮朋友调试一台450级四轴,机架上除了Pixhawk飞控,还硬塞了一块树莓派4B。当时他一脸不解地问我:飞控不是已经能让飞机稳稳飞起来了吗,为什么还要在飞机上装一台小电脑?这个问题恰好是很多人第一次听到“机载计算机”时的共同疑惑。我花了一个下午把树莓派和Pixhawk的串口链路跑通,顺手把调试过程完整记录下来,整理成这篇教程。内容会覆盖硬件接线、系统配置、飞控侧参数、链路验证和排错经验,适合正在做无人机二次开发、毕设项目、ROS实验,或者单纯想把“遥控飞机”升级成“会思考的飞行平台”的朋友参考。

1. 为什么要把树莓派塞进无人机:机载计算机到底解决了什么

1.1 单靠飞控,撑不起“智能飞行”这件事

Pixhawk这类飞控的核心任务是什么?是姿态解算、位置估计、航线跟踪和电机控制。它跑得极其稳定,但也极其专一。拿常见的Pixhawk系列来说,内部是STM32F4或F7这类MCU,主频通常几百MHz,内存以MB为单位,所有计算资源都留给了状态估计和控制环。你让它稳定悬停没有问题,但让它同时处理实时视频流、运行目标检测模型、记录完整的传感器日志,就捉襟见肘了。

说白了,飞控管的是“我该用什么姿态飞到目标点”,但它不太擅长回答“目标点在哪里”“眼前是障碍物还是地面”这类感知和决策问题。而这些恰恰是树莓派擅长的。树莓派拥有独立的操作系统(Raspberry Pi OS、Ubuntu等),能跑Python、C++、OpenCV、ROS,甚至轻量级AI推理。把两者组合起来,飞控负责“稳”,树莓派负责“想”,分工就清楚了。

1.2 树莓派入机后,具体能承担哪些活

在实际项目中,树莓派作为机载计算机最常见的任务有这么几类:

  • 视觉处理:通过CSI或USB摄像头采集画面,在机载端运行视觉识别、二维码定位、目标跟踪等算法,再把结果实时反馈给飞控。
  • 数据记录和分析:比飞控自带的数据闪存记录更详细,可以在树莓派上保存完整飞行日志、摄像头画面同步数据,方便后期在桌面端回放和排故。
  • 机载通信路由:作为机载热点或4G模块连接端,把飞控的MAVLink数据转发给地面站,实现比直接数传更灵活、带宽更大的链路。
  • 任务规划与决策:例如设定条件触发的航点任务,或在飞行中根据传感器数据动态调整航线。这类逻辑放在飞控上会非常麻烦,放在树莓派上只需写一个Python脚本。

1.3 什么样的人真正需要树莓派上机

这里必须泼一盆冷水:不是所有无人机都需要树莓派。如果你只是航拍、穿越机暴力飞行,树莓派完全是累赘——额外的重量和功耗不说,散热、稳定性都是麻烦。但如果你在做以下事情,树莓派几乎是必须的:

  • 基于PX4、ArduPilot的飞控二次开发,需要跑仿真或机载算法;
  • 大创、挑战杯、毕业设计这类涉及视觉识别和自动飞行的项目;
  • 想学习ROS2、无人机自动控制联动,或者用机载摄像头做目标跟随;
  • 需要在高空中做长时间数据采集,尺寸小巧且生态成熟的树莓派是很合适的选择。

我的建议是:先把树莓派和飞控的连接链路在桌面上调通,再考虑装机。链路不通,算法再花哨也白搭。接下来的章节就按桌面调试的完整流程来走。

2. 硬件连线:不是所有串口都能直连,接错就烧

2.1 选对接口:TELEM1还是TELEM2,UART还是USB

大多数Pixhawk衍生板卡都会引出至少两个遥测串口,通常标记为TELEM1、TELEM2。这两个口在固件层默认输出的就是MAVLink协议数据,通信波特率可配置,非常适合直接对接数传模块或机载计算机。

至于选TELEM1还是TELEM2,主要看你的接线便利和默认参数。在PX4中,TELEM1默认波特率通常是57600,TELEM2默认波特率在不同版本里可能为921600或57600。ArduPilot里分别对应SERIAL1、SERIAL2。我的习惯是:优先接TELEM1,因为它的默认配置最“标准”,网上大多数教程和地面站也默认从TELEM1读取数据。

还有一个选择是用Pixhawk的USB口,通过USB线连到树莓派。这样做确实也能通信,但我不建议长期这样使用。一方面,USB枚举在震动环境下可能出现重连失败;另一方面,机载调试时USB口通常还要留给地面站和参数设置,被树莓派占了会很尴尬。反过来,用飞控串口直连树莓派,飞控USB口就空出来给QGroundControl使用,方便边调参边观察树莓派日志。对开发调试来说,这是更顺手的组合。

2.2 树莓派引脚与飞控的物理接法

树莓派的GPIO排针上,我们要用到的是一组硬件UART。以树莓派4B/3B为例,GPIO14是TXD(发送),GPIO15是RXD(接收)。Pixhawk的TELEM口一般有六个引脚,其中TX、RX、GND是核心三根。

接线的关键是“交叉”:

  • 树莓派GPIO14(TXD)-> Pixhawk TELEM1/2的RX
  • 树莓派GPIO15(RXD)-> Pixhawk TELEM1/2的TX
  • 树莓派GND -> Pixhawk的GND

有些飞控或转接板上会把TX/RX丝印印在正面,但实际线的颜色五花八门,千万不要只认颜色。我见过太多次因为把TX、RX同向直连,结果链路完全没反应的案例。最稳的办法是拿万用表蜂鸣档量一下插座的哪个脚是TX、哪个脚是RX,或者直接看说明书上的引脚定义。

2.3 供电与共地:最容易忽略的非技术坑

树莓派4B在满负荷运行时,电流轻轻松松超过1A,有时接近2A。而飞控板载的BEC或数传口引出的5V输出,通常是给接收机或小功率设备供电用的,电流余量很小。如果你试图用Pixhawk的5V引脚给树莓派供电,大概率会把飞控的电源部分拉垮,导致飞控在空中瞬间重启,这是非常危险的。

所以我的建议是:

  • 树莓派使用独立的5V供电,比如质量可靠的5V 3A降压模块、无人机动力电池取电经过稳压,或者单独的小电池组。
  • 只用三根信号线连接树莓派和飞控,绝对不要接飞控TELEM口的VCC引脚。如果转接线上带着VCC,用绝缘胶带包好。
  • 树莓派的GND和飞控的GND必须连通,这就是“共地”。没有共地,串口信号的电平参考不一致,数据收不到或乱码的概率很大。

电平匹配方面,Pixhawk的TELEM口和树莓派的GPIO都是3.3V TTL,直连没问题。但如果你的飞控是某个非标准板子,或者串口电平是5V的,那就必须先做电平转换再连,否则会损坏树莓派GPIO。这也是为什么我一直强调:接任何非标板子前,先查清楚电平再上手。

3. 树莓派侧配置:把串口从控制台手里抢回来

3.1 打开UART并禁用系统串口控制台

树莓派系统的默认行为是把GPIO14/15用作Linux控制台的一部分,也就是说你插上串口调试线能直接看到登录提示。但这个行为对我们来说完全是干扰。我们要让这两个引脚只传输UART数据,不被控制台信息占满。

推荐用一条命令打开配置界面:

sudo raspi-config

依次进入 Interface Options -> Serial Port,然后按下面选择:

  • 是否允许登录 shell 访问串口:否
  • 是否启用串口硬件:是

完成后重启系统。如果不想用界面,也可以手动改配置文件。在较老的Raspberry Pi OS中,启动配置在/boot/config.txt,新版系统可能在/boot/firmware/config.txt;同时确保/boot/cmdline.txt里没有console=serial0,115200这类参数。我建议在config.txt末尾加上:

enable_uart=1 dtoverlay=disable-bt

enable_uart=1是打开GPIO串口的总开关;dtoverlay=disable-bt则是把本来可能分配给蓝牙的PL011 UART释放给GPIO串口。如果你还需要蓝牙功能,可以改用dtoverlay=miniuart-bt,但mini UART稳定性稍差,对飞行器这种讲究可靠性的场景不太友好。改完后执行sudo reboot。

3.2 设备名:ttyAMA0、ttyS0和serial0的区别

树莓派重启后,你需要知道GPIO串口在系统中叫什么。这里有个多年不变的坑:不同型号、不同配置下,串口设备名不一样。

常见情况如下:

  • 树莓派3B、4B启用 disable-bt 后,GPIO14/15对应的串口通常是/dev/ttyAMA0;
  • 如果不使用 disable-bt,GPIO串口可能变成/dev/ttyS0,速度不够稳定;
  • 树莓派5 上机制又有变化,但系统依然会提供一个软链接/dev/serial0,指向实际的GPIO串口。

最保险的做法是在代码和命令行里都使用软链接/dev/serial0。它始终指向当前GPIO串口对应的真实设备,不用去纠结ttyAMA0还是ttyS0。验证软链接是否存在:

ls -l /dev/serial0

如果能看到类似serial0 -> ttyAMA0的输出,说明配置已经生效。如果看不到,大概率是enable_uart=1没生效,或者没有重启。

3.3 给当前用户加入串口访问权限

另一个高频问题是权限不足。Linux默认情况下,普通用户无法直接操作串口设备,报错通常是Permission denied。解决办法是把你的用户加入dialout组:

sudo usermod -aG dialout $USER

执行完后必须重新登录一次,组权限才会生效。如果不想重新登录,也可以用newgrp dialout临时切换,但重新登录最干净。

在接线这一步之后,我强烈建议先做一个串口回环测试:临时用一根杜邦线把树莓派的GPIO14和GPIO15短接,然后在终端执行:

stty -F /dev/serial0 115200 echo "hello" > /dev/serial0

如果回环线路正常,你再用cat /dev/serial0应该能看到hello被自己发送并接收回来。这个测试能快速证明树莓派串口本身是好的,排除系统配置问题。测完记得拆掉那根短路线,再连飞控。

4. 飞控侧参数与MAVLink链路验证

4.1 Pixhawk端参数修改:PX4与ArduPilot的差异

树莓派已经把串口“准备好的同时,飞控端也得把对应串口设置成MAVLink输出模式。这里先说PX4。用USB线连接飞控和电脑,打开QGroundControl,进入参数表,找到SER_TEL1_BAUD和SER_TEL2_BAUD。根据你的实际接线,把对应串口的波特率设成与树莓派侧一致。例如我使用TELEM1,就把SER_TEL1_BAUD设置为57600。如果树莓派侧设置的是921600,这里也要对应改成921600,两边必须完全一致。

如果你用的是ArduPilot固件,习惯上会打开Mission Planner,在全部参数表里找到SERIAL1_PROTOCOL和SERIAL1_BAUD。SERIAL1_PROTOCOL要设为1,即MAVLink2;SERIAL1_BAUD的写法很特殊,波特率用两位或三位数字缩写:57表示57600,115表示115200,921表示921600。每次修改完参数,飞控需要重启才生效。

下面这个表格帮你快速对照:

固件串口参数名波特率写法协议选择
PX4SER_TEL1_BAUD / SER_TEL2_BAUD直接填数字,如57600默认启用,无需改协议
ArduPilotSERIAL1_BAUD / SERIAL2_BAUD57=57600,115=115200,921=921600SERIAL1_PROTOCOL=1

4.2 三条命令完成链路自检

飞控参数设置完成并重启之后,先不要急着跑高级地面站程序。先用最简单的工具确认数据是否真的到达树莓派。我习惯用minicom,一个测试串口的经典工具。安装并打开:

sudo apt install minicom minicom -D /dev/serial0 -b 57600

如果链路正常,你会看到屏幕上出现无法直接阅读的乱码。这些乱码正是MAVLink的二进制数据被当作文本显示的结果,看到它们反而应该高兴,说明飞控在往外吐数据。

如果觉得乱码不够直观,可以退出minicom,用xxd查看原始字节流:

sudo cat /dev/serial0 | xxd | head

在输出里,你可能会看到fd 00或55 8c这类有规律的头。MAVLink2的帧开头是0xFD,MAVLink1的帧开头是0x55或0xFE。看到这些特征字节,基本可断定链路已经通了。

4.3 让数据流动起来:MAVProxy初步跑通

验证了底层串口有数据,接下来就该让MAVLink协议栈接管串口。MAVProxy是PX4社区常用的一条轻量级地面站工具,用Python写的,非常适合在树莓派上运行。安装在树莓派上执行:

sudo apt install python3-pip screen pip3 install --user mavproxy

启动时指定串口设备、波特率,并把数据转发到UDP端口供局域网地面站使用:

~/.local/bin/mavproxy.py --master=/dev/serial0,57600 --out=udp:0.0.0.0:14550

看到GCS: heartbeat received这类日志,说明MAVProxy已经收到飞控的MAVLink心跳包。整个树莓派到Pixhawk的链路就正式打通了。从这一步开始,QGroundControl或Mission Planner可以通过树莓派的IP地址连接UDP端口,把树莓派当作一个数传中转站。

5. 进阶组合:摄像头、ROS 2与机载调试

5.1 摄像头接入:CSI是优先选择,USB也别嫌弃

链路打通之后,大多数人会立刻想到给飞机加眼睛。树莓派的摄像头方案主要分两种:CSI摄像头和UVC免驱摄像头。CSI摄像头通过排线直接连接树莓派主板,带宽高、延迟低,在机载视觉场景中比USB摄像头稳定。以常见的OV5647摄像头为例,在树莓派标准的系统里,执行:

libcamera-hello --list-cameras

如果能看到摄像头型号,说明驱动已经加载成功。老系统中常用的命令是raspistill,但新版Raspberry Pi OS倾向于libcamera工具链。

USB摄像头则简单粗暴得多。几乎任何免驱摄像头插上就能被识别为/dev/video0。热词里有人提到luvcview,这确实是个轻量UVC显示工具:

sudo apt install luvcview luvcview -d /dev/video0 -s 640x480 -f MJPEG

能够看到实时画面,摄像头这块就完成了。机载场景中,到底是CSI还是USB看需求:如果跑OpenCV图像算法、做视觉定位,CSI更合适;如果只是临时调试、换个摄像头再试,USB免驱方案更省心。

5.2 机载端MAVLink路由与ROS 2

树莓派上只跑MAVProxy也能用,但做ROS2开发的人通常想要更顺畅的数据集成。这里提两条路线。

第一条是使用MAVROS,ROS 2环境下安装后这样连接飞控:

ros2 run mavros mavros_node --ros-args -p fcu_url:=/dev/serial0:57600

MAVROS会把MAVLink消息转换成ROS2话题,订阅和发布都变得非常直观。

第二条是PX4新版本推荐的Micro XRCE-DDS方案。在PX4参数表里,把UXRCE_DDS_CFG设置成对应的串口(例如TELEM1),波特率与树莓派侧保持一致;树莓派上运行Micro XRCE-DDS Agent,即可在ROS2中直接获得飞控原生话题,中间少一层MAVLink转换,实时性和开发体验都更好。这类话题适合已经对PX4和ROS2都熟悉的读者进一步尝试。

飞控的遥测遥控机制和ROS2的组网机制各有各的优势,不要把两者混为一谈。简单项目用MAVProxy或QGC就够了,复杂项目才需要考虑ROS2这套完整体系。树莓派作为机载计算机的强项就在于:它能根据项目复杂度灵活切换这些方案,而不需要你换硬件主板。

5.3 远程调试的临时方案

装机阶段没有屏幕,怎么连树莓派调参?我的经验是:让树莓派连接手机上开出来的热点,然后用同一局域网里的电脑SSH过去。Raspberry Pi OS可以通过nmcli快速配置WiFi:

sudo nmcli dev wifi connect "你的热点名称" password "你的热点密码"

ifconfig或hostname -I查看树莓派IP地址后:

ssh pi@192.168.1.100

如果热点隔离了客户端之间的通信,手机热点可能连不上SSH,那就退而求其次用网线直连树莓派和电脑,再手动配置静态IP。对树莓派5和Ubuntu系统用户,注意有些系统的默认用户名不是pi,用镜像烧录工具设置的用户名登录即可。

远程调试时,我习惯把MAVProxy或Micro XRCE-DDS Agent放进systemd服务里,让它们在树莓派开机时自动运行,断线自动重启。树莓派在机载环境下经常会因为供电波动或测试时被硬拔电源,能自动恢复的服务才是好服务。

6. 排错实录:连接过程中我踩过的五个坑

6.1 树莓派端完全收不到飞控数据

表现:cat /dev/serial0和xxd完全是空的,没有任何字节进入。

排查路径:先确认树莓派串口是否已配置好,执行ls -l /dev/serial0。如果软链接不存在,说明enable_uart=1可能没写对地方,或者没重启。然后用上节说的回环测试判断串口硬件是否正常:短接GPIO14和GPIO15,用echo和cat测试。回环通了,问题八成在飞控侧或接线。检查飞控参数,确认SER_TEL1_BAUD没有被设成-或禁用,确认波特率两边一致。还要检查TX/RX有没有接反,这个是最低级的错误但出现频率极高。

6.2 收到数据但全是乱码

表现:minicom里有大量字符,但完全读不出协议,地面站也连不上。

排查思路:乱码通常意味着数据在流动,问题集中在波特率不匹配或MAVLink版本异常。先核对树莓派侧和飞控侧的波特率是否完全一致。如果树莓派设57600、飞控设921600,看起来都在“发数据”,但接收方完全无法识别。还有一个容易被忽略的情况:飞控串口被复用为调试口或者控制台,输出的不是MAVLink二进制,而是一堆文本日志。这时候要去飞控参数里确认没有其他协议抢占这个串口,ArduPilot尤其注意SERIALx_PROTOCOL是否正确设为1。

6.3 一启动MAVProxy树莓派就重启或卡死

表现:跑串口程序没多久,树莓派自动关机或界面卡死。

这个坑多数是电源问题。树莓派4B的稳压电路对输入电压和电流极其敏感,启动MAVProxy时CPU负载升高,电流需求陡增。如果供电不足,电压跌到门槛以下,树莓派直接reset。解决办法是换一个输出5V/3A以上的独立降压模块给它供电,别和飞控、舵机共用一路电源。同时排查有没有USB设备引发过流保护,例如摄像头或4G模块插在树莓派上时,供电余量要求更高。

6.4 飞控USB口和串口同时工作异常

表现:树莓派串口联通了,但电脑上的QGroundControl通过USB连飞控时经常掉线。

这是因为部分飞控在串口和USB的DMA缓冲处理上存在冲突,特别是PX4把串口波特率设到很高时,主控负载明显上升。解决思路很简单:调试阶段,树莓派连接用的波特率保持在57600,不要盲目追求921600;USB掉线时还可以试试换一根高质量USB线,排除线材屏蔽问题。机载场景中,真正高带宽需求时再去考虑921600或DDS方案,而不是平时一直顶着高波特率跑。

6.5 树莓派型号不同导致的“玄学”问题

表现:同一个SD卡在树莓派4B上串口一切正常,临时换到树莓派3B开机后怎么都连不上飞控。

归根结底是串口设备映射和内核默认配置不同。树莓派3B上GPIO串口默认可能是/dev/ttyS0,而树莓派4B上dtoverlay=disable-bt之后是/dev/ttyAMA0。如果代码里硬编码了设备名,一旦换设备就崩。这也是我在前面反复建议统一使用/dev/serial0软链接的原因。另外,不同树莓派型号对config.txt里某些过时参数(比如core_freq=250)的处理也不一样,遇到莫名其妙的串口错乱,优先检查配置文件里有没有从老教程抄来的多余参数。

排错的本质,其实是在“硬件接线”“系统配置”“协议参数”三个层面里逐个做隔离验证。不要一上来就怀疑MAVProxy或飞控固件。先用回环测试确认串口本身没问题,再用xxd确认是否有原始字节流入,最后才上升到MAVLink协议和地面站。按这个顺序排查,绝大多数问题都能在十分钟内定位。

现在再回头看最开始朋友那个问题:飞控已经能飞了,为什么还要塞一台树莓派?其实答案很简单——飞控负责让飞机稳定地飞,树莓派负责让飞机知道该往哪飞、为什么飞。串口链路就是这两者之间唯一的对话通道。把这条通道调试顺畅了,后面无论是接摄像头做视觉跟随,还是接ROS2跑自动导航,都会顺手很多。我自己的习惯是把这条串口的参数、接线图、回环测试方法做成一张小抄贴在调试工位上,每次换设备装机都按同一套流程走一遍,省下来的排查时间远超过制作小抄花掉的时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 3:46:58

WebSocket如何配置wss访问?nginx反向代理、证书与心跳全解析

简介:这是一份面向Java后端开发者的Spring Boot WebSocket安全通信示例资源,适合已掌握Spring Boot基本用法、希望在生产环境启用wss安全连接的工程师学习参考。资源基于Spring Boot 2.1,涵盖SSL/TLS加密原理、依赖引入、证书导入、内嵌Tomca…

作者头像 李华
网站建设 2026/10/6 3:46:54

慢SQL优化实战:大量数据排序的索引设计与延迟关联

慢SQL里的“大量数据排序”,我接下来说的事情,应该是很多后端同学都踩过的坑。它表面上看是数据库慢查询,实际上背后牵涉到索引设计、缓存利用、SQL改写甚至业务逻辑取舍。这篇文章,我想从一次真实的生产事故开始讲起,…

作者头像 李华
网站建设 2026/10/6 3:46:34

Navicat Premium 11 免安装版技术解析与老旧数据库兼容实践

简介:本资源为Navicat Premium 11的绿色免安装破解版本,面向数据库开发人员、运维工程师及学习SQL管理工具的初学者,解决正版软件安装繁琐、注册激活门槛高、跨设备临时使用不便等实际痛点。压缩包为RAR格式,大小38.3MB&#xff0…

作者头像 李华
网站建设 2026/10/6 3:46:34

高性能评论盖楼系统架构设计:从数据模型到缓存策略的实战拆解

做评论系统做了好几轮,从最早单库单表撑几千条评论的小社区,到后来峰值 QPS 几万、单条爆款内容能盖几万楼的内容平台,这个“评论盖楼”系统算是我踩坑最多、也收获最大的一套架构设计。这些年关于评论系统的架构方案网上讨论很多&#xff0c…

作者头像 李华
网站建设 2026/10/6 3:46:16

HTML语义化+CSS响应式:打造可访问的家乡主题网页

简介:这是一份面向网页设计初学者与教学实践者的HTMLCSS主题模板资源,聚焦“我的家乡”地域文化展示场景,解决个性化静态网页快速搭建与代码规范实践问题。压缩包共73个文件,包含6个HTML页面(如index.html、lishi.html…

作者头像 李华
网站建设 2026/10/6 3:46:15

微信群自动群发实现指南:从定时通知到企业微信Webhook合规实践

不知道你有没有被拉进过那种“物业通知群”或者“项目进度同步群”,每天到点就弹出一条格式几乎一样的信息。我身边不少人问过我:这种“每天在固定时间往固定微信群自动发一条消息”到底是怎么实现的?能不能写个脚本帮我搞定?先说…

作者头像 李华