介绍
在ROS 2中,服务指的是远程过程调用,client调用server,server节点收到数据后计算出结果并返回给client.
服务通常期望能快速返回,因此不应当用于处理长时间的任务; 若有长时间的任务可以考虑使用 ros2 中的行为 act.
在ros2中,服务的请求和响应结构通常被定义到一个 .srv 的文件中。本文基于python案例,从零开始创建一个计算 a + b 的服务。
创建步骤
-
新建 dev_ws 并初始化依赖信息
$ mkdir -p dev_ws/src $ cd dev_ws $ rosdep install -i --from-path src --rosdistro jazzy -y 输出: #All required rosdeps installed successfully
-
创建 interfaces, 新增 AddTwoInts.srv
2.1 创建 pkg 并新增 srv/AddTwoInts.srv$ cd dev_ws/src $ ros2 pkg create --build-type ament_cmake --license Apache-2.0 example_interfaces cd dev_ws/src/example_interfaces $ mkdir srv $ vim srv/AddTwoInts.srv int64 a int64 b --- int64 sum
2.2 在CMakeLists中新增依赖
$ cd dev_ws/src/example_interfaces $ vim CMakeLists.txt # 新增如下内容 find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "srv/AddTwoInts.srv" )
2.3 在package.xml下新增如下内容
<buildtool_depend>rosidl_default_generators</buildtool_depend> <exec_depend>rosidl_default_runtime</exec_depend> <member_of_group>rosidl_interface_packages</member_of_group>
-
创建service包
在 src目录创建包$ cd dev_ws/src $ ros2 pkg create --build-type ament_python --license Apache-2.0 py_srvcli --dependencies rclpy example_interfaces
3.1 新增 service_member_function.py
vim py_srvcli/py_srvcli/service_member_function.pyfrom example_interfaces.srv import AddTwoInts import rclpy from rclpy.node import Node class MinimalService(Node): def __init__