ROS2学习笔记(四)从turtlesim学习ROS2服务

从turtlesim学习ROS2服务

前言

学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。

Ubuntu版本:20.04

ROS版本:Foxy

学习笔记回顾

1.ROS2服务

服务是ROS2中的另一种通讯方式,相比较于话题不同,话题通信是基于订阅和发布机制的,发布者在没有订阅着的情况下也会发布数据,这种方式适合持续的数据收发,如传感器的数据。而服务是基于客户端与服务器模型的通信机制,服务器只在接收到客户端的数据才会提供反馈数据,如下图所示。
在这里插入图片描述

在这里插入图片描述

2.启动海龟模拟器

$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key

3.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

其中有6个包含parameters的服务,在ROS2中,每个节点都会有这几个服务,主要用来设置一些参数,是节点的默认服务配置,在这我们主要研究小海龟提供的参数。

4.ros2 service type

和话题类似,服务也有数据类型,服务的类型描述了服务请求和响应数据的结构。使用如下命令查看:

$ ros2 service type <service_name>

/clear服务为例子,命令如下:

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

Empty类型表示请求发送的数据为空,发送请求时不需要任何数据。

5.ros2 service list -t

想要快速且同时查看所有服务的数据类型,可以使用如下命令查看:

$ ros2 service list -t
----
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...

-t--show-types的缩写。

6.ros2 service find

ROS2提供了根据数据类型查找响应服务的命令:

$ ros2 service find <type_name>

可以查找使用到Empty数据类型的服务:

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

7.ros2 interface show

知道了数据类型,还可以使用该命令查看数据的结构:

$ ros2 interface show <type_name>.srv

比如查找Empty数据类型:

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

---在服务的数据结构中是用来分割请求和应答两个部分的数据。因为Empty数据类型不会发送或者接收任何数据,所以它的结构是空白的。

在使用相同的方式查看Spawn数据结构,上面已经使用ros2 service list -t命令查看到该服务的数据类型是turtlesim/srv/Spawn

$ 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,ytheta确定新海龟的位置,name参数是可选的。应答数据为name

8.ros2 service call

现在已经知道了服务的数据类型、如何查找服务类型和如何查找数据的结构,现在可以使用如下参数调用服务:

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

<arguments>参数是可选的,像Empty数据类型是没有任何参数的。

$ ros2 service call /clear std_srvs/srv/Empty

该命令会清除小海龟所绘制的所有线条:
在这里插入图片描述

接下来调用/spawn服务生成一个新的海龟。
<arguments>参数需要输入上面的数据了:

$ 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')

可以在小海龟模拟器中看到在左下角生成了新的海龟。
在这里插入图片描述

总结

服务是客户端发送请求,服务端接收请求处理好后反馈应答,通信只会交互一次数据,不像话题是连续发送数据的。

Reference:

https://docs.ros.org/en/foxy/Tutorials/Services/Understanding-ROS2-Services.html#

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接

Guess you like

Origin blog.csdn.net/xiaokai1999/article/details/118873392