无人机开源框架:PX4 - 树莓派 - 岸上计算机
一、系统架构概览
在无人机三层架构中,各模块的职责划分遵循"实时性优先、复杂性分层"的原则:

二、各模块功能划分
1. PX4飞控(底层实时控制层)
PX4运行在Pixhawk/Pixracer等飞控硬件上,使用NuttX实时操作系统,主要负责:
| 功能类别 | 具体职责 |
|---|---|
| 传感器驱动 | 直接读取IMU、磁力计、GPS、气压计、超声波等 |
| 姿态估计 | 运行EKF(扩展卡尔曼滤波)融合传感器数据,计算当前姿态、位置和速度 |
| 底层控制 | PID/ADRC控制算法,输出PWM/CAN信号驱动电机和舵机 |
| 安全监控 | 电压监测、看门狗、失控保护(failsafe)、地理围栏 |
| 通信中继 | 通过串口与树莓派交换MAVLink/uXRCE-DDS消息 |
关键特点:
-
硬实时保障(微秒级响应,对于稳定飞行至关重要)
-
不处理视觉、路径规划等计算密集型任务
-
即使树莓派死机,PX4仍能保持基础稳定控制(姿态保持、返航)
2. 树莓派(机载任务计算机)
树莓派运行Linux系统(Ubuntu/Raspbian),作为"任务计算机"承担:
| 功能类别 | 具体职责 |
|---|---|
| 视觉处理 | 摄像头图像采集、目标检测与跟踪(如行人、车辆)、AprilTag识别 |
| 路径规划 | 基于环境感知数据,生成动态航点并发送给PX4 |
| SLAM/定位增强 | 视觉SLAM(如ORB-SLAM3)、VIO(视觉惯性里程计)、RTK GPS数据处理 |
| 通信网关 | 将PX4数据转发至地面站、接收地面指令 |
| ROS节点运行 | 可运行ROS/ROS2节点,整合各传感器和算法 |
实际项目案例:
-
ERLE无人机:树莓派4运行YOLO目标检测,Pixhawk运行PX4实现自动跟随
-
无人机快递系统:树莓派处理条形码识别和投递点确认
3. 岸上计算机(地面站/控制中心)
岸上计算机通常是一台PC或笔记本,运行QGroundControl或其他定制地面站:
| 功能类别 | 具体职责 |
|---|---|
| 任务规划 | 预设航点、区域测绘路径、自动任务脚本上传 |
| 实时监控 | 显示无人机姿态、高度、GPS状态、电池电压、视频流 |
| 数据记录 | 记录飞行日志、传感器数据用于后处理分析 |
| 应急干预 | 手动接管控制、紧急降落/返航指令 |
| 云服务对接 | 数据上传至云端进行长期存储或分析 |
三、通信方式详解
1. PX4 ↔ 树莓派(机载通信)
这是最关键的内部通信链路,有两种主流方案:
方案A:MAVLink(传统、简单)
text
PX4 (TELEM2串口) <--UART--> 树莓派 (串口GPIO/USB)
MAVLink协议
-
物理连接:串口(UART),常用TELEM2端口
-
波特率:921600 bps(推荐)
-
软件方案:
-
MAVROS(ROS用户): 将MAVLink转换为ROS话题
-
MAVLink Router:轻量级路由转发
-
pymavlink(Python): 适合快速开发
-
接线表(Pixhawk TELEM2 → 树莓派串口):
| TELEM2针脚 | 信号 | 树莓派GPIO |
|---|---|---|
| 2 | TX (输出) | RXD (GPIO 15) |
| 3 | RX (输入) | TXD (GPIO 14) |
| 6 | GND | GND |
⚠️ 电压注意:Pixhawk串口为3.3V,树莓派GPIO也为3.3V,可直接连接。
Python示例(使用pymavlink接收数据):
python
from pymavlink import mavutil
# 连接到串口
master = mavutil.mavlink_connection('/dev/serial0', baud=921600)
# 等待心跳包
master.wait_heartbeat()
print("Heartbeat from PX4")
# 循环读取姿态数据
while True:
msg = master.recv_match(type='ATTITUDE', blocking=True)
roll = msg.roll
pitch = msg.pitch
yaw = msg.yaw
print(f"Roll: {roll:.2f}, Pitch: {pitch:.2f}, Yaw: {yaw:.2f}")
方案B:uXRCE-DDS / ROS2(现代、功能更强)
text
PX4 (uXRCE-DDS Client) <--UART/Ethernet--> 树莓派 (uXRCE-DDS Agent) <--> ROS2节点
-
核心优势:PX4内部uORB消息直接映射为ROS2话题,无需手动转换
-
适用场景:需要使用ROS2生态、复杂传感器融合、多机协同、集群飞行
-
启动方式:
bash
# PX4端(NuttShell) uxrce_dds_client start -t UART -d /dev/ttyS3 # 树莓派端 MicroXRCEAgent serial --dev /dev/ttyS0 -b 921600
订阅PX4的IMU数据示例(ROS2):
python
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Imu
class IMUSubscriber(Node):
def __init__(self):
super().__init__('imu_subscriber')
self.subscription = self.create_subscription(
Imu,
'/fmu/out/vehicle_imu',
self.imu_callback,
10)
def imu_callback(self, msg):
self.get_logger().info(f'Acceleration: {msg.linear_acceleration}')
rclpy.init()
node = IMUSubscriber()
rclpy.spin(node)
2. 树莓派 ↔ 岸上计算机(远程通信)
| 通信方式 | 适用场景 | 典型配置 |
|---|---|---|
| WiFi | 视距内、短距离飞行(<300米) | 树莓派连接USB无线网卡,地面站接入同一网络 |
| 4G/LTE | 超视距飞行(BVLOS) | 4G模块 + 云端服务器中转,可实现无限距离 |
| 数传电台 | 中远距离、低延迟需求 | 433MHz/915MHz/2.4GHz,速率约50-250kbps |
| Ethernet over USB | 开发调试阶段 | 树莓派通过USB连接电脑,使用RNDIS虚拟网卡 |
数据流向:
-
上行:地面指令("飞向航点A"、"调整参数")→ 树莓派 → PX4
-
下行:状态数据(姿态/GPS/电池) + 视频流 + 任务日志 → 地面站显示
典型数传电台方案:
text
树莓派USB <--> SiK Radio (3DR) <~~~无线~~~> SiK Radio (USB) <--> QGroundControl
3. RTK GPS/动捕系统接入(高精度定位)
对于需要厘米级定位的场景(如农业喷洒、精准降落),可接入外部定位源:
text
RTK基站/GPS --> 数传电台 --> 树莓派(ntrip_client) --> MAVLink GPS_INJECT --> PX4
↓
RTCM校正数据
或通过动捕系统(室内定位):
text
动捕系统 --> VRPN服务器 --> WiFi --> 树莓派(vrpn_client_ros) --> MAVROS --> PX4
↓
VISION_POSITION_ESTIMATE消息
四、数据流示例:自动目标跟随
以典型的无人机跟随车辆任务为例,数据流转如下:
-
地面操作员:在QGroundControl中启动"跟随模式",框选目标车辆
-
岸上计算机:通过4G发送目标特征(颜色、大小)和初始位置
-
树莓派:
-
接收并解析目标信息
-
启动YOLO目标检测算法处理摄像头图像
-
计算目标相对于无人机的位置偏移
-
生成期望位置指令(如"向东移动2米")
-
-
PX4飞控:
-
读取IMU/GPS/光流传感器数据
-
运行EKF估计当前位姿
-
位置控制PID计算出电机PWM指令
-
-
电机:执行动作,无人机跟随目标移动
-
树莓派(并行):将跟随视频通过RTMP推流到云端
-
岸上计算机:实时显示跟随视频、无人机姿态、剩余电量
五、方案选择建议
| 场景 | 推荐配置 | 理由 |
|---|---|---|
| 学生项目/原型验证 | MAVLink + MAVROS + WiFi | 生态成熟、资料丰富、快速上手 |
| 科研/视觉导航 | uXRCE-DDS + ROS2 + 4G | 支持复杂感知算法、便于集成视觉SLAM |
| 工业巡检 | MAVLink + RTK + 数传电台 | 可靠性高、厘米级定位 |
| 无人机集群 | uXRCE-DDS + ROS2 + 4G | 分布式计算、多机协同通信 |
| FPV竞速/特技 | 直接遥控器控制(无需树莓派) | 极致低延迟 |
六、硬件选型参考
| 组件 | 推荐型号 | 说明 |
|---|---|---|
| 飞控 | Pixhawk 6C / Cube Orange | 稳定可靠,社区支持好 |
| 树莓派 | Raspberry Pi 4B (4GB) | 性能足够处理视觉任务 |
| 摄像头 | Raspberry Pi Camera V2 / Intel RealSense D435 | V2适合RGB图像,D435提供深度信息 |
| GPS | Here3 / M8N GPS + 罗盘 | 配合RTK可实现厘米级定位 |
| 数传电台 | Holybro SiK Telemetry Radio V3 | 915MHz,20km范围 |
| 电源 | PM02D电源模块 + 降压模块 | 为树莓派提供5V供电 |
七、常见问题与调试技巧
| 问题 | 可能原因 | 解决方法 |
|---|---|---|
| 树莓派收不到PX4数据 | 串口配置错误 | 检查/dev/serial0权限,确认波特率一致 |
| 无人机起飞后震荡 | EKF参数未调优 | 运行QGC的参数调优向导 |
| 视频传输卡顿 | WiFi干扰严重 | 切换到5GHz频段或使用4G |
| 跟随响应迟钝 | 树莓派计算负载高 | 优化YOLO模型(使用Tiny版本) |
📚 推荐阅读:
PX4官方文档《Companion Computers》
ROS2与PX4联合教程(Articulated Robotics)
DroneKit Python库文档
如需要具体的代码示例或硬件选型建议,欢迎继续提问!