您的位置:首页 > 编程语言 > Python开发

ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)

2016-09-05 19:46 771 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ros indigo python ubuntu srv