2. PX4与ROS2基础

在PX4目标跟随项目中,飞控系统与机载计算机(通常为运行ROS2的Linux平台)之间的协同工作能力,直接决定了目标检测、坐标转换与飞行控制指令链路的实时性与可靠性。本章将系统梳理PX4飞控的内部模块架构、MAVLink通信协议的核心机制,以及ROS2与PX4之间通过px4_ros_com和uXRCE-DDS桥接的完整技术路径。理解这些底层原理,是后续编写目标跟随算法、调试通信延迟、定位数据异常的前提。

PX4飞控内部架构 MAVLink通信协议 ROS2桥接层 传感器驱动 姿态估计 位置估计 导航/任务 位置控制器 姿态控制器 混控器 执行机构输出 HEARTBEAT / SYS_STATUS LOCAL_POSITION_NED ATTITUDE / GLOBAL_POSITION SET_POSITION_TARGET OFFBOARD控制模式 px4_ros_com (ROS2包) uXRCE-DDS 客户端(飞控端) uXRCE-DDS 代理(机载端) 话题/服务 映射 uORB <-> ROS2 msg uORB内部消息总线 串口/UDP 二进制协议 DDS/RTPS 中间件

上图展示了PX4目标跟随项目中的核心通信链路:飞控内部通过uORB消息总线完成模块间数据交换,对外通过MAVLink协议与地面站或机载计算机通信,而ROS2则通过uXRCE-DDS桥接层将MAVLink世界与DDS世界连接起来。下面逐一深入剖析。

2.1 PX4飞控基本架构:模块化与uORB消息总线

核心原理:分层模块化设计

PX4飞控采用高度模块化的架构,所有功能组件(传感器驱动、估计器、控制器、任务规划等)均以独立进程或线程运行,彼此之间通过轻量级的uORB(Micro Object Request Broker)消息总线进行异步通信。这种设计借鉴了操作系统的微内核思想,使得每个模块可以独立开发、测试和升级,且单个模块崩溃不会导致整个飞控系统瘫痪。

从功能层次上看,PX4架构自上而下可分为四层:

  • 应用层:包括任务规划(Navigator)、飞行模式管理(Commander)、传感器校准等高层逻辑。
  • 估计与控制层:包括姿态估计器(EKF2)、位置估计器、位置控制器(L1/NPFG)、姿态控制器(Rate/Attitude)。
  • 驱动层:包括IMU、气压计、磁力计、GPS等传感器驱动,以及PWM/CAN执行机构输出驱动。
  • 硬件抽象层:通过Board Support Package屏蔽不同硬件平台的差异。

uORB消息总线机制

uORB是PX4内部通信的基石。每个消息类型(如vehicle_attitude、vehicle_local_position、actuator_controls)对应一个主题(Topic)。发布者(Publisher)向主题写入数据,订阅者(Subscriber)从主题读取数据。uORB支持多发布者/多订阅者模式,并提供了数据副本机制,确保读写互不阻塞。在目标跟随项目中,机载计算机通过ROS2发送的目标位置指令,最终会通过uORB主题vehicle_command或trajectory_setpoint注入到PX4控制环路中。

经验提示:在调试PX4内部问题时,可以通过listener vehicle_attitude命令在NuttX shell中实时查看uORB消息内容,这比盲目修改代码更高效。例如,当目标跟随过程中出现姿态抖动时,先检查vehicle_attitude的四元数是否连续平滑,再判断是估计问题还是控制问题。

操作流程:查看PX4模块状态

# 进入NuttX shell(通过MAVLink或串口)
pxh> top            # 查看所有模块的CPU占用率
pxh> listener vehicle_attitude   # 订阅并打印姿态消息
pxh> commander status            # 查看当前飞行模式与状态机
pxh> param show SYS_AUTOSTART    # 查看机架参数

案例拆解:目标跟随中的内部数据流

假设无人机正在执行目标跟随任务,机载计算机通过视觉检测到目标位于机体前方3米处,并计算出期望的NED坐标系位置。该指令通过ROS2桥接层进入PX4后,内部数据流如下:

  1. Commander模块接收到OFFBOARD模式切换指令,将飞行模式从AUTO切换为OFFBOARD。
  2. Navigator模块不再产生任务航点,控制权移交给外部指令。
  3. 位置控制器订阅trajectory_setpoint主题,获取期望位置与速度。
  4. 位置控制器输出期望加速度,传递给姿态控制器,后者计算出期望姿态四元数。
  5. 姿态控制器输出期望角速率,经过混控器映射为四个电机的PWM占空比。

整个过程在4ms(250Hz)的控制周期内完成,任何一环的延迟或数据异常都会导致跟随性能下降。

2.2 MAVLink通信协议:飞控与外部世界的语言

核心原理:轻量级二进制消息协议

MAVLink(Micro Air Vehicle Link)是一种专为无人机设计的轻量级二进制通信协议。其v2.0版本支持多达255个消息ID,每个消息包含起始字节、长度、序列号、系统ID、组件ID、消息ID、负载和CRC校验。在PX4目标跟随项目中,MAVLink主要用于:

  • 地面站(QGroundControl)与飞控之间的遥测与指令传输。
  • 机载计算机与飞控之间的高速数据交换(通常通过UDP或串口)。
  • 固件升级、参数读写、日志下载等维护操作。

关键消息类型与数据流向

消息名称方向频率用途
HEARTBEAT双向1Hz心跳检测,识别系统类型与状态
LOCAL_POSITION_NED飞控→机载30-50Hz提供NED坐标系下的位置与速度
ATTITUDE飞控→机载50-100Hz提供欧拉角或四元数姿态
SET_POSITION_TARGET_LOCAL_NED机载→飞控10-50Hz发送期望位置/速度/加速度
COMMAND_LONG双向按需发送模式切换、起飞、降落等指令

判断方法:如何确认MAVLink链路健康

在目标跟随开发中,通信链路异常是常见故障源。建议通过以下步骤排查:

  1. 使用QGroundControl连接飞控,观察MAVLink连接状态指示灯是否为绿色。
  2. 在机载计算机上运行mavlink status命令(若使用MAVSDK)或抓包分析,检查消息丢包率是否低于1%。
  3. 对比飞控端与机载端接收到的LOCAL_POSITION_NED时间戳,确认延迟是否小于20ms。
风险提示:MAVLink的默认波特率(如57600)在高速数据传输时可能成为瓶颈。当目标跟随需要传输高频率图像或点云数据时,不应通过MAVLink传输,而应使用独立的WiFi/以太网通道。MAVLink只适合传输控制指令和状态遥测。

实战场景:通过MAVLink手动控制无人机

在开发初期,建议先用MAVLink手动验证飞控响应,再接入ROS2。以下是一个使用Python pymavlink库发送OFFBOARD位置指令的示例:

from pymavlink import mavutil
# 创建UDP连接(假设飞控IP为192.168.1.10,端口14550)
master = mavutil.mavlink_connection('udp:192.168.1.10:14550')
master.wait_heartbeat()
# 切换至OFFBOARD模式
master.mav.command_long_send(
    master.target_system, master.target_component,
    mavutil.mavlink.MAV_CMD_DO_SET_MODE, 0,
    1, 6, 0, 0, 0, 0, 0)  # 6表示OFFBOARD
# 发送NED位置指令(x=5, y=0, z=-2)
master.mav.set_position_target_local_ned_send(
    0, master.target_system, master.target_component,
    mavutil.mavlink.MAV_FRAME_LOCAL_NED,
    0b0000111111111000,  # 只使用位置分量
    5, 0, -2, 0, 0, 0, 0, 0, 0, 0, 0)

执行上述代码后,无人机应平滑飞向(5,0,-2)位置。如果无人机无响应,检查模式切换是否成功(通过HEARTBEAT消息中的mode字段),以及位置指令的坐标系是否正确。

2.3 ROS2与PX4桥接:px4_ros_com与uXRCE-DDS

核心原理:从uORB到DDS的映射

ROS2基于DDS(Data Distribution Service)中间件,而PX4原生使用uORB。两者无法直接通信,需要桥接层进行协议转换。PX4官方提供了两条路径:

  • px4_ros_com:一个ROS2功能包,包含消息定义(msg/srv)和示例节点,负责将ROS2话题转换为MAVLink消息或直接与uXRCE-DDS代理交互。
  • uXRCE-DDS:PX4固件内置的DDS客户端,通过串口或UDP与机载计算机上的Micro XRCE-DDS Agent通信,Agent再与ROS2的DDS网络互联。

操作流程:搭建PX4-ROS2桥接环境

# 1. 启动Micro XRCE-DDS Agent(机载计算机)
MicroXRCEAgent udp4 -p 8888
# 2. 在PX4固件中启用DDS(需重新编译固件)
# 在px4_config.h中设置:CONFIG_MODULE_UXRCE_DDS_CLIENT=y
# 3. 启动PX4飞控(模拟器或真实硬件)
# 4. 在ROS2工作空间中编译px4_ros_com
cd ~/ws_px4/src
git clone https://github.com/PX4/px4_ros_com.git
cd ~/ws_px4 && colcon build
# 5. 运行桥接测试节点
source install/setup.bash
ros2 run px4_ros_com offboard_control

案例拆解:目标跟随中的桥接配置

假设我们使用树莓派作为机载计算机,通过UART与Pixhawk飞控连接。关键配置如下:

参数项飞控端设置机载端设置
物理连接TELEM2端口,波特率921600UART5,波特率921600
DDS客户端启用uXRCE-DDS,目标IP为树莓派IP启动Agent,监听UDP 8888
话题映射vehicle_local_position → px4_ros_com/VehicleLocalPosition订阅/px4_ros_com/vehicle_local_position
控制指令订阅trajectory_setpoint主题发布/px4_ros_com/trajectory_setpoint

在目标跟随节点中,我们通常订阅以下ROS2话题:

/px4_ros_com/vehicle_attitude       # 姿态四元数
/px4_ros_com/vehicle_local_position # NED位置与速度
/px4_ros_com/vehicle_status         # 飞行模式与状态

同时发布:

/px4_ros_com/trajectory_setpoint   # 期望位置/速度
/px4_ros_com/vehicle_command        # 模式切换指令

常见误区与复盘总结

误区1:认为MAVLink和DDS是竞争关系。实际上,MAVLink适合点对点低延迟控制,DDS适合多节点分布式系统。在PX4目标跟随中,建议控制指令走uXRCE-DDS(延迟更低),而日志和参数读写走MAVLink。
误区2:忽略时间同步。PX4的uORB消息自带硬件时间戳,但通过DDS桥接后,ROS2侧的时间戳可能来自不同时钟源。在目标跟随中,必须使用message_filters进行时间同步,否则视觉检测与位置估计的融合会出现偏差。
误区3:在OFFBOARD模式下忘记设置超时保护。PX4规定,如果OFFBOARD指令停止超过500ms,飞控会自动退出OFFBOARD模式并切换回AUTO。因此,目标跟随节点必须以不低于10Hz的频率持续发送指令,并在节点崩溃时触发安全降落逻辑。