ros2 服务创建与调用范例 python
以下是ROS2中服务创建与调用的Python完整范例,包含服务接口定义、服务端/客户端实现及配置文件:
1. 服务接口定义
在srv
目录下创建AddTwoInts.srv
文件:
int64 a
int64 b
---
int64 sum
2. 服务端实现 (add_two_ints_server.py
)
from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Nodeclass ServiceServer(Node):def __init__(self):super().__init__('add_two_ints_server')self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.handle_request)self.get_logger().info("Service ready")def handle_request(self, request, response):response.sum = request.a + request.bself.get_logger().info(f"Request: {request.a} + {request.b}")return responsedef main():rclpy.init()node = ServiceServer()rclpy.spin(node)rclpy.shutdown()if __name__ == '__main__':main()
3. 客户端实现 (add_two_ints_client.py
)
from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node
from rclpy.executors import MultiThreadedExecutorclass ServiceClient(Node):def __init__(self):super().__init__('add_two_ints_client')self.cli = self.create_client(AddTwoInts, 'add_two_ints')while not self.cli.wait_for_service(timeout_sec=1.0):self.get_logger().info("Waiting for service...")self.req = AddTwoInts.Request()def send_request(self, a, b):self.req.a = aself.req.b = bself.future = self.cli.call_async(self.req)rclpy.spin_until_future_complete(self, self.future)return self.future.result()def main():rclpy.init()node = ServiceClient()response = node.send_request(5, 3)node.get_logger().info(f"Result: {response.sum}")rclpy.shutdown()if __name__ == '__main__':main()
4. 配置文件 (setup.py
)
from setuptools import setup
from glob import globpackage_name = 'py_srvcli'setup(name=package_name,version='0.0.0',packages=[package_name],data_files=[('share/ament_index/resource_index/packages', ['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,entry_points={'console_scripts': ['server = py_srvcli.add_two_ints_server:main','client = py_srvcli.add_two_ints_client:main',],},
)
5. 编译与运行
# 编译
colcon build --packages-select py_srvcli# 启动服务端
source install/setup.bash
ros2 run py_srvcli server# 启动客户端
ros2 run py_srvcli client
关键点说明
- 服务接口:通过
.srv
文件定义结构,ROS2自动生成Python接口 - 服务端:
- 使用
create_service
创建服务 - 回调函数处理请求并返回响应
- 使用
- 客户端:
- 使用
create_client
创建客户端 call_async
异步发送请求spin_until_future_complete
等待响应
- 使用
- 配置:通过
setup.py
注册可执行节点
常见问题处理
- 服务未找到:检查服务名是否一致(如
add_two_ints
) - 编译失败:确保
package.xml
包含<exec_depend>python_srvcli</exec_depend>
- 运行时错误:使用
rqt_graph
检查节点连接状态
通过以上步骤,您可实现ROS2中基于Python的服务通信。实际开发中,可根据需求自定义服务接口(如修改.srv
文件)并扩展处理逻辑。