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 。
相关文章推荐
- Ubuntu 默认壁纸历代记
- Ubuntu Remix Cinnamon 20.04 评测:Ubuntu 与 Cinnamon 的完美融合
- 关于Ubuntu 11.10启动提示waiting for the network configuration的问题
- 在 Ubuntu 桌面中使用文件和文件夹
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- ubuntu下chrome无法同步问题解决
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- Ubuntu Linux使用体验
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析