以下是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

关键点说明

  1. 服务接口:通过.srv文件定义结构,ROS2自动生成Python接口
  2. 服务端
    • 使用create_service创建服务
    • 回调函数处理请求并返回响应
  3. 客户端
    • 使用create_client创建客户端
    • call_async异步发送请求
    • spin_until_future_complete等待响应
  4. 配置:通过setup.py注册可执行节点

常见问题处理

  • 服务未找到:检查服务名是否一致(如add_two_ints
  • 编译失败:确保package.xml包含<exec_depend>python_srvcli</exec_depend>
  • 运行时错误:使用rqt_graph检查节点连接状态

通过以上步骤,您可实现ROS2中基于Python的服务通信。实际开发中,可根据需求自定义服务接口(如修改.srv文件)并扩展处理逻辑。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐