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 文件:

  1. $ roscd beginner_tutorials
  2. $ gedit scripts/add_two_ints_server.py

添加下面的代码:

  1. #!/usr/bin/env python
  2. from beginner_tutorials.srv import *
  3. import rospy
  4. def handle_add_two_ints(req):
  5. print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a+req.b))
  6. return AddTwoIntsResponse(req.a + req.b)
  7. def add_two_ints_server():
  8. rospy.init_node('add_two_ints_server')
  9. s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
  10. print "Ready to add two ints."
  11. rospy.spin()
  12. if __name__ == "__main__":
  13. add_two_ints_server()

代码讲解:

最后一步,给这个 add_two_ints_server.py 文件加上可执行权限:

  1. $ chmod +x scripts/add_two_ints_server.py

这样,一个 服务端 编写完了。我们不要急着去运行它,现在我们编写一个客户端,来对服务器做出请求。


编写客户端(Client):

新建一个 add_two_ints_client.py 文件

  1. $ roscd beginner_tutorials
  2. $ gedit scripts/add_two_ints_client.py

将下面的代码添加进去:

  1. #!/usr/bin/env python
  2. import sys
  3. import rospy
  4. from beginner_tutorials.srv import *
  5. def add_two_ints_client(x, y):
  6. rospy.wait_for_service('add_two_ints')
  7. try:
  8. add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
  9. resp1 = add_two_ints(x, y)
  10. return resp1.sum
  11. except rospy.ServiceException, e:
  12. print "Service call failed: %s"%e
  13. def usage():
  14. return "%s [x y]"%sys.argv[0]
  15. if __name__ == "__main__":
  16. if len(sys.argv) == 3:
  17. x = int(sys.argv[1])
  18. y = int(sys.argv[2])
  19. else:
  20. print usage()
  21. sys.exit(1)
  22. print "Requesting %s+%s"%(x, y)
  23. print "%s + %s = %s"%(x, y, add_two_ints_client(x, y))

代码讲解:

最后一步,给这个 add_two_ints_client.py 文件加上可执行权限:

  1. $ chmod +x scripts/add_two_ints_client.py

这样,服务器和客户端就都编写完成了。

运行:

  1. $ roscore

先运行服务器:(新开一个终端)

  1. $ rosrun beginner_tutorials add_two_ints_server.py
  2. Ready to add two ints.

如果你不按 Ctrl+C 它就这样一直挂着。

再运行客户端: (新开一个终端)

  1. $ rosrun beginner_tutorials add_two_ints_client.py 2 3 #需要传进来2个参数
  2. Requesting 2+3
  3. 2 + 3 = 5

现在看看运行 add_two_ints_server.py 的终端响应了刚刚客户端的请求:

By The Way:

因为我们使用的是 python 编写的程序,而且我们之前编译过自定义的ROS服务文件(将它转换为 python 形式的源代码)。所以,现在我们可以不去编译程序了。

但,出于与好的习惯,还是在编译一次:

  1. $ cd ~/catkin_ws
  2. $ catkin_make


总结:

OK,到这里,基本上入门( beginner_tutorials 程序包)教程就都讲完。

但是我们还是没有入门完,我们需要将ROS中的这个关键的知识点: tf 学完,才算是正真的入门了。

所以从下一讲开始,我们不会在 beginner_tutorials 这个程序包中编写程序了。我们会新建一个程序包。

下一讲 : tf

ROS Learning-013 beginner_Tutorials (编程) 编写ROS服务版的Hello World程序(Python版)的更多相关文章

  1. ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)

    ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 1 ...

  2. 【ROS系列】使用QT编写ROS订阅、发布程序

    Linux下一直使用QT进行开发,支持cmake使得很容易导入其他工程.学习ROS过程中,很多函数名称难记,使用QT不仅可以提示补全,还为了以后开发GUI方便吧. 1.安装ros_qtc_plugin ...

  3. 编写优美代码的七条规范(Python版)

    编程是一种与计算机系统通信的语言.交流就是与某人分享思想.二进制语言是计算机的最核心的语言.但是在前端,我们有很多种语言.这些语言使用解释器将前端代码转换为二进制代码.基本上,系统对一行代码执行大量内 ...

  4. Windows服务(system权限)程序显示界面与用户交互,Session0通知Session1里弹出对话框(真的很牛) good

    源码资源下载:http://download.csdn.net/detail/stony1980/4512984   1.VC2008中编写“Windows服务”(Windows Service)程序 ...

  5. ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)

    ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...

  6. ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介

    ROS 提高篇 之 Launch 深入研究 - 01 - 启动文件的编程 - ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubu ...

  7. ROS学习(十三)—— 编写简单的Service和Client (C++)

    一.编写Service节点 1.节点功能: 我们将创建一个简单的service节点("add_two_ints_server"),该节点将接收到两个整形数字,并返回它们的和. 2. ...

  8. ROS学习笔记11-写一个简单的服务和客户端(C++版本)

    本文主要来源于:http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29 写一个服务节点.在创建消息和服务中,我们创建了一 ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. Flask download file vs django download file

    Only difference is make_response and httpresponse. FLASK VERSION: from flask import make_response @a ...

  2. hdoj-1027-Ignatius and the Princess II(逆康拓展开)

    题目链接 /* Name: Copyright: Author: Date: 2018/5/2 11:07:16 Description:输出第m小的序列 */ #include <iostre ...

  3. MonoBehavior lifecycle

    awake 只调用一次, awake在所有obj都初始化之后被调用. 用途: 初始化游戏状态 设置脚本间的引用 ### ExecuteInEditMode 编辑模式下 ``` 这个模式下,脚本编译,会 ...

  4. windows文件名非法字符过滤检测-正则表达式

    过滤文件名非法字符 windows现在已知的文件名非法字符有 \ / : * ? " < > | var reg = new RegExp('[\\\\/:*?\"&l ...

  5. I.MX6 make menuconfig进入x86模式

    /************************************************************************ * I.MX6 make menuconfig进入x ...

  6. LeetCode K-diff Pairs in an Array

    原题链接在这里:https://leetcode.com/problems/k-diff-pairs-in-an-array/#/description 题目: Given an array of i ...

  7. C#获取路由器外网IP,MAC地址

    C#实现的获取路由器MAC地址,路由器外网地址.对于要获取路由器MAC地址,一定需要知道路由器web管理系统的用户名和密码.至于获取路由器的外网IP地址,可以不需要知道路由器web管理系统的用户名和密 ...

  8. QT 中“ std::cerr ”的使用方法【转载】

    std::cerr  标准错误输出流 std::cout 标准输出流 std::cerr 与 std::cout的最大不同是 cerr 是 不带输出缓冲 的,直接就可以输出到显示器上, 而 cout ...

  9. Operating System-进程/线程内部通信-管程(Monitor)介绍,实现以及应用

    本文主要内容: 管程(Monitor)介绍 管程实现 管程应用 一.管程(Monitor)介绍 1.1 管程 前一篇文章介绍了信号量以及使用,信号量已经提供了一个方便且高效的进程同步机制,但是信号量有 ...

  10. 无法确定要使用哪一版本的 ASP.NET Web Pages。

    若要使用此站点,请在站点的 web.config 文件中指定一个版本.有关详细信息,请参阅 Microsoft 支持站点上的以下文章: http://go.microsoft.com/fwlink/? ...