6. Action(动作):带反馈、可取消的长任务
6.1 核心概念(先搞懂是什么)
Action 是 ROS2 里专门处理耗时久、需要中间反馈、还能随时取消的任务的通信方式。
- 专业名词拆解:
- Goal(目标):你给 Action 下达的任务(比如 “导航到 (1,2) 点”)。
- Feedback(反馈):任务执行中持续返回的状态(比如导航时 “距离目标还有 0.5 米”“当前速度 0.2m/s”)。
- Result(结果):任务完成后返回的最终状态(比如 “导航成功”/“导航失败,原因:目标点不可达”)。
- Cancel(取消):任务执行中可以中断(比如导航时突然改主意,取消本次导航)。
- 对比 Service(服务):Service 是 “一问一答”,只能等任务结束才返回结果,中间没反馈、也不能取消(比如问 “机器人当前位置?”,立刻回答,这适合用 Service)。
6.2 考点提炼(考试直接用)
| 题型 | 核心答案 |
|---|---|
| 单选题(6-1) | Action 比 Service 的优势:支持反馈与取消(答案 B) |
| 简答题(6-2) | 导航适合 Action 的原因:1. 导航耗时较长;2. 需要持续反馈(距离、进度);3. 可能需要取消(临时避障 / 改目标)。 |
| 场景题(6-3) | 导航无反馈 / 无结果的排查点(记 4 个即可):1. action server 是否存在 / 激活(比如 nav2 没启动);2. TF 坐标树是否完整(map→odom→base_link);3. 传感器 / 代价地图正常吗(比如激光雷达 /scan 话题没数据);4. 目标点是否在不可达区域(比如在墙里)。 |
6.3 常用命令(记下来,考到直接写)
bash
运行
ros2 action list # 列出所有正在运行的Action ros2 action info <action名> # 查看某个Action的详细信息(比如类型、服务器) ros2 action send_goal <action名> <目标类型> "目标参数" # 发送Action目标(比如导航目标)7. Interface(接口):msg/srv/action 定义与自定义
7.1 核心概念(先搞懂是什么)
Interface 是 ROS2 中不同节点之间 “沟通的语言”,分三种:
- 专业名词拆解:
- msg(消息):单向通信(比如传感器数据、机器人速度指令),对应 Topic(话题)通信。例:
geometry_msgs/msg/Twist(机器人速度指令,包含线速度和角速度)。 - srv(服务):双向一问一答,对应 Service(服务)通信。例:
std_srvs/srv/Empty(空服务,只请求不传数据,比如 “让机器人停止”)。 - action(动作):带反馈 / 取消的长任务,对应 Action(动作)通信。例:
nav2_msgs/action/NavigateToPose(导航动作,包含目标、反馈、结果)。
- msg(消息):单向通信(比如传感器数据、机器人速度指令),对应 Topic(话题)通信。例:
7.2 考点提炼(考试直接用)
| 题型 | 核心答案 |
|---|---|
| 单选题(7-1) | 查看 Twist 消息结构:ros2 interface show geometry_msgs/msg/Twist(答案 B) |
| 简答题(7-2) | 自定义接口编译时声明依赖的文件:1. package.xml:加 build_depend(编译依赖)和 exec_depend(运行依赖);2. CMakeLists.txt:find_package 找依赖 + rosidl_generate_interfaces 生成接口 + ament_export_dependencies 导出依赖。 |
| 场景题(7-3) | 自定义 msg 编译过但运行找不到的排查点:1. 有没有 source 当前工作空间的 setup.bash(source install/setup.bash);2. Python 包是否正确安装、entry_points 配置对不对;3. 是不是被其他工作空间的同名接口覆盖了;4. 有没有忘记加ament_export_dependencies(rosidl_default_runtime)。 |
7.3 关键操作(理解即可,考试考概念)
- 查看接口结构:
ros2 interface show <接口类型>(比如ros2 interface show geometry_msgs/msg/Twist)。 - 自定义接口核心:必须在
package.xml和CMakeLists.txt里声明依赖,否则编译 / 运行会报错。
8. QoS(服务质量):控制数据传输的规则
8.1 核心概念(先搞懂是什么)
QoS 是 ROS2 中 “约定数据怎么传” 的规则,解决不同场景下的传输需求(比如要不要保证数据不丢、新订阅者能不能拿到历史数据)。
- 核心 QoS 参数(必考):
参数 含义 Reliability 可靠性:RELIABLE(可靠,保证数据不丢,重传丢失的包);BEST_EFFORT(尽力而为,丢包不重传,速度快)。 Durability 持久性:VOLATILE(易失,新订阅者只能拿到订阅后的新数据);TRANSIENT_LOCAL(本地暂存,新订阅者能立刻拿到最新的历史数据)。 History/Depth 历史策略:KEEP_LAST (n)(只保留最后 n 条数据);KEEP_ALL(保留所有数据,少用)。
8.2 考点提炼(考试直接用)
| 题型 | 核心答案 |
|---|---|
| 单选题(8-1) | 新订阅者立刻拿到最新地图:TRANSIENT_LOCAL(答案 B) |
| 简答题(8-2) | 常用话题的 QoS 组合:1. /scan(激光雷达):BEST_EFFORT + KEEP_LAST (5~10)(高频、允许丢少量包,低延迟);2. /map(地图):RELIABLE + TRANSIENT_LOCAL(地图重要不丢包,新订阅者能拿到);3. /cmd_vel(速度指令):RELIABLE + KEEP_LAST (1)(指令要可靠,只需要最新的,避免积压)。 |
| 场景题(8-3) | rosbag2 回放看不到数据的原因 + 处理:原因:回放端和订阅端 QoS 不匹配(比如回放用 RELIABLE,订阅用 BEST_EFFORT),导致数据匹配失败;处理:调整订阅端 QoS(传感器用 BEST_EFFORT,地图用 TRANSIENT_LOCAL),或用 QoS 覆盖配置文件。 |
8.3 记忆技巧
- 传感器(/scan、/image):BEST_EFFORT(快,允许丢包)+ KEEP_LAST。
- 关键数据(/map、/cmd_vel):RELIABLE(不丢包);地图额外加 TRANSIENT_LOCAL。
9. Parameter(参数):节点的配置项
9.1 核心概念(先搞懂是什么)
Parameter 是 ROS2 节点的 “配置参数”,比如机器人的速度上限、PID 参数、是否启用仿真时间,都可以用参数设置。
- 专业名词拆解:
- declare_parameter:声明参数(ROS2 强制推荐!先声明 “参数名、类型、默认值”,再使用)。
- 动态参数:运行时可以修改的参数(比如在线调 PID),修改时可以加回调函数校验。
9.2 考点提炼(考试直接用)
| 题型 | 核心答案 |
|---|---|
| 单选题(9-1) | 启用仿真时间:use_sim_time(答案 A) |
| 简答题(9-2) | ROS2 推荐先 declare 再 set 的原因:1. 防止拼写错误导致 “悄悄创建不存在的参数”;2. 明确参数类型和默认值,避免类型错误;3. 方便用 launch/YAML/ 工具管理参数。 |
| 场景题(9-3) | 调 PID 后机器人抖动的安全机制:1. 参数回调中加范围限制 + 平滑(比如每次修改步长不超过 0.1,渐变生效);2. 关键参数加保护(修改需要确认 / 密码);3. 记录参数变更日志,支持回滚到上一次稳定值。 |
9.3 常用命令(记下来)
bash
运行
ros2 param list # 列出节点的所有参数 ros2 param get <节点名> <参数名> # 获取参数值 ros2 param set <节点名> <参数名> <值> # 设置参数值 ros2 param dump <节点名> # 导出节点所有参数到文件10. Launch、Remap、Namespace:系统编排与多机器人
10.1 核心概念(先搞懂是什么)
- Launch:ROS2 的 “启动脚本”,可以一次性启动多个节点、传参数、重映射话题、设置命名空间,不用手动一个个启动。
- Remap(重映射):修改话题 / 服务 / Action 的名字(比如把机器人 1 的 /cmd_vel 改成 /robot1/cmd_vel)。
- Namespace(命名空间):给节点 / 话题加 “前缀”,隔离多机器人的通信(比如机器人 1 的所有话题都放在 /robot1 / 下)。
10.2 考点提炼(考试直接用)
| 题型 | 核心答案 |
|---|---|
| 单选题(10-1) | 重映射 /cmd_vel:launch / 命令行 remap(答案 B) |
| 简答题(10-2) | Namespace 在多机器人中的作用:1. 避免话题 / 服务 / Action 名冲突(比如两台机器人都有 /cmd_vel,加前缀后变成 /robot1/cmd_vel 和 /robot2/cmd_vel);2. 调试更清晰,能区分不同机器人的消息;3. 跨机部署时容易统一管理。 |
| 场景题(10-3) | RViz 位姿跳变的原因 + 解决:原因:两台机器人的 TF 坐标系名冲突(都用 base_link、odom),导致 TF 树混乱;解决:给坐标系加前缀(比如 robot1/base_link、robot2/base_link),或设置 tf_prefix 参数,确保每台机器人的 TF 唯一。 |
10.3 关键技巧
- 多机器人核心:Namespace 隔离话题 + TF 坐标系加前缀,避免所有 “重名” 问题。
- Remap 常用方式:在 launch 文件里写
remap_rule=[('/原话题名', '/新话题名')],或命令行加--ros-args --remap /cmd_vel:=/robot1/cmd_vel。
考试通关总结(必背)
核心考点速记
- Action:核心优势是支持反馈与取消,适合长任务(导航);排查导航问题先看 action server 和 TF。
- 接口:查看结构用
ros2 interface show;自定义接口必须改package.xml和CMakeLists.txt,运行前要 source。 - QoS:地图用 TRANSIENT_LOCAL,传感器用 BEST_EFFORT,指令用 RELIABLE+KEEP_LAST (1);bag 回放问题多是 QoS 不匹配。
- 参数:启用仿真时间是
use_sim_time;先 declare 再 set 避免错误;调参数要加范围 / 平滑 / 回滚保护。 - 多机器人:Namespace 隔离话题,TF 加前缀避免冲突;Remap 主要在 launch / 命令行设置。
答题技巧
- 单选题:直接记答案(比如 Action 选 B、QoS 选 B、参数选 A、Remap 选 B)。
- 简答题:按 “1、2、3” 分点答,和参考答案要点一致即可(不用多写,考点踩中就得分)。
- 场景题:先答 “原因”,再答 “解决方法”,分点列,优先写参考答案里的要点(比如导航无反馈先查 action server 和 TF)。