ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

树莓派连接Pixhawk飞控:串口配置与MAVLink通信实战

树莓派连接Pixhawk飞控:串口配置与MAVLink通信实战 树莓派连接Pixhawk飞控这个组合在无人机圈子里算是经典搭配了。最近后台好几个人问我说飞控和树莓派之间到底怎么接、怎么配、怎么才能让数据真正跑起来。其实这事本身不复杂但坑不少——串口配置、电平匹配、TX/RX交叉、飞控参数设置哪一步没弄对结果就是心跳包收不到、地面站连不上折腾一晚上最后发现是线接反了。这篇就把我从硬件选型到软件配置再到实测通信的完整过程写出来每一步都会解释为什么这么做方便你照着操作也能真正理解背后的原理。这套组合能做的事非常多。树莓派作为机载计算机可以接摄像头做视觉识别可以跑Python脚本做任务控制可以接4G/数传模块把无人机状态远程传回地面站还能在上面跑MAVSDK或者ROS2做更复杂的自主飞行逻辑。Pixhawk负责底层姿态控制和飞行稳定树莓派负责需要算力的上层任务两个配合起来就是一台面向开发的无人机原型机。这篇文章适合手里有Pixhawk级飞控、想给它加个“大脑”的开发者也适合刚入门无人机开发、想搞清机载电脑和飞控之间通信原理的新手。1. 树莓派与Pixhawk为什么这对组合值得折腾1.1 这套组合能做什么先说说把树莓派接到Pixhawk上到底能解锁哪些玩法这决定了你后面配置的方向。最基础的应用是当数传中继。飞控自带的遥控器图传距离有限但把树莓派接上去通过WiFi或者4G模块就能实现超远距离的上下行通信。我在户外测试时地面站用一台普通笔记本连树莓派的WiFi热点稳定跑过两三公里这是原厂数传很难做到的。再往上走就是机载计算。Pixhawk那颗STM32芯片用来跑姿态解算和控制算法没问题但你要让它做视觉避障、目标识别、实时路径规划就力不从心了。树莓派这边装好OpenCV和MAVSDK从摄像头读画面、跑模型、再把控制指令通过MAVLink协议发给飞控执行整个流程非常流畅。我之前做过一个简单的“线跟着小车”原型就是树莓派识别地面线条方向通过MAVLink的SET_POSITION_TARGET_LOCAL_NED指令控制无人机跟随效果还不错。第三个用途是传感器融合与数据记录。树莓派可以挂Lidar、RTK模块、工业相机这些外设把数据打上时间戳存到SD卡里后期做SLAM建图或者飞行回放分析。Pixhawk原生的日志存储容量有限长时间飞行记录高频数据很容易写满树莓派作为外置记录仪就没有这个烦恼。最后是开发调试层面的便利。树莓派上可以直接跑MAVProxy或者QGroundControl接一块小屏幕就能当便携地面站用配合SSH你在电脑上就能远程改飞控参数、查看实时状态、烧录固件不用每次拔线连电脑。1.2 硬件选型与准备工作硬件选型方面先说树莓派。树莓派4B是性价比最高的选择2GB版本跑MAVProxy加摄像头推流都够用4GB或8GB版本如果你要跑YOLO这种轻量视觉模型会更从容。树莓派3B也能用但GPIO串口和USB同时工作时的性能会有点吃紧。树莓派5我在PX4固件的飞控上试过性能没问题但要注意它的GPIO串口设备名和旧款略有差异后面会单独讲。飞控这边任何能刷ArduPilot或PX4固件的Pixhawk系列都可以我用的是Pixhawk 4另外在朋友的Cube Orange上也验证过同样的接法。关键是要搞清楚你飞控的TELEM口支持什么电平。绝大多数Pixhawk系飞控的TELEM口是3.3V UART电平和树莓派GPIO的3.3V电平是兼容的可以直接连。但部分早期飞控或者带5V电平的扩展板需要做电平转换稳妥起见最好查一下硬件的原理图。准备材料清单给你列一下树莓派4B/3B含SD卡、电源我建议用5V/3A的官方电源后面说为什么Pixhawk系飞控含对应固件本文以ArduPilot 4.3为例杜邦线母对母若干或者直接买一块JST-GH 4pin转杜邦的转接线板大概十几块钱比手工焊接省事很多USB-TTL转接模块可选调试备用电烙铁和热缩管如果你打算把线做成正式接头而不是就用杜邦线裸奔提示别用那种劣质杜邦线接串口无人机飞行时震动大接触不良会造成通信中断。我后来是买了一块转接板把飞控的JST-GH插座转成带锁扣的杜邦母座稳定很多。2. 连线前的底层原理串口、电平、MAVLink2.1 串口通信与TX/RX交叉原理树莓派和Pixhawk之间最常用的通信方式不是USB而是UART串口。用串口的好处有几个占用的IO资源少GPIO口同时还能控制舵机、读取传感器适合长时间稳定运行出问题后排查链路也简单。USB连接虽然即插即用更省事但飞控固件升级、设备枚举出错时不如串口来得直接可控。串口通信的核心是一个“发”和一个“收”。树莓派的GPIO 14是TX发送GPIO 15是RX接收。飞控的TELEM口也有自己的TX和RX。这里最容易踩的坑就是交叉连接树的TX接飞的RX树的RX接飞的TX然后地线互相连起来。你如果把两边TX对TX、RX对RX接上数据就全堵在路上了开始端各自等着接收谁都发不出去。为什么必须共地因为串口信号的电平是相对参考点来读的树莓派发3.3V高电平飞控要判断这个信号是0还是1参照的就是两边共同的GND。如果两边地线没连参考点漂移收到的数据十有八九是乱码甚至完全没反应。共地这个细节我见过太多人忽略结果排查半天发现地线没接。真正的通信内容走的是MAVLink协议。MAVLink是无人机领域的事实标准协议特点是每个数据包都很小采用消息ID和分组的方式可以理解为“无人机的TCP/IP”——只不过它更多是轻量化的直接用二进制帧结构封装飞行姿态、GPS坐标、飞行模式这些数据。树莓派上的程序通过串口读取MAVLink包、解析字段就能知道飞控当前的各种状态反过来也可以向飞控发送MAVLink指令让它执行动作这就是整个系统通信的底层机制。2.2 电平匹配与供电方案电平匹配是很多人忽略但其实很容易出问题的地方。树莓派GPIO是3.3V逻辑绝大多数Pixhawk飞控的TELEM口也是3.3V逻辑两者直连没问题。但如果你用的飞控板子设计上没有做电平转换、直接暴露5V逻辑这在一些兼容板、或者自己接的串口扩展上常见那么树莓派的3.3V信号给它发数据没问题但飞控的5V信号回传到树莓派GPIO上就可能烧IO口。怎么判断翻硬件原理图或者说明书去官方仓库搜“TELEM”看电平部分标识。如果你手头没有资料稳妥做法是在TX线路上串联一颗1kΩ左右的电阻做限流保护或者用一颗电平转换模块双向转换也就十几块钱坏了也不心疼树莓派。供电这块更需要仔细。树莓派和飞控各用各的电源是原则至少不要让树莓派的5V直接灌到飞控的5V引脚上。我给树莓派用的是独立5V/3A电源飞控由动力电池的BEC或者单独BEC供电两者只共地、不共源。为什么因为飞控的电源来自动力电池的稳压模块电压波动大树莓派电源如果跟它共用容易被拉低或者受到开关噪声干扰轻则自媒体飘忽不定重则树莓派重启。还有一个细节TELEM口上通常有一根5V输出第1脚这个脚千万别接到树莓派任何引脚上。它本身是给外部数传模块供电用的接到树莓派上可能造成两边电源互灌异常发热甚至烧板。只接TXD、RXD、GND三根线就好。2.3 飞控端参数需要改什么飞控的TELEM口默认工作状态不一定适合连接树莓派。以ArduPilot固件为例假设你用的是TELEM2口需要在飞控参数里做如下设置通过Mission Planner或者QGC连接飞控后在参数列表里改SERIAL2_PROTOCOL 1 或 2其中1表示MAVLink12表示MAVLink2。一般建议用MAVLink2因为支持签名和更强的消息扩展SERIAL2_BAUD 57表示波特率57600如果是921就表示921600注意SERIAL2_BAUD这个参数的单位是“千波特率”所以57就是57600。波特率是通信速率两边必须设成一致否则收到的全是乱码。我通常用57600稳定可靠如果你后面传输数据量大改成921600也完全可以但两边要同步修改。PX4固件下的参数名会不一样大约是MAV_1_CONFIG、MAV_1_MODE、SER_TEL2_BAUD这种命名方式。核心思路是选一个空闲的UART口使能MAVLink协议设置和树莓派一致的波特率。具体参数名随着固件版本会变建议查阅对应版本的官方参数文档。3. 树莓派端一步步配置串口3.1 关闭系统串口登录占用树莓派默认情况下GPIO串口是被系统控制台登录占用的你必须先把它释放出来否则你插上飞控只能看到一堆启动日志轮不到你自己的程序收发数据。先用sudo raspi-config打开配置界面找到Interface Options进入Serial Port两个选项都选No然后重启。这一步做了两件事禁用串口作为登录控制台同时启用GPIO硬件串口功能。如果你懒得进菜单也可以直接改配置文件但raspi-config最直观不容易遗漏。重启后可以检查一下当前系统占用情况ls -l /dev/serial0正常情况下会显示一个软链接指向真正的串口设备。在树莓派3B/4B上通常是指向ttyAMA0PL011串口在树莓派5上可能是ttyAMA0或ttySCSI0以实际输出为准。如果你看到了ttyS0说明用的是mini UART那个时钟不稳定容易导致串口丢数据后面我细说。另外检查一下/boot/cmdline.txt文件里是否还写着consoleserial0之类的字样有的话要删掉否则系统还是会往串口打印日志。提示修改系统配置前先备份原文件。改错还能还原省得重装系统。3.2 启用GPIO硬件串口并排查冲突如果你用的是树莓派3B、3B、4BGPIO14/15这个硬件串口默认被蓝牙占用了——准确说蓝牙占用了PL011串口GPIO上退而求其次用的mini UARTttyS0。mini UART的波特率跟随核心时钟变化在树莓派上表现为负载高时串口通信容易出错这是很不推荐的。解决办法是在/boot/config.txt末尾加一行dtoverlaydisable-bt加上后重启蓝牙就被禁用GPIO14/15用的就是PL011这个高质量硬件串口。这条配置释放出来的串口确实稳我做长时间数据记录时没有掉包。如果你必须要用蓝牙也可以改成dtoverlayminiuart-bt把mini UART留给蓝牙、PL011留给GPIO但能不用蓝牙就不用稳定第一。树莓派4B还有个额外要点config.txt里要有enable_uart1这个参数在部分官方镜像里默认是1但如果你在兼容镜像上遇到串口完全没反应先检查这一项。树莓派5的情况稍微特殊它的GPIO串口设备名和旧版不同而且官方对串口的默认策略也有调整。如果你在5上遇到/dev/serial0指向不对、或者没有这个设备建议直接查树莓派5专用串口文档按最新的方式启用。总体流程跟4B类似但别生搬硬套。3.3 树莓派端与飞控端参数对照表两边配置完成之后你需要确保它们完全对得上。这是我常用的对照表配置项树莓派端飞控端ArduPilot通信接口/dev/ttyAMA0或/dev/serial0TELEM2口波特率57600SERIAL2_BAUD 57协议MAVLink2SERIAL2_PROTOCOL 2电平标准3.3V UARTTELEM口3.3V UART接线方式GPIO14(TX)接飞控RXGPIO15(RX)接飞控TXGND共地同左如果你用的是PX4固件表格里的飞控端参数就替换成前面说的MAV_1_*系列确保协议和波特率一致就行。两边有任何一个参数没对上后面测试都会出乱子所以这一步值得反复确认。4. 实际接线与通信测试4.1 接线对照表与操作细节接线这一步照表走就行但心态要细心。我用的是Pixhawk 4的TELEM2口它的引脚定义是第1脚5V不要接树莓派第2脚TXD飞控发送端接树莓派GPIO15/RX第3脚RXD飞控接收端接树莓派GPIO14/TX第4脚GND接树莓派GND比如GPIO 6或GPIO 9如果是TELEM1口定义类似但注意对应的飞控参数要改成SERIAL1_*系列。不同飞控板的JST-GH接口引脚序基本一致但保险起见核对一下你手头板子的引脚图。连接时避免飞控通电状态下插拔线缆规范的顺序是先把树莓派和飞控连线接好再上电。热插拔不仅可能造成通信异常极端情况还会损坏串口引脚。另外连线尽量保持短串口在长线上抗干扰能力弱超过20cm就有风险尤其在电机转动时干扰更明显。我自己的经验是杜邦线只是调试阶段用长期用建议做成固定线束用热缩管封好接头减少震动松脱的风险。无人机上任何一处连接都可能在飞行中被放大成事故。4.2 串口数据检查与心跳测试接线完成后先别急着跑地面站先用最简单的命令验证硬件链路通不通。在树莓派终端执行sudo apt install screen sudo screen /dev/ttyAMA0 57600如果一切正常你会看到一堆二进制乱码但注意观察这些乱码有没有规律MAVLink报文有固定的帧头0xFE或0xFD在乱码中会周期性出现特征字节。看到这个特征基本可以说明飞控在正常发送数据串口链路是通的。如果屏幕上一片空白可能是飞控没在给这个串口发数据如果全是均匀的、没有结构的乱码可能是波特率不匹配。按CtrlA然后按K退出screen。更严谨的测试是用Python直接读取串口数据。装上pyserial后运行下面这个小脚本sudo pip3 install pyserialimport serial import time ser serial.Serial(/dev/ttyAMA0, 57600, timeout1) start time.time() while time.time() - start 5: data ser.read(ser.in_waiting or 1) if data: print(data.hex()) ser.close()如果输出中出现类似fe开头的可变长度包或者是fd开头的MAVLink2包就说明通信链路已经打通。FE开头和FD开头都能接受代表MAVLink1或MAVLink2的帧头具体是哪种取决于你在飞控端设的协议。验证通过后这个命令窗口就可以关掉了。接下来用正式的工具建立数据链路。4.3 用MAVProxy建立树莓派端地面站链路MAVProxy是运行在Linux平台上的轻量级MAVLink地面站比QGroundControl更适合树莓派这种资源受限的设备。安装命令sudo apt update sudo apt install python3-dev libxml2-dev libxslt1-dev sudo pip3 install pymavlink MAVProxy然后启动MAVProxy连接串口mavproxy.py --master/dev/ttyAMA0 --baudrate 57600启动后如果看到类似Link 1 OK和心跳信息就说明链路通了。这时候你可以在MAVProxy命令行里敲命令status可以看到飞控的飞行模式、GPS状态、电池电压等实时信息。要手动解锁起飞可以输入arm throttle但建议先在没有桨叶的状态下测试确保一切正常再装桨。MAVProxy还有很多实用子命令比如module load console可以打开一个简易图形界面module load map可以加载地图显示飞机位置。如果你打算在树莓派上跑一个简单的地面站MAVProxy是很不错的选择。5. 从串口到Python控制让树莓派真正“读懂”飞控5.1 用pymavlink读取飞控状态链路通了以后下一步就是让树莓派上的程序能主动和飞控对话。pymavlink是最常用的Python库它帮你完成了MAVLink协议的编解码工作你只需要写几行代码就能拿到飞控数据。from pymavlink import mavutil # 连接串口 master mavutil.mavlink_connection(/dev/ttyAMA0, baud57600) # 等待飞控发送心跳包 print(等待心跳包...) master.wait_heartbeat() print(已连接飞控系统ID:, master.target_system, 组件ID:, master.target_component) # 请求数据流频率10Hz master.mav.request_data_stream_send( master.target_system, master.target_component, mavutil.mavlink.MAV_DATA_STREAM_ALL, 10, 1 ) # 持续读取并打印GPS状态 while True: msg master.recv_match(typeGLOBAL_POSITION_INT, blockingTrue) if msg: print(f纬度: {msg.lat / 1e7}, 经度: {msg.lon / 1e7}, 相对高度: {msg.relative_alt / 1000:.2f}m)这段代码的关键在于wait_heartbeat()它不但验证了链路还拿到了飞控的系统ID和组件ID这两个ID是后续发送指令必须使用的。如果要发送控制指令比如切换飞行模式到“Loiter”悬停master.set_mode_apm(LOITER)或者直接发送自定义MAVLink指令比如设置目标位置。这些操作在开发自主飞行任务时非常常用树莓派相当于一个“会写代码的遥控器”你可以把复杂的任务逻辑全部放进Python脚本。5.2 树莓派做机载电脑的扩展场景链路稳定之后你可以把树莓派的能力真正发挥出来。这里说三个我实际跑过的方案。第一个是远程视频加数传整合。树莓派挂一个摄像头USB摄像头或者CSI接口的OV5647都行摄像头画面通过GStreamer推流MAVLink数据通过WiFi转发这样地面站既能看实时图传又能获取完整的飞行参数。我在地面站用QGC图传画面用VLC播放器拉流两个软件各干各的互不干扰。第二个是结合OpenCV做视觉任务。比如起降标签识别树莓派用ArUco码识别降落点坐标然后通过MAVLink把相对位置发送给飞控实现自动降落。这个方向是目前树莓派在无人机上最有价值的应用之一算力刚好够用而且Python生态成熟。第三个是远程维护。给树莓派装上SSH服务你人在家里就能登录飞机上的树莓派远程查看飞控日志、修改启动参数、甚至重启飞行程序。配合Todesk这类远程桌面工具还能在树莓派上直接操作图形界面的地面站软件调试体验和在现场差不多。5.3 摄像头接入与图传方案热词里提到的luvcview和OV5647都是树莓派摄像头相关的关键词。luvcview是一个轻量级的USB摄像头查看工具安装后一条命令就能看到画面sudo apt install luvcview luvcview -d /dev/video0 -i 640x480如果你用CSI接口的OV5647摄像头模块树莓派官方工具是libcamera树莓派5上更是彻底转向了libcamera体系。拍一张测试照片libcamera-still -o test.jpg拍完照片下一步是推流。我常用的方式是GStreamer加UDP推流画面延迟大概在200毫秒左右地面站看到的画面基本可用gst-launch-1.0 v4l2src device/dev/video0 ! videoconvert ! x264enc tunezerolatency bitrate1000 ! rtph264pay config-interval1 ! udpsink host192.168.1.100 port5000结合前面说的MAVLink链路画面和数据都在同一个WiFi链路里传输效果很好。注意带宽分配如果图传占满了WiFi带宽MAVLink数据可能会延迟。我先跑通数传、再开图传逐步增加负载这样排查问题的时候能区分是网络还是串口的问题。6. 高频踩坑记录与排查建议6.1 典型问题现象速查表这些是我在树莓派连接Pixhawk过程中实际遇到的高频问题整理成一个速查表现象可能原因解决办法screen里完全没数据飞控串口协议没开或TX/RX接反确认SERIAL2_PROTOCOL2检查TXD接RX、RXD接TX满屏乱码但没有帧头波特率不一致统一波特率重新核对SERIAL2_BAUD启动树莓派后飞控收到一堆垃圾数据串口被login shell占用执行raspi-config关闭串口登录连接时树莓派不断重启供电不足换独立5V/3A电源去掉TELEM的5V接线MAVProxy提示No link串口权限问题或设备名不对用sudo运行检查/dev/serial0是否正确蓝牙功能没了你加了disable-bt这是正常的若需蓝牙改用miniuart-bt方案数据偶尔丢包杜邦线接触不良或干扰换转接板缩短线长加磁环或用双绞线6.2 三个我最想强调的细节第一个细节树莓派启动瞬间如果GPIO串口上还残留系统启动日志这些数据会被飞控当成MAVLink消息处理。即使你已经用raspi-config关闭了串口登录某些镜像的固件更新、或者你手动改过config/user.txt都可能让启动阶段往串口吐东西。检查一下/boot/cmdline.txt确保没有consolettyAMA0或consoleserial0字样。这一步没做干净飞控可能频繁触发“unknow message”报错影响后续任务执行。第二个细节千万别用飞控的TELEM口5V电源给树莓派供电。TELEM口的5V通常是飞控板上电源模块直接输出的电流能力有限接树莓派这种动辄1A以上的设备电压会被拉低飞控自己的传感器也会工作异常。我见过有人为省一个电源把钱省出大麻烦——飞控和树莓派同时不稳定查问题查到怀疑人生。分开供电、共地是底线。第三个细节调试阶段先别上桨。我用树莓派控制飞控做自动起飞测试时第一遍就遇到了加速度计数据跳变如果当时带着桨大概率会出事。树莓派的高频信号、USB设备干扰都可能导致飞控传感器噪声变大。先把螺旋桨拆掉把树莓派放在远离IMU的位置做好屏蔽再实测否则你很难分清是软件问题还是硬件干扰。6.3 串口还是USB连接怎么选我看到不少人直接拿USB线把树莓派和飞控连起来简单是简单但我不推荐作为长期方案。原因有三第一USB连接时飞控枚举为/dev/ttyACM0它依赖USB驱动稳定而树莓派供电不稳时最先出问题的就是USB设备。串口直连则少一层USB协议稳定很多。第二USB口数量有限。树莓派4B一共四个USB口接摄像头、数传模块、U盘之后基本没剩多少串口连接则完全释放这些USB口。第三USB连接导致树莓派和飞控的电源地通过USB的屏蔽层连在一起更容易引入电源噪声飞控的IMU数据都可能受影响。所以我的建议是调试初期可以用USB快速验证正式装机用GPIO串口。两者切换时记得把飞控参数和树莓派程序里的端口名一起改掉我因为忘了改端口名白折腾过半小时。7. 总结我的实操心得树莓派连接Pixhawk这个项目真正做完之后你会发现90%的时间都花在排查“为什么没通”上而不是“怎么连”。我最开始以为买回来插上就能用结果卡在串口被登录占用这一步连了两天没通后来搞清楚了raspi-config和disable-bt的关系才顺利看到心跳包。串口这类底层通信出问题的时候不像Web开发那样有清晰的报错信息而是“没反应”“乱码”“断断续续”所以排查思路必须一步一步来先确认物理连接再确认协议参数最后才考虑软件配置。如果你按照这篇文章一步步走下来到最后看到MAVProxy里稳定的心跳输出说明你已经打通了机载电脑和飞控之间的大动脉。接下来无论是做视觉识别、自主飞行还是远程数传图传都有了可靠的基础。这个项目的延展空间很大一套配置搞定后后面加功能只是往这棵树上添枝叶而已。最后分享一个我的小习惯每次改动配置后在树莓派上把飞控的关键参数和当前配置文件都备份一份命名带上日期。调试到后面你可能会忘记哪些参数改过、哪些配置是能用的有备份就能随时回滚省下大量重复劳动。
返回列表