1. 课程导入

在移动机器人、机械臂、无人机与智能仓储系统中,真正决定系统能否稳定完成任务的,往往不是单个算法模块的性能,而是模块之间如何通信、如何协调、如何在长时任务中保持状态一致。ROS2 提供了话题、服务、动作、参数与执行器等多种通信机制,而“任务通信与行为编排”正是把这些机制组织成可交付工程能力的核心。本课程围绕这一主线展开,帮助学习者从“会调用接口”进阶到“能设计任务系统”。

一、学习目标:从通信原语到任务编排

本课程的学习目标分为四个层次。第一层是通信机制辨析:能够根据数据频率、实时性、是否需要反馈、是否可取消等条件,在话题、服务、动作之间做出合理选择。第二层是行为建模:理解行为树、状态机与任务脚本在 ROS2 中的落地方式,能够把“导航到A点—抓取—返回”这类任务拆解为可执行节点。第三层是工程实现:掌握动作服务器与客户端、执行器回调组、QoS 配置、生命周期节点等关键工程手段。第四层是系统集成:能够将感知、规划、控制与任务调度组合成完整系统,并具备调试、观测与复盘能力。

核心判断:如果任务需要“持续反馈 + 可取消 + 最终结果”,优先考虑动作;如果只是“一问一答”,服务更合适;如果是“持续广播、多方订阅”,话题是首选。

二、核心概念:任务、行为与通信的三角关系

在 ROS2 中,任务是系统要达成的目标,例如“巡检三个点位”;行为是任务的可执行单元,例如“移动到点位”“旋转扫描”“回充”;通信则是行为之间传递目标、反馈与结果的通道。三者关系可以用下面的结构图表示:任务层负责分解与调度,行为层负责执行与状态维护,通信层负责数据与事件传递。理解这张图,就能理解本课程的整体框架。

ROS2 任务通信与行为编排整体框架 任务层:目标分解 · 调度策略 · 优先级 · 异常恢复 巡检任务 / 抓取任务 / 回充任务 / 多机协同任务 行为层:行为树 · 状态机 · 动作服务器 · 生命周期节点 NavigateToPose / FollowPath / GripperCommand / Spin 通信层:话题 · 服务 · 动作 · 参数 · QoS · 执行器 /cmd_vel /scan /navigate_to_pose /set_parameters 实战项目:移动机器人自主巡检与异常恢复系统 目标下发 行为调用 数据通道

三、方法流程:从需求到可运行任务系统

工程实践中,建议遵循“需求拆解—通信选型—行为建模—节点实现—集成调试”的五步流程。第一步,明确任务的成功条件、失败条件与恢复策略;第二步,根据数据特征选择通信机制,并确定 QoS 与频率;第三步,用行为树或状态机描述任务逻辑,避免把调度逻辑硬编码在单个节点中;第四步,实现动作服务器、客户端与执行器回调组;第五步,通过 ros2 topic、ros2 action、rqt 与日志进行观测和调优。

# 典型动作接口定义示例(NavigateToPose.action)
geometry_msgs/PoseStamped target_pose
---
nav2_msgs/action/NavigateToPose_Feedback feedback
---
nav2_msgs/action/NavigateToPose_Result result

# 运行与观测命令
ros2 action list
ros2 action info /navigate_to_pose
ros2 topic echo /cmd_vel
ros2 param get /controller_server follow_path

四、案例场景:移动机器人自主巡检

假设一台差速移动机器人需要完成“从充电桩出发,依次巡检A、B、C三个点位,每个点位停留5秒采集图像,若某点位失败则重试一次,全部完成后返回充电桩”。这个场景几乎覆盖了本课程的全部关键点:任务层需要维护点位队列与重试计数;行为层需要组合导航、旋转、采集与回充行为;通信层需要动作客户端发送目标、接收反馈,并通过话题发布图像与状态。若把重试逻辑写在导航节点内部,系统会迅速变得难以维护;而用行为树把“重试”作为装饰节点,则清晰且可复用。

任务阶段 推荐通信机制 关键参数/接口 常见风险
导航到点位 动作 NavigateToPose、反馈频率 目标不可达、超时未取消
图像采集 话题 + 服务 /camera/image、触发服务 QoS 不匹配导致丢帧
状态上报 话题 /task_status、频率 1Hz 消息积压、延迟增大
参数调整 参数服务 set_parameters、回调 运行时参数未生效
异常恢复 动作 + 行为树 重试节点、回退节点 死循环、状态未复位

五、误区与复盘:初学者最容易踩的坑

  • 用话题做任务控制:话题适合流数据,不适合“下发目标并等待结果”,否则需要自行维护请求ID与超时,容易出错。
  • 忽略 QoS 兼容性:发布者与订阅者的可靠性、持久性不匹配时,会出现“能连上但收不到数据”的现象。
  • 把调度逻辑塞进执行节点:导航节点只应负责导航,任务顺序应由行为树或状态机管理,否则复用性极差。
  • 不处理取消与超时:动作被取消后,服务器必须及时停止并释放资源,否则会出现“幽灵运动”。
  • 缺少可观测性:没有状态话题与日志分级,排障时只能靠猜,建议从第一天就设计 /task_status 与诊断信息。
建议在学习每个通信机制时,都问三个问题:谁发、谁收、失败怎么办。把这三个问题回答清楚,任务系统的健壮性会显著提升。
不要为了“看起来高级”而全部使用动作。高频控制指令(如 /cmd_vel)仍应使用话题;只有需要目标—反馈—结果闭环的任务,才使用动作。

本课程后续将围绕上述框架逐层展开:先夯实话题、服务、动作与 QoS 的通信基础,再进入行为树与状态机的编排方法,最后通过移动机器人巡检项目完成集成与复盘。掌握这套方法后,你不仅能写出可运行的 ROS2 节点,更能设计出可维护、可观测、可恢复的任务系统。