首页 / 资讯中心 / 文章详情

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

树莓派与Pixhawk飞控串口连接教程:机载计算机链路搭建与排错指南 ★ FEATURED ARTICLE
前阵子帮朋友调试一台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还是TELEM2UART还是USB大多数Pixhawk衍生板卡都会引出至少两个遥测串口通常标记为TELEM1、TELEM2。这两个口在固件层默认输出的就是MAVLink协议数据通信波特率可配置非常适合直接对接数传模块或机载计算机。至于选TELEM1还是TELEM2主要看你的接线便利和默认参数。在PX4中TELEM1默认波特率通常是57600TELEM2默认波特率在不同版本里可能为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是核心三根。接线的关键是“交叉”树莓派GPIO14TXD- Pixhawk TELEM1/2的RX树莓派GPIO15RXD- 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里没有consoleserial0,115200这类参数。我建议在config.txt末尾加上enable_uart1 dtoverlaydisable-btenable_uart1是打开GPIO串口的总开关dtoverlaydisable-bt则是把本来可能分配给蓝牙的PL011 UART释放给GPIO串口。如果你还需要蓝牙功能可以改用dtoverlayminiuart-bt但mini UART稳定性稍差对飞行器这种讲究可靠性的场景不太友好。改完后执行sudo reboot。3.2 设备名ttyAMA0、ttyS0和serial0的区别树莓派重启后你需要知道GPIO串口在系统中叫什么。这里有个多年不变的坑不同型号、不同配置下串口设备名不一样。常见情况如下树莓派3B、4B启用 disable-bt 后GPIO14/15对应的串口通常是/dev/ttyAMA0如果不使用 disable-btGPIO串口可能变成/dev/ttyS0速度不够稳定树莓派5 上机制又有变化但系统依然会提供一个软链接/dev/serial0指向实际的GPIO串口。最保险的做法是在代码和命令行里都使用软链接/dev/serial0。它始终指向当前GPIO串口对应的真实设备不用去纠结ttyAMA0还是ttyS0。验证软链接是否存在ls -l /dev/serial0如果能看到类似serial0 - ttyAMA0的输出说明配置已经生效。如果看不到大概率是enable_uart1没生效或者没有重启。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即MAVLink2SERIAL1_BAUD的写法很特殊波特率用两位或三位数字缩写57表示57600115表示115200921表示921600。每次修改完参数飞控需要重启才生效。下面这个表格帮你快速对照固件串口参数名波特率写法协议选择PX4SER_TEL1_BAUD / SER_TEL2_BAUD直接填数字如57600默认启用无需改协议ArduPilotSERIAL1_BAUD / SERIAL2_BAUD5757600115115200921921600SERIAL1_PROTOCOL14.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的帧开头是0xFDMAVLink1的帧开头是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 --outudp: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开发的人通常想要更顺畅的数据集成。这里提两条路线。第一条是使用MAVROSROS 2环境下安装后这样连接飞控ros2 run mavros mavros_node --ros-args -p fcu_url:/dev/serial0:57600MAVROS会把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快速配置WiFisudo nmcli dev wifi connect 你的热点名称 password 你的热点密码ifconfig或hostname -I查看树莓派IP地址后ssh pi192.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_uart1可能没写对地方或者没重启。然后用上节说的回环测试判断串口硬件是否正常短接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不要盲目追求921600USB掉线时还可以试试换一根高质量USB线排除线材屏蔽问题。机载场景中真正高带宽需求时再去考虑921600或DDS方案而不是平时一直顶着高波特率跑。6.5 树莓派型号不同导致的“玄学”问题表现同一个SD卡在树莓派4B上串口一切正常临时换到树莓派3B开机后怎么都连不上飞控。归根结底是串口设备映射和内核默认配置不同。树莓派3B上GPIO串口默认可能是/dev/ttyS0而树莓派4B上dtoverlaydisable-bt之后是/dev/ttyAMA0。如果代码里硬编码了设备名一旦换设备就崩。这也是我在前面反复建议统一使用/dev/serial0软链接的原因。另外不同树莓派型号对config.txt里某些过时参数比如core_freq250的处理也不一样遇到莫名其妙的串口错乱优先检查配置文件里有没有从老教程抄来的多余参数。排错的本质其实是在“硬件接线”“系统配置”“协议参数”三个层面里逐个做隔离验证。不要一上来就怀疑MAVProxy或飞控固件。先用回环测试确认串口本身没问题再用xxd确认是否有原始字节流入最后才上升到MAVLink协议和地面站。按这个顺序排查绝大多数问题都能在十分钟内定位。现在再回头看最开始朋友那个问题飞控已经能飞了为什么还要塞一台树莓派其实答案很简单——飞控负责让飞机稳定地飞树莓派负责让飞机知道该往哪飞、为什么飞。串口链路就是这两者之间唯一的对话通道。把这条通道调试顺畅了后面无论是接摄像头做视觉跟随还是接ROS2跑自动导航都会顺手很多。我自己的习惯是把这条串口的参数、接线图、回环测试方法做成一张小抄贴在调试工位上每次换设备装机都按同一套流程走一遍省下来的排查时间远超过制作小抄花掉的时间。
阅读完成 · 觉得有帮助?
咨询建站