服务(Services)是ROS中一种同步通信模式,其中消息以请求/应答(Request/Reply)的方式传递。
- 客户端(Client):请求服务后等待响应。
- 服务器(Server): 收到服务请求后执行指定的任务,并发送响应。
- 关系:Client-Server 多对一
与话题不同,ROS中只允许有一个节点提供服务,但可以存在多个客户端。与话题不同,服务只连接一次,在执行请求和响应之后彼此断开连接。如果有必要,需要重新连接。
例如,当客户端向服务器请求当前时间时,服务器将确认时间并作出响应。
该服务通常被用作请求机器人执行特定操作时使用的命令,或者用于根据特定条件需要产生事件的节点。由于它是一次性的通信方式,又因为它在网络上的负载很小,所以它也被用作代替话题的手段,因此是一种非常有用的通信手段。
服务
本例程放在ros_learning
功能包script
文件夹下,新建ros_learning
功能包(如果已经创建,可以跳过):
$ cs
$ catkin_create_pkg ros_learning std_msgs rospy roscpp
$ cm
新建自定义服务
自定义服务消息数据格式一般为srv
文件,如此次需要创建AddTwoInts.srv
文件,一般放在功能包目录下srv
文件夹下。
路径:catkin_ws/src/ros_learning/srv/AddTwoInts.srv
1 | int64 a |
注:数据域中的内容,请求与应答数据格式之间需要使用---
分割。
修改package.xml和CMakeLists.txt
- 修改package.xml文件,添加以下内容
1 | <build_depend>message_generation</build_depend> |
- 修改CMakeLists.txt文件,添加以下内容
1 | ## Find catkin macros and libraries |
创建客户端(Client)
路径:catkin_ws/src/ros_learning/script/client.py
1 | #!/usr/bin/env python |
创建客户端完成后,使用命令sudo chmod +x XXX.py
为Python文件添加可执行权限:
tao@ubuntu:~/catkin_ws/src/ros_learning/script$ sudo chmod +x client.py
创建服务器(Server)
路径:catkin_ws/src/ros_learning/script/server.py
1 | #!/usr/bin/env python |
创建服务器完成后,使用命令sudo chmod +x XXX.py
为Python文件添加可执行权限:
tao@ubuntu:~/catkin_ws/src/ros_learning/script$ sudo chmod +x server.py
运行测试
- 打开新终端,编译功能包,启动ROS:
$ cm
$ roscore
- 打开新终端,运行服务器,可以看出服务在等待客户端请求:
$ rosrun ros_learning subscriber.py
- 打开新终端,运行客户端,可以看出,当发出两个整数相加请求后,服务器计算并返回所求的和:
$ rosrun ros_learning subscriber.py
到此,已经简单了解一下服务的通信模式。