文章目录
ROS2 服务实例:探索与实践
一、ROS2服务的基本概念
ROS2中的服务允许一个节点(服务服务器)接收来自另一个节点(服务客户端)的请求,并返回相应的响应。这种机制非常适合那些需要即时反馈的任务,如设置机器人参数、查询传感器状态等。服务通常由一个接口定义,包括请求和响应的消息类型,这些消息类型可以是ROS2中的任何标准或自定义消息。
二、创建ROS2服务实例
以下是一个简单的ROS2服务实例,用于演示如何创建一个服务服务器和一个服务客户端。
1. 定义服务接口
首先,我们需要在ROS2接口文件中定义服务的请求和响应消息类型。例如,创建一个名为AddTwoInts
的服务,该服务接收两个整数作为请求,返回它们的和作为响应。
**add_two_ints.srv**
int64 a
int64 b
int64 sum
2. 实现服务服务器
服务服务器将监听来自客户端的请求,并计算两个整数的和。
**add_two_ints_server.py**
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class AddTwoIntsServer(Node):
def __init__(self):
super().__init__('add_two_ints_server')
self.service = self.create_service(AddTwoInts, 'add_two_ints', self.handle_add_two_ints)
self.service_name = 'add_two_ints'
self.get_logger().info(f'{self.service_name} service ready.')
def handle_add_two_ints(self, request, response):
response.sum = request.a + request.b
self.get_logger().info(f'Returning [{request.a} + {request.b} = {response.sum}]')
return response
def main(args=None):
rclpy.init(args=args)
add_two_ints_server = AddTwoIntsServer()
rclpy.spin(add_two_ints_server)
add_two_ints_server.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
3. 实现服务客户端
服务客户端将发送请求给服务器,并接收响应。
**add_two_ints_client.py**
import sys
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class AddTwoIntsClient(Node):
def __init__(self):
super().__init__('add_two_ints_client')
self.service_proxy = self.create_client(AddTwoInts, 'add_two_ints')
self.wait_for_service(self.service_proxy)
def wait_for_service(self, service_proxy):
while not service_proxy.wait_for_service(timeout=1.0):
self.get_logger().info('Service not available, waiting again...')
def call_service(self, a, b):
req = AddTwoInts.Request()
req.a = a
req.b = b
res = self.service_proxy.call(req)
if res.sum == a + b:
self.get_logger().info(f'Success: {a} + {b} = {res.sum}')
else:
self.get_logger().error(f'Failed: {a} + {b} != {res.sum}')
def main(args=None):
rclpy.init(args=args)
add_two_ints_client = AddTwoIntsClient()
add_two_ints_client.call_service(10, 20)
rclpy.shutdown()
if __name__ == '__main__':
main()
三、运行实例
在ROS2工作空间中编译上述代码后,我们可以分别启动服务服务器和服务客户端。首先,在一个终端中运行服务服务器:
ros2 run your_package_name add_two_ints_server
然后,在另一个终端中运行服务客户端:
ros2 run your_package_name add_two_ints_client
如果一切正常,你应该会在客户端的输出中看到成功的消息,表明服务请求已被成功处理并返回了正确的响应。
标签:__,service,探索,self,two,add,实例,ints,ROS2 From: https://blog.csdn.net/u013050118/article/details/144230968