返回

ROS2中的服务:解锁强大请求/响应通信

后端

ROS2 服务:可靠的机器人通信机制

服务概述

ROS2(机器人操作系统 2)中的服务提供了一种请求/响应通信模式,使节点能够高效地相互通信和交换信息。服务由三个核心元素组成:服务名称、请求消息类型和响应消息类型。

工作原理

客户端节点向服务端节点发送包含请求数据的请求消息。服务端节点处理请求,根据请求数据执行操作,然后返回包含操作结果的响应消息。客户端节点接收响应消息,并进一步处理和使用响应数据。

应用场景

ROS2 服务广泛应用于机器人应用中,包括:

  • 传感器数据获取: 请求传感器实时数据(图像、雷达)
  • 机器人运动控制: 控制机器人运动(移动、动作)
  • 参数设置: 设置机器人参数(速度、加速度)
  • 任务规划: 规划机器人任务(路径、运动)

使用指南

在 ROS2 中使用服务非常简单:

  1. 客户端: 创建服务客户端,并使用 create_client 函数创建客户端对象。
  2. 服务端: 创建服务服务器,并使用 create_service 函数创建服务器对象。
  3. 通信: 客户端发送请求消息,服务端处理请求并返回响应消息。

示例代码

# 客户端节点
import rclpy
from example_interfaces.srv import AddTwoInts

def main(args=None):
    rclpy.init(args=args)

    # 创建服务客户端
    client = rclpy.create_client(AddTwoInts, "/add_two_ints")

    while not client.wait_for_service(timeout_sec=1.0):
        rclpy.logger.info("Waiting for service...")

    # 创建请求消息
    request = AddTwoInts.Request()
    request.a = 3
    request.b = 5

    # 发送请求消息并等待响应
    future = client.call_async(request)
    rclpy.spin_until_future_complete(future)

    if future.result() is not None:
        response = future.result()
        print(f"Result: {response.sum}")

    rclpy.shutdown()


if __name__ == "__main__":
    main()
# 服务端节点
import rclpy
from example_interfaces.srv import AddTwoInts

def add_two_ints_callback(request, response):
    response.sum = request.a + request.b
    return response

def main(args=None):
    rclpy.init(args=args)

    # 创建服务服务器
    server = rclpy.create_service(AddTwoInts, "/add_two_ints", add_two_ints_callback)

    rclpy.spin(server)

if __name__ == "__main__":
    main()

常见问题解答

1. 如何确定要使用哪个服务名称?
服务名称应唯一且性,以清楚地识别服务的功能。

2. 请求和响应消息类型是否可以是同一类型?
不,请求和响应消息类型通常不同,因为它们代表不同的数据结构。

3. 服务可以具有多个客户端吗?
是的,多个客户端可以同时访问同一个服务,服务端节点将为每个客户端提供服务。

4. 服务可以同时处理多个请求吗?
这取决于服务端节点的实现,有些服务可以同时处理多个请求,而有些服务一次只能处理一个请求。

5. 如何在服务端节点中获取请求数据?
服务端回调函数的第一个参数包含请求数据。