2. PX4与AI基础
在无人机AI交付项目中,PX4自动驾驶仪是承载智能算法的核心飞行平台。无论是目标跟踪、自主避障,还是视觉降落、集群协同,AI模型最终都需要运行在PX4的软件架构之上,并通过MAVLink协议与地面站、机载计算机进行数据交互。本章将系统梳理PX4的模块化架构、MAVLink的通信机制,以及AI能力在PX4生态中的典型接入方式,为后续的代码集成、参数调优和日志分析打下坚实基础。
上图展示了PX4与AI协同工作的整体数据流。PX4负责底层飞行控制与状态估计,机载计算机运行AI模型并通过MAVLink协议与PX4交互,地面站则作为人类操作员的监控与干预入口。理解这一架构是后续所有开发工作的前提。
2.1 PX4自动驾驶仪核心架构
核心原理:模块化与发布-订阅机制
PX4采用高度模块化的设计,内部通过uORB(Micro Object Request Broker)消息总线进行模块间通信。每个功能模块(如姿态估计、位置控制、任务导航)独立运行,通过订阅和发布uORB主题来交换数据。这种架构带来的直接好处是:AI开发者可以只关注自己需要的uORB主题(如vehicle_attitude、vehicle_local_position),而不必理解全部PX4源码。
PX4的飞行控制栈分为两个主要层级:状态估计层(融合IMU、GPS、气压计等传感器数据,输出姿态、位置、速度估计)和控制层(根据期望状态与实际状态的偏差,计算电机控制量)。AI算法通常介入在“期望状态生成”这一层——即告诉PX4“应该往哪里飞”,而不是直接控制电机转速。
判断方法:识别PX4版本与模块状态
在开始AI集成前,必须确认PX4固件版本和模块运行状态。使用以下命令检查:
# 查看PX4版本
px4 list
# 查看uORB主题列表
px4 top
# 检查关键模块是否运行
px4 status
在AI交付项目中,我们通常关注以下核心模块:mc_att_control(多旋翼姿态控制)、mc_pos_control(多旋翼位置控制)、navigator(任务导航)、commander(飞行模式管理)。如果这些模块异常,AI算法即使正确也无法正常执行。
案例拆解:基于PX4的视觉避障系统模块划分
假设我们要开发一个视觉避障系统。在PX4架构下,合理的模块划分是:
- 感知模块(机载计算机):运行YOLOv5目标检测,输出障碍物位置信息
- 决策模块(机载计算机):根据障碍物位置计算新的期望航点
- 执行模块(PX4):通过MAVLink的
SET_POSITION_TARGET_LOCAL_NED消息接收期望位置,由位置控制器跟踪执行
这种划分使得AI算法与飞行控制解耦,任何一方的升级都不影响另一方。实际项目中,我们通过px4_avoidance框架实现这一链路,它已经封装好了MAVLink消息的收发逻辑。
常见误区与总结
另一个常见误区是忽略PX4的飞行模式管理。AI系统请求的期望位置只有在特定飞行模式(如Offboard模式)下才会被PX4接受。在Offboard模式下,PX4完全信任外部输入,因此必须设计好安全回退机制(如超时自动切换至降落模式)。
2.2 MAVLink通信协议详解
核心原理:消息定义与传输机制
MAVLink是一种轻量级的消息传输协议,专为无人机通信设计。其核心是预定义的消息集,每条消息有固定的ID、长度和字段定义。PX4与地面站、机载计算机之间的所有交互都通过MAVLink消息完成。
在AI交付项目中,最常用的MAVLink消息包括:
| 消息名 | 方向 | 用途 |
|---|---|---|
| HEARTBEAT | 双向 | 心跳检测,确认设备在线 |
| ATTITUDE | PX4→机载 | 当前姿态四元数 |
| LOCAL_POSITION_NED | PX4→机载 | 本地位置(NED坐标系) |
| SET_POSITION_TARGET_LOCAL_NED | 机载→PX4 | 发送期望位置/速度 |
| COMMAND_LONG | 双向 | 执行命令(如起飞、降落) |
操作流程:配置MAVLink通信链路
在机载计算机与PX4之间建立MAVLink通信,通常有两种方式:
- 串口连接:适用于短距离、低带宽场景,通过UART连接,波特率通常设置为921600
- UDP连接:适用于机载计算机与PX4通过WiFi或以太网连接,PX4默认监听
14540端口
# 在PX4 shell中配置UDP连接
mavlink start -u 14540 -o 14550 -t 192.168.1.100
# 参数说明:-u 本地端口,-o 目标端口,-t 目标IP
在机载计算机端,推荐使用MAVSDK或pymavlink库。MAVSDK提供了更高级的API,适合快速开发;pymavlink则更底层,适合需要精细控制消息内容的场景。
案例拆解:通过MAVLink实现Offboard模式控制
以下是一个典型的AI控制流程:
# Python伪代码 - 使用MAVSDK
from mavsdk import System
from mavsdk.offboard import PositionNedYaw
drone = System()
await drone.connect(system_address="udp://:14540")
# 切换到Offboard模式
await drone.offboard.set_position_ned(PositionNedYaw(0, 0, -5, 0))
await drone.offboard.start()
# AI推理循环
while True:
obstacle_pos = ai_model.detect(frame)
new_target = compute_avoidance_path(obstacle_pos)
await drone.offboard.set_position_ned(new_target)
await asyncio.sleep(0.1)
这段代码展示了AI系统如何通过MAVLink持续向PX4发送期望位置。关键点在于:offboard.start()必须在发送任何位置指令之前调用,且PX4要求至少以2Hz的频率持续接收指令,否则会触发超时保护。
常见误区与总结
另一个常见问题是消息频率不匹配。PX4的Offboard模式要求指令频率不低于2Hz,但过高频率(如100Hz)会导致通信负载过大。实际项目中,10-20Hz的控制频率通常足够,且能保证系统稳定。
2.3 AI在无人机中的应用场景与接入方式
核心原理:AI能力的三种接入层级
AI在PX4无人机中的应用可以划分为三个层级,不同层级对实时性和安全性的要求不同:
| 层级 | 典型应用 | 延迟要求 | 接入方式 |
|---|---|---|---|
| 感知增强 | 目标检测、语义分割 | 100-500ms | 机载计算机处理,结果通过MAVLink发送 |
| 决策辅助 | 路径规划、避障决策 | 10-100ms | 机载计算机生成期望轨迹,PX4跟踪 |
| 底层控制 | 端到端控制、强化学习 | <10ms | 直接输出控制量(需极高可靠性) |
在工程实践中,前两个层级已经成熟并广泛应用,第三个层级仍处于研究阶段,因为端到端控制的可解释性和安全性难以保证。
判断方法:选择适合的AI接入方案
决定AI接入方式时,需要评估以下因素:
- 计算资源:机载计算机的CPU/GPU性能是否满足模型推理需求
- 通信带宽:MAVLink链路能否承载所需的数据量(图像通常不通过MAVLink传输)
- 安全要求:AI失效时,PX4能否安全接管(建议设计看门狗机制)
- 开发周期:使用现成的PX4-Avoidance框架还是从零开发
案例拆解:电力巡检中的绝缘子缺陷检测
我们曾实施一个电力巡检项目,要求无人机自动检测绝缘子缺陷并拍照标记。系统设计如下:
- 感知:Jetson Nano运行YOLOv5s模型,检测绝缘子位置和缺陷类型
- 决策:当检测到缺陷时,生成悬停指令并触发拍照
- 执行:通过MAVLink发送
SET_POSITION_TARGET_LOCAL_NED保持悬停,同时通过COMMAND_LONG触发相机快门
实际运行中,模型推理延迟约80ms,MAVLink指令延迟约20ms,整体响应时间约100ms,完全满足巡检需求。关键参数配置:Offboard模式超时时间设为0.5s,确保通信异常时能快速回退。
常见误区与总结
另一个重要教训是:AI系统的测试必须包含故障注入。例如,模拟MAVLink通信中断、模拟AI模型输出异常值,验证PX4的安全机制能否正确触发。我们在项目中曾遇到AI模型在强光下输出错误目标位置,导致无人机偏离航线,后来通过添加输出合理性检查(位置变化率限制)解决了问题。