教程参考官方tutorial初级篇:https://ros2docs.robook.org/humble/Tutorials/Beginner-CLI-Tools/Launching-Multiple-Nodes/Launching-Multiple-Nodes.html
用最通俗的方式讲:把 ROS2 想象成一个社会,里面每个程序(节点)都是一个人。那 topic、service、action 就是三种不同的"沟通方式"。
先看一张总览图,再逐个用小乌龟举例:
一、Topic 话题 —— “收音机广播”
通俗理解:有人拿着喇叭一直喊,谁想听就把耳朵凑过去,喊的人根本不管有几个人在听。
小乌龟里的例子:
turtle_teleop_key(键盘节点)不停往/turtle1/cmd_vel这个话题喊:“往左转!往前爬!”turtlesim_node(乌龟节点)订阅了这个话题,听到什么就动什么- 反过来,乌龟也在
/turtle1/pose上不停汇报自己的位置,谁想看谁就ros2 topic echo /turtle1/pose
特点:单向、持续不断、发了就不管了。适合:源源不断的数据流。
二、Service 服务 —— “打电话问事”
通俗理解:你主动拨号问一件事,对方处理完给你一个答复,然后挂断。一次一通电话,打完就结束。
小乌龟里的例子:
ros2 service call /clear std_srvs/srv/Empty—— 相当于你打电话说"帮我清空画布",画布立刻被擦干净,并回你一句"办好了"ros2 service call /spawn ...—— 你说"给我生成一只乌龟",它办完回你新乌龟的名字
特点:双向、一次就完、必须等到回复。适合:执行一个动作并拿到结果。
三、Action 动作 —— “点外卖”
通俗理解:你下一个要花时间的订单,然后可以随时查看"骑手到哪了",等不及还能取消订单,送到了给你最终结果。它是 Service 的"升级版"——多了进度反馈和可取消。
小乌龟里的例子:让乌龟转到 90°(这是要慢慢转的,不是瞬间完成):
ros2 action list# 可以看到 /turtle1/rotate_absoluteros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute"{theta: 1.57}"--feedback执行后你会看到:
- 目标被接受(你下的单)
- 反馈不断刷新(
--feedback让你看到"还差多少度"——就像"骑手还有 500 米") - 最终结果(转到位了,返回剩余角度)
特点:长任务、有进度、可取消。适合:耗时较长的动作。
怎么选?一句话口诀
| 你的需求 | 用哪个 |
|---|---|
| 要连续不断地传数据(传感器、速度) | Topic |
| 要立刻执行一件事并拿到结果(清空、生成) | Service |
| 要执行一个要花时间的大任务,还想看进度/能取消(转到某角度、导航到某点) | Action |
三者的关系(进阶理解)
Action 并不是完全独立的东西——它底层是"用 Topic 传进度和状态,用 Service 传目标和结果"组合出来的。所以你可以简单记成:
Topic = 广播(只发不管) Service = 一问一答(快,一次完成) Action = 一问一答 + 进度汇报 + 可取消(慢,分阶段完成)实际开发中的对应:让机器人走一小段用 Topic;让机器人拍一张照立刻返回用 Service;让机器人自主导航到房间另一头(要几分钟、要报进度、可能要取消)用Action。