2. PX4飞控基础

在无人机AI识别联动开发中,飞控系统是执行层的核心。PX4作为当前最主流的开源自动驾驶仪固件,其模块化架构和标准通信协议为AI识别结果的下发与执行提供了稳定可靠的通道。理解PX4的内部运行机制,是设计“视觉识别→飞控动作”链路的前提。本节将深入剖析PX4的软件架构、关键模块职责以及MAVLink协议的通信规则,帮助开发者建立从“感知”到“执行”的完整技术认知。

外部输入源 AI识别模块 (YOLO等) 地面站 QGC / MAVSDK 遥控器 / 传感器 MAVLink 通信层 MAVLink 2.0 协议 uORB 内部消息总线 串口 / UDP / USB PX4 飞控核心模块 Commander 状态机/飞行模式/安全 Navigator 航线规划/任务执行 mc_rate_controller 角速率内环控制 mc_pos_controller 位置/速度外环控制 传感器驱动 / 姿态估计 / 执行机构输出 (EKF2, sensors, actuators, etc.) 执行输出层 PWM / DShot 电调 / 电机 舵机 / 云台 MAVLink消息 uORB主题

2.1 PX4整体架构:分层解耦与消息驱动

PX4采用分层架构设计,从上到下依次为:应用层(飞行模式与任务逻辑)→ 导航层(位置估计与航线规划)→ 控制层(位置/姿态控制器)→ 估计层(传感器融合)→ 硬件抽象层(驱动与执行机构输出)。各层之间通过轻量级的发布/订阅消息总线uORB(Micro Object Request Broker)进行通信,而非直接函数调用。这种设计使得模块可以独立开发、测试和替换,也方便开发者在不影响其他模块的前提下注入自定义逻辑。

对于AI联动场景,理解uORB机制至关重要。当AI识别模块(通常运行在机载计算机如Jetson或树莓派上)需要控制无人机时,它并不直接操作飞控硬件,而是通过MAVLink协议将指令发送给PX4的通信模块(mavlink模块),该模块将MAVLink消息转换为uORB主题,再被Commander、Navigator等模块订阅执行。整个链路是异步、解耦的,保证了系统的稳定性和可扩展性。

架构层级 代表模块 主要职责 AI联动中的角色
应用层 Commander, Navigator 飞行模式管理、任务状态机 接收外部指令,切换飞行模式
导航层 Navigator, Mission 航线规划、航点任务执行 执行AI指定的目标航点
控制层 mc_pos_controller, mc_rate_controller 位置/速度/姿态控制 将期望位置/姿态转换为控制量
估计层 EKF2, LPE 传感器融合、状态估计 提供位置/速度反馈给控制器
硬件抽象层 驱动, actuators 传感器读取、PWM输出 执行最终电机/舵机动作

2.2 核心模块深度解析

2.2.1 Commander:飞行模式与安全状态机

Commander是PX4的“大脑中枢”,负责维护整个系统的运行状态机,包括:上电自检、待机(Preflight)、解锁(Armed)、起飞(Takeoff)、降落(Land)、返航(RTL)、失效保护(Failsafe)等状态。它监听来自遥控器、地面站或机载计算机的模式切换指令,并校验当前状态是否允许执行该切换。

在AI联动场景中,Commander是安全兜底的关键。例如,当AI识别到障碍物并触发“紧急悬停”指令时,该指令通过MAVLink的SET_MODE消息到达Commander,Commander会检查当前是否处于可悬停的状态(如非手动模式),然后切换到HOLD模式。如果AI指令与安全规则冲突(如在降落过程中要求起飞),Commander会拒绝执行并返回错误码。

关键点:Commander不会直接执行“飞到哪里”的指令,它只负责“允许什么模式”。具体的航点或速度指令由Navigator或控制器处理。因此,AI系统需要同时发送“模式切换指令”和“期望位置/速度指令”才能完成完整控制。

2.2.2 Navigator:任务规划与航点管理

Navigator模块负责任务(Mission)的执行与航点管理。它维护一个航点队列,按顺序将航点发送给位置控制器。当AI识别模块需要无人机飞向某个目标位置时,通常有两种方式:一是通过MAVLink的MISSION_ITEM上传航点任务;二是使用SET_POSITION_TARGET_LOCAL_NED直接发送期望位置(更实时,适合动态目标跟踪)。

Navigator还处理返航(RTL)逻辑。当AI系统检测到通信丢失或电量不足时,可以触发RTL指令,Navigator会计算一条从当前位置到起飞点的安全航线,并控制无人机沿航线返回。在开发AI联动功能时,务必保留RTL作为最终安全手段。

2.2.3 mc_rate_controller:角速率内环控制

mc_rate_controller是多旋翼的角速率内环控制器,运行频率通常为250Hz-500Hz。它接收期望的机体角速率(p, q, r),结合陀螺仪测量的实际角速率,通过PID控制算法计算出期望的电机力矩,再分配给各个电机。该模块是飞行稳定性的核心,其参数(如P、I、D增益)直接影响无人机的操控手感。

对于AI联动,开发者通常不需要直接修改mc_rate_controller的参数,而是通过上层的位置/速度控制器间接影响它。例如,当AI发送“以2m/s速度向东飞行”的指令时,位置控制器会计算出期望的倾斜角度,姿态控制器再将其转换为期望角速率,最终由mc_rate_controller输出PWM信号。理解这一链路有助于排查“AI指令发出但无人机不动作”的问题——可能是指令未到达控制器,也可能是控制器参数导致响应过慢。

2.3 MAVLink通信协议:AI与飞控的桥梁

MAVLink(Micro Air Vehicle Link)是一种专为无人机设计的轻量级通信协议,支持点对点、广播和组播传输。PX4默认使用MAVLink 2.0版本,相比1.0增加了消息签名、扩展字段和更高效的数据封装。AI识别模块通常通过串口(UART)、UDP或TCP与飞控通信,常见波特率为921600bps。

在AI联动开发中,最常用的MAVLink消息包括:

  • HEARTBEAT:心跳包,用于检测链路状态,频率通常为1Hz。
  • SET_MODE:切换飞行模式(如AUTO、HOLD、RTL)。
  • SET_POSITION_TARGET_LOCAL_NED:发送期望位置/速度/加速度(坐标系为机体NED或本地NED)。
  • COMMAND_LONG:执行特定命令(如起飞、降落、开始任务)。
  • MISSION_ITEM:上传航点任务。
  • ATTITUDE / LOCAL_POSITION_NED:接收飞控返回的姿态和位置信息,用于AI闭环反馈。
// 示例:通过MAVLink发送期望位置指令(伪代码)
mavlink_message_t msg;
uint8_t buf[MAVLINK_MAX_PACKET_LEN];

// 填充目标位置:本地NED坐标系,x=10m, y=0m, z=-5m(高度5m)
mavlink_set_position_target_local_ned_t target = {0};
target.coordinate_frame = MAV_FRAME_LOCAL_NED;
target.type_mask = 0b0000111111111000; // 只使用位置,忽略速度/加速度
target.x = 10.0f;
target.y = 0.0f;
target.z = -5.0f;

mavlink_msg_set_position_target_local_ned_encode(1, 200, &msg, &target);
uint16_t len = mavlink_msg_to_send_buffer(buf, &msg);
// 通过串口/UDP发送buf
开发建议:在编写AI联动代码时,建议使用MAVSDK(官方推荐的库)或pymavlink,它们封装了底层的字节打包和解析,并提供类型安全的API。避免直接操作原始字节流,以减少出错概率。

2.4 实战场景:AI识别到目标后执行“跟踪悬停”

下面通过一个完整的案例,串联本节所学的架构、模块和协议知识。

场景背景:某电力巡检无人机搭载NVIDIA Jetson Orin NX作为机载计算机,运行YOLOv8模型识别输电线路上的绝缘子缺陷。当AI在飞行中识别到疑似缺陷时,需要无人机悬停在目标上方3米处,并持续拍摄高清照片。

初始条件:无人机正在执行预设航线任务(AUTO模式),飞行高度50米,速度5m/s。AI识别置信度阈值为0.85,识别到缺陷后需要在500ms内完成悬停动作。

实施步骤:

  1. AI识别与坐标转换:YOLO输出目标在图像中的像素坐标,通过相机内参和无人机姿态(从飞控获取ATTITUDE消息)计算出目标在本地NED坐标系下的位置(x_target, y_target, z_target)。
  2. 发送模式切换指令:AI通过MAVLink发送SET_MODE,将飞行模式从AUTO切换为OFFBOARD(离板控制模式)。该模式允许外部系统直接发送位置/速度指令。
  3. 发送期望位置:以10Hz频率发送SET_POSITION_TARGET_LOCAL_NED,目标位置为(x_target, y_target, z_target - 3m)。注意:OFFBOARD模式下,飞控要求持续接收指令,若超过1秒未收到新指令,会自动退出OFFBOARD并切换回之前的模式。
  4. 闭环监控:AI同时订阅LOCAL_POSITION_NED消息,实时比较当前位置与目标位置的误差。当误差小于0.2米时,认为已到达悬停点,触发相机拍照。
  5. 安全兜底:若AI进程崩溃或通信中断超过1.5秒,PX4的通信丢失保护(Comms Lost Failsafe)会自动触发,将无人机切换为RTL模式,安全返航。

结果与复盘:实测从AI识别到完成悬停约需800ms(包含坐标转换和指令传输延迟),满足巡检要求。但在测试中发现,当无人机处于高速飞行时(>8m/s),直接发送位置指令会导致较大的超调量(约1.5米)。优化方案是:先发送速度指令(type_mask中只使用速度分量)减速,当速度低于2m/s时再切换为位置指令,超调量降至0.3米以内。

风险提示:OFFBOARD模式是PX4中权限最高的外部控制模式,使用不当可能导致失控。务必在代码中实现“看门狗”机制:如果AI主循环停止发送指令超过500ms,主动发送SET_MODE切换回HOLD或RTL模式。同时,在飞控参数中设置COM_OF_LOSS_T(通信丢失时间阈值)为1.0秒,确保安全兜底及时生效。

2.5 常见误区与总结复盘

在PX4与AI联动的开发实践中,以下误区值得特别注意:

  • 误区一:混淆“模式切换”与“指令发送”。很多开发者只发送了SET_POSITION_TARGET指令,却忘记先切换到OFFBOARD模式,导致指令被忽略。正确顺序是:先切模式,再发指令。
  • 误区二:忽略坐标系定义。MAVLink中的NED坐标系(X-北,Y-东,Z-下)与图像坐标系、机体坐标系不同。坐标转换错误会导致无人机飞向错误方向,甚至发生碰撞。
  • 误区三:控制频率过低。OFFBOARD模式下,位置指令的发送频率建议不低于10Hz,否则飞控会认为链路不稳定而退出OFFBOARD。对于速度控制,建议频率更高(20-50Hz)。
  • 误区四:不处理飞控返回的ACK。发送COMMAND_LONG后,飞控会返回COMMAND_ACK消息。不检查ACK就无法确认指令是否被接受,增加了调试难度。