大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上一篇中,我们一起了解ROS 2中Topic, 这一篇,我们主要会围绕ROS中另外一个重要的概念“Services ”,详细介绍其具体的命令行操作指令。
目录
1 、启动模拟节点
2、 ros2 service list(列表)
3、 ros2 service type(类型)
3.1 ros2 service list -t
4 、ros2 service find(查找)
5 、ros2 interface show(接口展示)
6 、ros2 service call(手动调用)
服务(Services)是ROS图上,节点的另一种通信方法。服务基于呼叫和响应模型,而不是主题的发布者-订户模型。虽然主题允许节点订阅数据流并获得持续更新,但服务仅在客户端专门调用时提供数据。
可以有多节节点调用这个服务,但是一个服务的服务端,只能有一个。
1 、启动模拟节点
到现在,你应该可以轻松地启动turtlesim。打开一个终端,执行如下命令:
ros2 run turtlesim turtlesim_node
打开一个新的终端,启动遥控节点:
ros2 run turtlesim turtle_teleop_key
2、 ros2 service list(列表)
保持turtlesim 打开状态,再打开一个新的终端,执行“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
您将看到两个节点都有相同的六个服务,名称中都有参数。ROS 2中的几乎每个节点都有这些基础设施服务,这些服务是基于这些基础设施建立的。在下一个教程中将有更多关于参数的内容。在本教程中,参数服务将从讨论中省略。
#通用基础服务
/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
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically
现在,让我们重点关注特定于turtlesim的服务,/clear、/ckill、/reset、/subject、/turtle1/set_pen、/turle1/telest_absolute和/turtle1/telest_relateve。您可能还记得在“介绍turtlesim和rqt”教程中使用rqt与其中一些服务进行交互。
3、 ros2 service type(类型)
服务的类型描述了服务的请求和响应数据的结构。服务类型的定义与主题类型类似,但服务类型有两部分:一部分用于请求,另一部分用于响应。要查找服务类型,请使用以下命令:
ros2 service type <service_name>
让我们来看看turtlesim/clear服务。在新终端中,输入命令:
#命令
ros2 service type /clear
#回复
std_srvs/srv/Empty
Empty 类型表示服务调用在发出请求时不发送数据,而在接收响应时不接收数据。
3.1 ros2 service list -t
要同时查看所有活动服务的类型,可以将--show types选项(缩写为-t)附加到列表命令中:
#命令
ros2 service list -t
我们可以得到如下回复:
nvidia@ubuntu:~$ 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
得到如下回复:
nvidia@ubuntu:~$ ros2 service find std_srvs/srv/Empty
/clear
/reset
5 、ros2 interface show(接口展示)
您可以从命令行调用服务,但首先需要知道输入参数的结构。
ros2 interface show <type_name>.srv
To run this command on the /clear
service’s type, Empty
:
ros2 interface show std_srvs/srv/Empty.srv
#回复
nvidia@ubuntu:~$ ros2 interface show std_srvs/srv/Empty.srv
---
---将请求结构(上面)与响应结构(下面)分开。但是,正如您之前所了解的,Empty类型不会发送或接收任何数据。因此,它的结构自然是空白的。
让我们找一个具有发送和接收数据的类型的服务,例如/spown。从ros2服务列表-t的结果中,我们知道/spown的类型是turtlesim/srv/spown。要查看/spown调用和请求中的参数,请运行以下命令:
#命令
ros2 interface show turtlesim/srv/Spawn.srv
#回复
nvidia@ubuntu:~$ ros2 interface show turtlesim/srv/Spawn.srv
float32 x
float32 y
float32 theta
string name # Optional. A unique name will be created and returned if this is empty
---
string name
---行上方的信息告诉我们调用/生成所需的参数。x、 y和theta决定了生成的海龟的位置,名字显然是可选的。在这种情况下,下面的信息不是您需要知道的,但它可以帮助您了解从呼叫中获得的响应的数据类型。
6 、ros2 service call(手动调用)
现在您知道了什么是服务类型,如何查找服务类型,以及如何查找该类型参数的结构,您可以使用以下方法调用服务:
ros2 service call <service_name> <service_type> <arguments>
<arguments>部分是可选的。例如,您知道Empty类型服务没有任何参数:
ros2 service call /clear std_srvs/srv/Empty
此命令将清除您的乌龟绘制的所有线条。
现在,让我们通过调用/生成并输入参数来生成一个新的海龟。命令行服务调用中的输入<arguments>需要采用YAML语法。输入命令:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
您将获得正在发生的事情的这种方法式视图,然后是服务响应:
waiting for service to become available...
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='None')
response:
turtlesim.srv.Spawn_Response(name='None')
您的turtlesim窗口将立即更新新出生的海龟:
节点可以使用ROS 2中的服务进行通信。只有当节点明确请求信息时,服务才会将信息传递给该节点,并且每个请求只传递一次(而不是在连续流中)。您通常不想使用服务进行连续呼叫;主题或甚至行动将更适合。
以上就是我今天要分享的内容。纠错,疑问,交流: 911946883@qq.com