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 Node
class 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.b
self.get_logger().info(f"Request: {request.a} + {request.b}")
return response
def 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 MultiThreadedExecutor
class 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 = a
self.req.b = b
self.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 glob
package_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文件)并扩展处理逻辑。
更多推荐

所有评论(0)