ros2-如何创建一个简单的服务

服务通讯是ROS 2中节点通讯的另一种方式,与话题通讯不同,服务通讯具有反馈机制,即客户端发送请求后,服务器处理请求并返回结果。这在需要确认操作结果的场景中非常有用。以下是如何使用Python实现ROS 2节点之间的服务通讯的详细说明。

步骤概述

  1. 创建工作空间和包
  2. 编写服务端节点
  3. 编写客户端节点
  4. 配置和编译包
  5. 运行服务和客户端

1. 创建工作空间和包

首先,在你的工作目录中创建一个ROS 2工作空间:

# 复制代码

mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build

然后,在工作空间中创建一个新的ROS 2包:

复制代码

cd ~/ros2_ws/src ros2 pkg create --build-type ament_python my_service_package

2. 编写服务端节点

my_service_package目录下,创建一个新的Python脚本,例如service_node.py

# my_service_package/my_service_package/service_node.py

import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts

class AddTwoIntsService(Node):

    def __init__(self):
        super().__init__('add_two_ints_service')
        self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)

    def add_two_ints_callback(self, request, response):
        response.sum = request.a + request.b
        self.get_logger().info(f'Incoming request: a={request.a}, b={request.b}, sum={response.sum}')
        return response

def main(args=None):
    rclpy.init(args=args)
    service = AddTwoIntsService()
    rclpy.spin(service)
    service.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

3. 编写客户端节点

my_service_package目录下,创建另一个Python脚本,例如client_node.py

# my_service_package/my_service_package/client_node.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.cli = self.create_client(AddTwoInts, 'add_two_ints')
        while not self.cli.wait_for_service(timeout_sec=1.0):
            self.get_logger().info('Service not available, waiting again...')
        self.req = AddTwoInts.Request()

    def send_request(self):
        self.req.a = int(sys.argv[1])
        self.req.b = int(sys.argv[2])
        self.future = self.cli.call_async(self.req)
        rclpy.spin_until_future_complete(self, self.future)
        return self.future.result()

def main(args=None):
    rclpy.init(args=args)
    client = AddTwoIntsClient()
    response = client.send_request()
    client.get_logger().info(f'Result of add_two_ints: {response.sum}')
    client.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

4. 配置和编译包

更新setup.py文件,添加入口点以便于启动节点:

from setuptools import setup

package_name = 'my_service_package'

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,
    maintainer='Your Name',
    maintainer_email='yourname@example.com',
    description='Examples of ROS 2 service communication',
    license='Apache License 2.0',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'service_node = my_service_package.service_node:main',
            'client_node = my_service_package.client_node:main',
        ],
    },
)

确保package.xml中包含以下依赖项:

<exec_depend>rclpy</exec_depend>
<exec_depend>example_interfaces</exec_depend>

在工作空间的根目录下编译包:

cd ~/ros2_ws colcon build

5. 运行服务和客户端

编译完成后,运行服务节点:

source ~/ros2_ws/install/setup.bash 
ros2 run my_service_package service_node

在另一个终端中,运行客户端节点:

source ~/ros2_ws/install/setup.bash
ros2 run my_service_package client_node 5 3

这里,client_node脚本会发送两个整数(5和3)到服务端,服务端将返回它们的和,并在客户端打印结果。

总结

通过以上步骤,你可以使用Python成功实现ROS 2中的服务通讯。服务端节点负责处理请求并返回结果,而客户端节点发送请求并接收结果。这种通讯方式适用于需要确认操作结果的场景,例如生成对象、计算任务等。

### 创建 ROS 2 功能包 在 ROS 2创建一个功能包涉及多个步骤,这些步骤确保新创建的功能包能够被正确编译并集成到工作空间中。 #### 工作区结构 为了保持良好的项目管理实践,建议将所有的源码文件放置于 `src` 目录下而不是工作空间的根目录。这意味着当准备在一个名为 `ros2_ws` 的工作区内创建新的功能包时,应当先进入该路径下的 `src` 文件夹[^2]: ```bash cd ~/ros2_ws/src ``` #### 使用命令行工具创建功能包 通过执行特定的命令来初始化一个新的 Catkin 包是非常简单的操作之一。对于 C++ 类型的服务端应用来说,可以利用如下所示的指令完成此过程,并指定依赖项如 `rclcpp` 来支持节点开发环境的需求: ```bash ros2 pkg create --build-type ament_cmake cpp_parameters --dependencies rclcpp ``` 这会自动设置好必要的配置文件以及构建脚本等内容,使得开发者可以直接开始编写业务逻辑代码而不必担心底层细节处理问题。 #### 构建与安装 一旦完成了所有必需资源(比如消息定义、服务接口或者动作类型)的设计之后,则可以通过调用 Colcon 命令来进行整个项目的增量式构建;如果希望加快速度还可以采用软链接的方式进行快速部署测试[^3]: ```bash colcon build --symlink-install --packages-select your_package_name ``` 上述命令中的 `--packages-select` 参数允许用户仅针对单个或几个选定的目标实施单独的操作流程优化效率。 #### 关键组成部分概述 Catkin 功能包通常至少包含以下几个部分: - **CMakeLists.txt**: 描述了如何编译这个包及其内部组件。 - **package.xml**: 提供关于包元数据的信息,包括版本号、维护者联系方式等。 - **source code directories (e.g., src/, include/)**: 存储实际的应用程序源代码。 - **launch files directory (optional)**: 如果有的话,用于启动复杂系统的描述文件集合。 - **resource folders like config or meshes for URDF models etc.** 综上所述,在 ROS 2 下建立一个全新的功能包不仅限于简单地运行几条 shell 指令,更重要的是理解各个构成要素之间的关系以便日后更好地管理和扩展自己的机器人应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值