1. 课程导入

欢迎进入《ROS2 无人机伴随计算机开发》课程。本课程面向已经具备一定 Linux 与 Python/C++ 基础、希望把无人机从“能飞”推进到“能感知、能决策、能协同”的开发者。所谓“伴随计算机”,指的是挂载在无人机平台上、与飞控协同工作的机载计算单元,它通常是一台轻量级单板计算机或边缘计算模块,负责运行 ROS2 节点、处理传感器数据、执行视觉与规划算法,并通过通信链路向飞控发送控制指令。理解“飞控负责稳定飞行、伴随计算机负责智能决策”这一分工,是贯穿全课程的主线。

一、学习目标:从会飞到会开发

本课程的学习目标可以归纳为四个层次。第一层是环境与工具:能够独立搭建 ROS2 开发环境,理解工作空间、功能包、节点、话题、服务、动作等基本概念,并能用命令行与可视化工具观察系统运行状态。第二层是平台与接口:理解无人机飞控与伴随计算机之间的通信方式,掌握 MAVLink、串口/UDP 桥接、以及 ROS2 与飞控之间的消息转换机制。第三层是感知与决策:能够接入相机、深度相机、激光雷达、IMU 等传感器,完成数据采集、时间同步、坐标变换与基础感知算法部署。第四层是系统与协同:能够把多个节点组织成可复用的系统,实现自主起降、航点飞行、目标跟踪、避障与多机协同等典型任务。

学习本课程后,你应当能够回答三个问题:我的无人机系统由哪些软硬件组成?每个模块之间通过什么接口交换什么数据?当某个环节失效时,我如何定位并恢复?

二、核心概念:节点、话题与飞控协同

ROS2 的核心抽象是“节点—话题—服务—动作”。节点是独立运行的计算单元;话题是异步、多对多的数据流;服务是同步的请求响应;动作则适合长耗时、可反馈、可取消的任务。在无人机场景中,相机驱动节点发布图像话题,视觉检测节点订阅图像并发布目标位置话题,规划节点订阅目标位置并发布速度指令话题,飞控桥接节点订阅速度指令并转换为 MAVLink 消息发送给飞控。整条链路清晰、可替换、可观测,这正是 ROS2 适合机器人开发的原因。

需要特别强调的是坐标系与时间。无人机系统中常见坐标系包括机体坐标系、世界坐标系、相机坐标系与地图坐标系。ROS2 使用 TF2 维护坐标变换树,任何感知结果都必须明确“在哪个坐标系下表达”。时间方面,传感器数据带有时间戳,若不同传感器时钟不同步,融合结果就会漂移。因此,时间同步与坐标变换是初学者最容易忽视、却最影响系统稳定性的两个基础问题。

三、整体框架:从传感器到执行器的数据流

下图给出本课程贯穿始终的系统框架。左侧是感知层,中间是伴随计算机上的 ROS2 计算层,右侧是飞控与执行机构,底部是地面站与调试工具。数据自左向右流动,控制指令自右向左闭环,形成“感知—决策—控制—反馈”的完整回路。

ROS2 无人机伴随计算机系统框架 感知层 相机 / 深度相机 激光雷达 / 超声波 IMU / 气压计 GPS / RTK 电池 / 状态监测 伴随计算机 · ROS2 计算层 传感器驱动节点 /camera /imu /scan 感知与融合节点 检测 / TF2 / 定位 规划与决策节点 航点 / 避障 / 跟踪 控制指令节点 速度 / 位置设定值 飞控桥接节点(MAVLink / micro-ROS / 串口 / UDP) /mavros/setpoint_velocity · /mavros/state 参数服务 · 日志记录 · 健康监控 ros2 param · ros2 bag · 心跳检测 飞控与执行机构 PX4 / ArduPilot 飞控 姿态稳定 · 电机混控 电调 / 电机 / 舵机 PWM / DShot 遥控接收机 SBUS / CRSF 安全开关 / 蜂鸣器 解锁 · 失效保护 数据 指令 状态反馈:姿态 · 位置 · 电池 · 飞行模式 地面站与调试工具:QGroundControl · RViz2 · rqt · ros2 bag · 日志分析

四、软硬件环境概览

硬件方面,典型配置包括:四旋翼机架与动力系统、支持 MAVLink 的飞控(PX4 或 ArduPilot)、机载伴随计算机(如树莓派、Jetson Orin Nano、RK3588 等)、传感器套件(相机、深度相机、激光雷达、IMU、GPS/RTK)、通信模块(数传、Wi-Fi、4G/5G)以及供电与稳压模块。软件方面,伴随计算机通常运行 Ubuntu 22.04 与 ROS2 Humble,飞控运行 PX4 或 ArduPilot 固件,二者通过 MAVROS 或 micro-ROS 桥接。开发工具链包括 colcon 构建系统、ros2 CLI、RViz2、rqt、QGroundControl 与 Git。

层级 典型组成 关键接口 / 工具 常见问题
感知层 相机、深度相机、激光雷达、IMU、GPS USB / MIPI / UART / I2C,ROS2 驱动话题 时间戳不同步、标定不准
计算层 Jetson / 树莓派 / RK3588,ROS2 Humble colcon、ros2 run、TF2、ros2 bag 算力不足、节点阻塞、QoS 不匹配
通信层 MAVLink 串口 / UDP、micro-ROS、Wi-Fi MAVROS、/mavros/state、心跳与超时 丢包、延迟、波特率错误
控制层 PX4 / ArduPilot 飞控、电调、电机 setpoint_velocity、解锁、模式切换 未解锁、模式拒绝、失控保护触发
地面层 QGroundControl、RViz2、rqt、日志 参数配置、可视化、ros2 bag 回放 参数误改、日志缺失

五、典型场景:一次自主航点飞行的数据流

假设任务是从起飞点飞往三个航点并返回。伴随计算机上的规划节点读取航点列表,发布位置设定值;飞控桥接节点将其转换为 MAVLink 指令发送给飞控;飞控执行姿态与位置控制,驱动电机;同时飞控回传状态,桥接节点发布 /mavros/state 与本地位置话题;健康监控节点检测电池与飞行模式,一旦异常立即触发返航。整个过程可以通过 ros2 bag 录制,事后回放分析。这个场景把感知、计算、通信、控制、地面工具全部串联起来,是本课程后续章节反复使用的参考任务。

# 启动飞控桥接与基础节点
ros2 launch mavros px4.launch fcu_url:=/dev/ttyUSB0:921600

# 查看飞控状态与可用话题
ros2 topic echo /mavros/state
ros2 topic list | grep mavros

# 录制飞行数据,便于复盘
ros2 bag record /mavros/state /mavros/local_position/pose /camera/image_raw

六、常见误区与复盘建议

  • 误区一:把伴随计算机当成飞控。伴随计算机不直接参与姿态稳定,它输出的是设定值或高层指令,实时稳定仍由飞控完成。混淆二者会导致对实时性和安全边界的误判。
  • 误区二:忽视坐标系与时间同步。感知结果若未标注坐标系、未做时间对齐,融合与跟踪就会失效。建议每个节点都明确输入输出坐标系与时间戳来源。
  • 误区三:只在地面调试,不做分阶段验证。正确顺序是:桌面仿真 → 室内悬停 → 室外定点 → 自主任务。每一步都应有明确的通过标准与回退方案。
  • 误区四:不记录日志。没有 ros2 bag 与飞控日志,排障只能靠猜。建议从第一天起就养成录制关键话题的习惯。
建议在本课程开始前准备好一台可运行的 Ubuntu 22.04 + ROS2 Humble 环境,并完成一次“发布话题—订阅话题—可视化”的最小实验。后续所有章节都建立在这个最小闭环之上。