1、简介

Service通信是双向的, 它不
仅可以发送消息, 同时还会有反馈。 所以service包括两部分, 一部分是请求方( Clinet) , 另
一部分是应答方/服务提供方( Server) 。 这时请求方( Client) 就会发送一个request, 要等
待server处理, 反馈回一个reply, 这样通过类似“请求-应答”的机制完成整个服务通信。
这种通信方式的示意图如下:
Node B是server( 应答方) , 提供了一个服务的接口, 叫做 /Service , 我们一般都会用
string类型来指定service的名称, 类似于topic。 Node A向Node B发起了请求, 经过处理后得
到了反馈。

servicemonitor替换标签_txt文件

Service是同步通信方式, 所谓同步就是说, 此时Node A发布请求后会在原地等待reply, 直到
Node B处理完了请求并且完成了reply, Node A才会继续执行。 Node A等待过程中, 是处于
阻塞状态的成通信。 这样的通信模型没有频繁的消息传递, 没有冲突与高系统资源的占用,
只有接受请求才执行服务, 简单而且高效

2、操作命令

 

servicemonitor替换标签_txt文件_02

3、topic VS service

 

servicemonitor替换标签_servicemonitor替换标签_03

使用 srv

创建一个srv

  • 在刚刚那个package中创建一个服务:
$ roscd your_package_name
$ mkdir srv
  • 这次我们不再手动创建服务,而是从其他的package中复制一个服务。
  • roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。
  • 使用方法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
  • 现在我们可以从rospy_tutorials package中复制一个服务文件了:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
  • 还有很关键的一步:我们要确保srv文件被转换成C++,Python和其他语言的源代码。
  • 现在认为,你已经如前边所介绍的,在CMakeLists.txt文件中增加了对message_generation的依赖。:
# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
  • 删掉#,去除对下边语句的注释:
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )
  • 用你自己的srv文件名替换掉那些Service*.srv文件:
add_service_files(
  FILES
  AddTwoInts.srv
)
  • 现在需要确保ROS能找到新包,常常在发生变化之后,catkin_make 然后使用rospack profile识别新目录。
  • 例如:
  • $ catkin_make
  • $ rospack profile
    $ rospack find beginner_tutorials

尝试重source你的工作空间的setup.sh

     $source ~/catkin_ws/devel/setup.sh

使用 rossrv

  • 以上就是创建一个服务所需的所有步骤。
  • 下面通过rossrv show命令,检查ROS是否能够识该服务。
  • 使用方法: $ rossrv show 例子:
$ rossrv show your_package_name/AddTwoInts
  • 你将会看到:
int64 a
int64 b
---
int64 sum
  • 跟rosmsg类似, 你也可以不指定具体的package名来查找服务文件:
$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum