从turtlesim学习ROS2服务
前言
学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。
Ubuntu版本:20.04
ROS版本:Foxy
学习笔记回顾
- ROS2学习笔记(一)获取文档
- ubuntu20.04 安装ROS2和ROS1共存
- ROS2学习笔记(二)从turtlesim学习ROS2节点
- ROS2学习笔记(三)从turtlesim学习ROS2主题
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
,y
和theta
确定新海龟的位置,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#
结语
本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接