1. 硬件准备与接线指南
第一次接触PX4飞控和边缘计算设备通信时,最让人头疼的就是硬件接线。我清楚地记得自己第一次尝试连接Pixhawk和Jetson Nano时,因为接错线导致整个下午都在排查故障。下面我就把踩过的坑和经验总结给你。
核心原则就三点:交叉连接、共地处理、电源隔离。以最常见的CH340串口模块为例,具体接线方式如下:
- TXD-RX交叉连接:模块的TXD引脚接飞控的RX,模块的RXD接飞控的TX。这个反接逻辑新手特别容易搞错,记住"发对收、收对发"的口诀。
- GND必须连接:两边的地线一定要接在一起,否则会出现信号干扰。我曾遇到过不共地导致数据包丢失率高达30%的情况。
- VCC悬空处理:飞控和模块最好各自独立供电。Pixhawk的TELEM2接口虽然有5V输出,但建议只用作信号传输。
Pixhawk 2.4.8的TELEM2接口引脚定义如下表:
| 引脚编号 | 信号 | 电压 | 功能说明 |
|---|---|---|---|
| 1 | VCC | +5V | 供电输出(最大500mA) |
| 2 | TX | 3.3V | 数据发送(接外设RX) |
| 3 | RX | 3.3V | 数据接收(接外设TX) |
| 4 | CTS | 3.3V | 流控信号(通常不用) |
| 5 | RTS | 3.3V | 流控信号(通常不用) |
| 6 | GND | GND | 公共地 |
实际接线时推荐使用1.25mm转杜邦2.54mm的6P端子线,这种转接线在淘宝上10块钱能买一包。记得给接口做好防松脱处理,无人机震动环境下接头容易松动。
2. 串口驱动安装与配置
驱动问题绝对是Linux系统下最让人崩溃的环节。不同版本的Ubuntu对CH340/CH341芯片的支持差异很大,我在Ubuntu 18.04、20.04和22.04上都实测过,总结出这套通用安装方案。
首先插上USB转串口模块,在终端执行:
lsusb正常应该能看到类似"1a86:7523 QinHeng Electronics HL-340"的设备信息。如果没显示,可能是硬件接触问题。
驱动安装分三种情况:
情况一:系统自带驱动
sudo apt install brltty # 先安装这个可能冲突的包 sudo apt remove brltty # 再立即卸载它这个神奇操作能解决90%的驱动识别问题,原理是触发系统自动加载正确驱动。
情况二:需要手动编译
wget http://www.wch.cn/downloads/CH341SER_LINUX_ZIP.html unzip CH341SER_LINUX.ZIP cd CH341SER_LINUX/driver make sudo make install sudo modprobe ch341编译时如果报错,可能是缺少内核头文件,需要先执行:
sudo apt install linux-headers-$(uname -r)情况三:设备权限问题
sudo usermod -a -G dialout $USER sudo chmod 666 /dev/ttyCH341USB0记得注销重新登录使权限生效。
验证驱动是否正常工作:
dmesg | grep ch341应该能看到设备初始化成功的日志。最后用以下命令测试通信:
stty -F /dev/ttyCH341USB0 921600 raw cat < /dev/ttyCH341USB0如果显示乱码但不停刷屏,说明硬件链路已经通了。
3. PX4飞控参数配置
飞控参数配置是通信链路建立的关键环节,这里有几个容易忽略的细节。首先要用USB线直接连接飞控和电脑,打开QGroundControl(QGC)进行配置。
关键参数设置步骤:
- 在参数页面搜索MAV_1_CONFIG,设置为TELEM2
- 搜索SER_TEL2_BAUD,设置波特率(推荐921600)
- 确保MAV_0_CONFIG保持默认的TELEM1不变
- 检查MAV_2_CONFIG是否为禁用状态
有个隐藏技巧:在配置完成后,建议导出参数文件备份。执行:
param save /fs/microsd/params_backup.param这样下次可以直接加载,不用重复配置。
波特率选择的经验之谈:
- 921600:适合高频数据传输(如视觉SLAM)
- 57600:适合低功耗场景
- 115200:通用折中选择
实测发现,树莓派4B在921600波特率下持续工作2小时后会出现缓冲区溢出,这时需要调整飞控的:
MAV_1_RATE = 200000这个参数控制MAVLink消息发送频率。
4. MAVLink通信测试与调试
当硬件和基础配置都完成后,就该测试通信链路了。推荐使用mavlink-router这个工具:
sudo apt install mavlink-router mavlink-routerd -e 127.0.0.1:14550 /dev/ttyCH341USB0:921600常见问题排查指南:
- QGC能连接但收不到数据检查飞控参数:
MAV_1_MODE = Onboard MAV_1_FORWARD = Enabled- 数据包不完整可能是硬件问题,用示波器检查信号质量。简易测试方法:
sudo apt install cutecom cutecom -b 921600 -d /dev/ttyCH341USB0观察接收到的原始数据是否规律。
- 通信时断时续大概率是供电不稳导致,建议:
- 给Jetson/树莓派接独立电源
- 检查所有GND连接是否牢固
- 在TX/RX线上加10kΩ上拉电阻
性能优化技巧:
- 在/etc/rc.local中加入:
echo 1 > /sys/bus/usb-serial/devices/ttyUSB0/latency_timer将USB延迟从默认16ms降到1ms
- 使用DMA缓冲:
sudo stty -F /dev/ttyCH341USB0 921600 -onlcr -opost -icanon -echo5. 高级应用与扩展
建立稳定通信后,就可以开发更高级的应用了。这里分享几个实战项目经验。
视觉SLAM集成方案:
import pymavlink.mavutil as mavutil from pymavlink import mavwp master = mavutil.mavlink_connection( '/dev/ttyCH341USB0', baud=921600, source_system=255) while True: msg = master.recv_match(blocking=True) if msg.get_type() == 'GLOBAL_POSITION_INT': print(f"GPS: lat={msg.lat/1e7}, lon={msg.lon/1e7}")实时控制代码片段:
#include <mavsdk/mavsdk.h> using namespace mavsdk; Mavsdk mavsdk; ConnectionResult conn_result = mavsdk.add_any_connection("serial:///dev/ttyCH341USB0:921600"); auto system = mavsdk.systems().at(0); auto action = Action{system}; action.arm();带宽优化建议:
- 关闭不用的消息流:
MAV_1_STREAM_EXTRA1_RATE = 0 MAV_1_STREAM_EXTRA2_RATE = 0- 使用COMPRESSED_IMAGE传输图像
- 启用MAVLink2协议
6. 多平台适配技巧
不同版本的Ubuntu和不同边缘计算设备会有细微差异,这里总结下关键点。
Ubuntu版本差异处理:
- 18.04:需要手动加载ftdi_sio驱动
- 20.04:默认支持最好
- 22.04:可能需要禁用ModemManager
设备特定配置:
- Jetson系列:
sudo systemctl stop nvgetty sudo systemctl disable nvgetty- 树莓派:
sudo raspi-config非交互式 sudo apt purge triggerhappy内核参数优化:
echo 'kernel.sched_rt_runtime_us = 1000000' | sudo tee -a /etc/sysctl.conf echo 'vm.swappiness = 10' | sudo tee -a /etc/sysctl.conf最后提醒,所有配置变更后都要重启服务:
sudo udevadm control --reload-rules sudo systemctl restart systemd-udevd