9.ROS2笔记-服务

9.ROS2笔记-服务

背景

服务是ROS图中节点的另一种通信方法。服务基于呼叫和响应模型,而不是主题的发布者-订阅者模型。虽然主题允许节点订阅数据流并获得持续更新,但服务只有在客户端专门调用时才提供数据。
在这里插入图片描述
在这里插入图片描述

需要条件

本教程中提到的一些概念,如节点和主题,已在本系列以前的教程中介绍过。

你需要一个turtlesim软件包;安装和配置好ros2环境。

1.启动

启动两个turtlesim 节点 /turtlesim/teleop_turtle

在一个终端执行

ros2 run turtlesim turtlesim_node

打开另一个终端执行

ros2 run turtlesim turtle_teleop_key

2. ros2 service list

在一个新终端执行ros2 service list命令会列出系统当前活动的服务。

~$ ros2 service list 
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically

您将看到两个节点都有相同的六个服务,它们的名称中都有"parameters"。ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是参数构建的基础。在下一个教程中将有更多关于参数的内容。在本教程中,参数服务将从讨论中省略。

现在,让我们关注特定于turtlesim的服务,/clear、/kill、/reset、/spown、/turtle1/set_pen、/turle1/transport_absolute和/turtle1/transport_relative。您可能还记得在使用turtlesim、ros2和rqt教程中使用rqt与其中一些服务进行过交互。

3.ros2 sevice type

服务具有描述服务的请求和响应数据的结构的类型。服务类型的定义与主题类型类似,只是服务类型有两部分:一部分用于请求,另一部分用于响应。要查找服务的类型,请使用以下命令:

ros2 service type <service_name>

在一个新终端输出以下命令

~$ ros2 service type /clear
std_srvs/srv/Empty

Empty类型表示服务调用在发出请求时不发送数据,在接收响应时不接收数据。

要同时查看所有活动服务的类型,可以将–show types选项(缩写为-t)附加到list命令中:

~$ ros2 service list -t
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
/teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
/teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
/teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
/teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
/turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
/turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
/turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
/turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]

4 ros2 service find

如果要查找特定类型的所有服务,可以使用以下命令:

ros2 service find <type_name>

例如您可以这样查找所有的Empty类型服务:

~$ ros2 service find std_srvs/srv/Empty 
/clear
/reset

5 ros2 interface show

您可以通过命令调用服务,但首先你需要知道输入参数的结构。

ros2 interface show <type_name>

clear 服务类型typea上测试,

~$ ros2 interface  show std_srvs/srv/Empty 
---

—将请求结构(上图)与响应结构(下图)分离。但是,正如您之前了解到的,Empty类型不会发送或接收任何数据。所以,自然,它的结构是空白的。

让我们查看一个具有发送和接收数据类型的服务,比如/spown。根据ros2服务列表-t的结果,我们知道/spown的类型是turtlesim/srv/Spown。

要查看/spown服务的请求和响应参数,请运行以下命令:

~$ ros2 interface show turtlesim/srv/Spawn 
float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

—行上方的信息告诉我们调用/Spawn所需的参数。x、 y和θ决定海龟的2D姿势,而这个名字显然是可选的。

在这种情况下,您不需要知道下面的信息,但它可以帮助您了解从调用中获得的响应的数据类型

6 rosa2 service call

现在您已经知道了什么是服务类型,如何查找服务的类型,以及如何查找该类型参数的结构,您可以使用以下方法调用服务:

ros2 service call <service_name> <service_type> <arguments>

<arguments>部分是可选的。例如,您知道Empty类型的服务没有任何参数:

ros2 service call /clear std_srvs/srv/Empty

此命令将清除海龟在turtlesim窗口中绘制的任何线条.
在这里插入图片描述
在这里插入图片描述

现在,让我们通过调用/speew并设置参数来生成一只新海龟。命令行的服务调用中的输入<arguments>需要使用YAML语法。

~$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2,y: 2,theta: 0.2,name: ''}"
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

response:
turtlesim.srv.Spawn_Response(name='turtle2')

您的turtlesim窗口将立即更新一个海龟

在这里插入图片描述

总结

节点可以使用ROS 2中的服务进行通信。与主题(一种单向通信模式,节点发布一个或多个订阅者可以使用的信息)不同,服务是一种请求/响应模式,客户端向提供服务的节点发出请求,服务处理请求并生成响应。

您通常不希望使用服务进行连续调用,话题甚至动作会更适合。

在本教程中,您使用了命令行工具来识别、查看和调用服务。

ROS 2 (Robot Operating System)构建过程通常涉及安装依赖、下载包、设置工作空间和编译节点等步骤。以下是构建ROS 2的基本流程: 1. **安装依赖**:首先确保你的系统满足ROS 2的最低要求,如Ubuntu 20.04或更高版本。然后安装必要的开发工具,比如`git`, `catkin_tools`, 和`colcon`(ROS 2的构建工具)。 ```sh sudo apt update && sudo apt install -y git curl cmake python3-venv colcon ``` 2. **创建工作空间**:在你选择的位置创建一个新的ROS 2工作空间,它是一个自包含目录用于管理项目依赖和构建文件。 ```sh mkdir -p ~/my_workspace cd ~/my_workspace source /opt/ros/${ros_distro}/setup.bash colcon init ``` 3. **克隆ROS 2包**:从GitHub或其他源获取你想要使用的ROS 2包,替换`package_name`为你感兴趣的包名。 ```sh git clone https://github.com/ros2/${package_name}.git ``` 4. **添加和构建包**:将新克隆的包添加到工作区,并使用`colcon build`命令进行构建。如果需要,可以同时构建所有依赖。 ```sh cd ${package_name} colcon build --symlink-install ``` 5. **测试和运行**:成功构建后,你可以通过运行`colcon test`来验证包功能。要启动节点,通常会在`src`目录下找到相应的启动脚本。 6. **发布和管理**:如果你计划共享你的包,可以考虑将它们推送到官方仓库或建立私有仓库。 注意:这个过程可能会因ROS 2的版本更新而有所变化,所以建议访问ROS 2的官方文档以获取最新指南。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy_Robot

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值