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

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

3、topic VS service
 

使用 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
 
 
                     
            
        













 
                    

 
                 
                    