1. 话题 (Topic)
话题 是ROS 2中最基本的通信方式,采用发布/订阅(Publish/Subscribe)模式,是一种异步、单向、多对多的通信机制。
-
特点:
- 发布者和订阅者解耦(不需要知道对方是否存在)
- 支持多个发布者向同一个话题发布消息
- 支持多个订阅者接收同一个话题的消息
- 数据流是单向的(持续传输)
-
适用场景:传感器数据流(如摄像头图像、激光雷达点云)、状态广播等持续更新的数据
2. 发布 (Publisher)
发布者是向特定话题发送消息的节点。
python
# Python示例
from std_msgs.msg import String
# 创建发布者
publisher = node.create_publisher(String, 'topic_name', 10) # 队列大小为10
# 发布消息
msg = String()
msg.data = 'Hello ROS 2'
publisher.publish(msg)
10是**QoS(服务质量)**的队列深度,用于控制消息缓存
3. 订阅 (Subscription)
订阅者是接收特定话题消息的节点。
python
# Python示例
def callback(msg):
node.get_logger().info(f'Received: {msg.data}')
# 创建订阅者
subscription = node.create_subscription(
String,
'topic_name',
callback,
10
)
- 当有新消息到达时,自动触发回调函数(callback)
- 订阅是被动的,不需要轮询检查
4. 服务 (Service)
服务 采用请求/响应(Request/Response)模式,是一种同步、双向、一对一的通信机制。
| 特性 | 话题 | 服务 |
|---|---|---|
| 通信模式 | 发布/订阅 | 请求/响应 |
| 方向性 | 单向 | 双向 |
| 关系 | 多对多 | 一对一 |
| 实时性 | 异步 | 同步(阻塞等待) |
| 适用场景 | 持续数据流 | 偶尔调用、需要反馈的操作 |
- 服务客户端(Client):发送请求并等待响应
- 服务端(Server):接收请求,处理完成后返回响应
python
# 服务端示例
from example_interfaces.srv import AddTwoInts
def add_callback(request, response):
response.sum = request.a + request.b
return response
service = node.create_service(AddTwoInts, 'add_two_ints', add_callback)
# 客户端示例
client = node.create_client(AddTwoInts, 'add_two_ints')
request = AddTwoInts.Request()
request.a = 2
request.b = 3
future = client.call_async(request) # 异步调用
总结对比
话题通信(异步广播):
[传感器节点] ──publish──► [/camera/image] ◄──subscribe── [处理节点A]
◄──subscribe── [处理节点B]
服务通信(同步调用):
[控制节点] ──request──► [计算节点] ──response──► [控制节点]
"请计算路径" 处理中... "这是路径结果"
选择建议:
- 需要持续传输数据 → 使用话题
- 需要偶尔调用并获取结果 → 使用服务(如获取参数、执行特定动作)
- 需要长时间运行并可能反馈进度 → 考虑Action(服务的扩展版)