
ROS Indigo beginner_Tutorials-12 编写ROS服务版的Hello World程序(Python版)
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo
前言:
在编写 ROS 话题版的 Hello World 程序(python版) 这一节中,发布器(talker.py) 和 订阅器(listener.py) 编写得很简单,以简单的发布和订阅一个话题的方式进行通信。
接下来,我要讲的是,使用 服务文件 的 “ 发布器和订阅器 ” 。这里 我们有新的名词:写一个简单的 服务端(Service) 和 客户端(Client) 的程序: (这就是ROS服务版的 Hello World 程序)
先说一下 ROS中 服务: 两部分组成: 请求 和 响应 。
客户端(Client) 发出 请求 , 服务端(Service)做出 响应。
首先编写服务端(Service):
新建有一个 add_two_ints_server.py
文件:
$ roscd beginner_tutorials
$ gedit scripts/add_two_ints_server.py
添加下面的代码:
#!/usr/bin/env python
from beginner_tutorials.srv import *
import rospy
def handle_add_two_ints(req):
print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a+req.b))
return AddTwoIntsResponse(req.a + req.b)
def add_two_ints_server():
rospy.init_node('add_two_ints_server')
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
print "Ready to add two ints."
rospy.spin()
if __name__ == "__main__":
add_two_ints_server()
代码讲解:
最后一步,给这个 add_two_ints_server.py
文件加上可执行权限:
$ chmod +x scripts/add_two_ints_server.py
这样,一个 服务端 编写完了。我们不要急着去运行它,现在我们编写一个客户端,来对服务器做出请求。
编写客户端(Client):
新建一个 add_two_ints_client.py
文件
$ roscd beginner_tutorials
$ gedit scripts/add_two_ints_client.py
将下面的代码添加进去:
#!/usr/bin/env python
import sys
import rospy
from beginner_tutorials.srv import *
def add_two_ints_client(x, y):
rospy.wait_for_service('add_two_ints')
try:
add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
resp1 = add_two_ints(x, y)
return resp1.sum
except rospy.ServiceException, e:
print "Service call failed: %s"%e
def usage():
return "%s [x y]"%sys.argv[0]
if __name__ == "__main__":
if len(sys.argv) == 3:
x = int(sys.argv[1])
y = int(sys.argv[2])
else:
print usage()
sys.exit(1)
print "Requesting %s+%s"%(x, y)
print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))
代码讲解:
最后一步,给这个 add_two_ints_client.py
文件加上可执行权限:
$ chmod +x scripts/add_two_ints_client.py
这样,服务器和客户端就都编写完成了。
运行:
$ roscore
先运行服务器:(新开一个终端)
$ rosrun beginner_tutorials add_two_ints_server.py
Ready to add two ints.
如果你不按 Ctrl+C
它就这样一直挂着。
再运行客户端: (新开一个终端)
$ rosrun beginner_tutorials add_two_ints_client.py 2 3 #需要传进来2个参数
Requesting 2+3
2 + 3 = 5
现在看看运行 add_two_ints_server.py
的终端响应了刚刚客户端的请求:
By The Way:
因为我们使用的是 python 编写的程序,而且我们之前编译过自定义的ROS服务文件(将它转换为 python 形式的源代码)。所以,现在我们可以不去编译程序了。
但,出于与好的习惯,还是在编译一次:
$ cd ~/catkin_ws
$ catkin_make
总结:
OK,到这里,基本上入门( beginner_tutorials 程序包)教程就都讲完。
但是我们还是没有入门完,我们需要将ROS中的这个关键的知识点: tf
学完,才算是正真的入门了。
所以从下一讲开始,我们不会在 beginner_tutorials
这个程序包中编写程序了。我们会新建一个程序包。
下一讲 : tf 。