2. PX4飞控基础
在无人机AI识别联动开发中,飞控系统是执行层的核心。PX4作为当前最主流的开源自动驾驶仪固件,其模块化架构和标准通信协议为AI识别结果的下发与执行提供了稳定可靠的通道。理解PX4的内部运行机制,是设计“视觉识别→飞控动作”链路的前提。本节将深入剖析PX4的软件架构、关键模块职责以及MAVLink协议的通信规则,帮助开发者建立从“感知”到“执行”的完整技术认知。
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会拒绝执行并返回错误码。
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
2.4 实战场景:AI识别到目标后执行“跟踪悬停”
下面通过一个完整的案例,串联本节所学的架构、模块和协议知识。
场景背景:某电力巡检无人机搭载NVIDIA Jetson Orin NX作为机载计算机,运行YOLOv8模型识别输电线路上的绝缘子缺陷。当AI在飞行中识别到疑似缺陷时,需要无人机悬停在目标上方3米处,并持续拍摄高清照片。
初始条件:无人机正在执行预设航线任务(AUTO模式),飞行高度50米,速度5m/s。AI识别置信度阈值为0.85,识别到缺陷后需要在500ms内完成悬停动作。
实施步骤:
- AI识别与坐标转换:YOLO输出目标在图像中的像素坐标,通过相机内参和无人机姿态(从飞控获取ATTITUDE消息)计算出目标在本地NED坐标系下的位置(x_target, y_target, z_target)。
- 发送模式切换指令:AI通过MAVLink发送
SET_MODE,将飞行模式从AUTO切换为OFFBOARD(离板控制模式)。该模式允许外部系统直接发送位置/速度指令。 - 发送期望位置:以10Hz频率发送
SET_POSITION_TARGET_LOCAL_NED,目标位置为(x_target, y_target, z_target - 3m)。注意:OFFBOARD模式下,飞控要求持续接收指令,若超过1秒未收到新指令,会自动退出OFFBOARD并切换回之前的模式。 - 闭环监控:AI同时订阅
LOCAL_POSITION_NED消息,实时比较当前位置与目标位置的误差。当误差小于0.2米时,认为已到达悬停点,触发相机拍照。 - 安全兜底:若AI进程崩溃或通信中断超过1.5秒,PX4的通信丢失保护(Comms Lost Failsafe)会自动触发,将无人机切换为RTL模式,安全返航。
结果与复盘:实测从AI识别到完成悬停约需800ms(包含坐标转换和指令传输延迟),满足巡检要求。但在测试中发现,当无人机处于高速飞行时(>8m/s),直接发送位置指令会导致较大的超调量(约1.5米)。优化方案是:先发送速度指令(type_mask中只使用速度分量)减速,当速度低于2m/s时再切换为位置指令,超调量降至0.3米以内。
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就无法确认指令是否被接受,增加了调试难度。