• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

ROS2入门教程——7. 理解服务(Service)

人工智能 古月 1442次浏览 0个评论

之前讲的话题通信是基于订阅/发布机制的,无论有没有订阅者,发布者都会周期发布数据,这种模式适合持续数据的收发,比如传感器数据。机器人系统中还有另外一些配置性质的数据,并不需要周期处理,此时就要用到另外一种ROS通信方式——服务(Service)。   服务是基于客户端/服务器模型的通信机制,服务器端只在接收到客户端请求时才会提供反馈数据。   ROS2入门教程——7. 理解服务(Service) ROS2入门教程——7. 理解服务(Service)

接下来还是以海龟仿真为例,看看里边有哪些服务的应用呢?  

1.启动海龟仿真器

还是用这两个命令来启动海龟仿真器:

ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key

 

2.查看服务列表

在小海龟背后,有哪些服务呢?可以使用“ros2 service list”命令来查看一下:   ROS2入门教程——7. 理解服务(Service)   在列表中可以看到每个节点都有6个以“parameters”结尾的服务,在ROS2中,几乎每一个节点都会有这几个服务,主要是用来设置一些参数的,算是节点的默认服务配置,这里我们暂时忽略这些默认的服务,主要看其他几个海龟仿真器提供的功能性质的服务。  

3.ros2服务类型

类似话题中的消息,服务中完成通信的数据也是有数据结构的,只不过是有请求和应答两部分的数据组成的。我们可以通过以下命令来查看某一个服务的数据结构:

ros2 service type <service_name>

  以/clear服务为例,可以这样来试试:

ros2 service type /clear

  看到的服务数据结构是这样的: ROS2入门教程——7. 理解服务(Service)   Empty类型表示服务请求部分的数据是没有的,发送请求的时候不需要任何数据。  

3.1 ros2 service list -t

  类似查看所有节点的话题消息类型,也可以用类似的方式查看所有服务的数据类型,需要在list命令后边加上“–show-types”配置,或者简写为“-t”。   ROS2入门教程——7. 理解服务(Service)  

4.查找提供某类型数据的所有服务

ROS2还允许查看所有提供同样数据类型的的服务,可以使用如下命令:

ros2 service find <type_name>

  比如可以查找所有提供std_srvs/srv/Empty数据类型的服务:

ros2 service find std_srvs/srv/Empty

  可以看到: ROS2入门教程——7. 理解服务(Service)  

5.查看服务数据类型的具体结构

现在我们已经可以看到某一个服务的数据类型了,那这种数据类型具体的数据结构是什么样的呢?可以用这个命令:

ros2 interface show <type_name>.srv

  比如:

ros2 interface show std_srvs/srv/Empty.srv

  终端中会显示: ROS2入门教程——7. 理解服务(Service)   这里的“—”在服务的数据结构中是用来分割请求和应答两个部分的数据,这里只所以只有“—”,是应为Empty的请求和应答都不需要任何数据描述,类似一个出发信号。   我们来看另外一个服务的数据类型Spawn,之前已经根据list命令看到该服务的数据类型是 turtlesim/srv/Spawn:

ros2 interface show turtlesim/srv/Spawn.srv

  终端中可以看到: ROS2入门教程——7. 理解服务(Service)   这里可以看到,在Spawn服务的请求部分,由必须的x、y、theta和可选的name组成,应答数据则是name这个字符串。  

6.通过终端发送服务请求

我们已经了解了如何查看服务的数据类型和结构,接下来通过终端尝试发送一个服务请求。

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

  <arguments>部分是可选的,比如Empty类型的服务就没有任何参数:

ros2 service call /clear std_srvs/srv/Empty

  这个服务只是出发一个信号,让海龟仿真器清除海龟后边的运动轨迹,不需要传输什么数据:   ROS2入门教程——7. 理解服务(Service)   我们再来试试Spawn服务,这个服务可以产生一只新的海龟,<arguments>部分就需要输入上边看到的请求数据了:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

  终端中可以看到: ROS2入门教程——7. 理解服务(Service)   海龟仿真器中立刻就可以看到一只新的海龟啦:   ROS2入门教程——7. 理解服务(Service)   请求数据中的x、y、theta表示海龟的横纵坐标和旋转角度,name表示新生海龟的名字。   好啦,这就是ROS2中的服务概念啦,简而言之,客户端发送请求,服务端完成处理后反馈应答,通信只会交互一次数据,不像话题是周期发送数据的。  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明ROS2入门教程——7. 理解服务(Service)
喜欢 (0)

您必须 登录 才能发表评论!

加载中……