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 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. JedisPool的配置参数整理

    JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的. maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取: ...

  2. python编程实例-dmidecode系统信息搜集

    #!/usr/bin/env python from subprocess import PIPE,Popen def getDmi(): p = Popen(['dmidecode'],stdout ...

  3. LeetCode Distribute Candies

    原题链接在这里:https://leetcode.com/problems/distribute-candies/#/description 题目: Given an integer array wi ...

  4. django1.7 HTML模板中{%url%}的使用

    转载:https://my.oschina.net/jastme/blog/345265

  5. spark 单机版安装

    jdk-8u73-linux-x64.tar.gz hadoop-2.6.0.tar.gz scala-2.10.6.tgz spark-1.6.0-bin-hadoop2.6.tgz 1.安装jdk ...

  6. ExtJs中获得当前选中行号(Grid中多选或者是单选)及Grid的反选(取消选中行)

    多选,如何获得每行的行号: function getlineNum(){    var sm=titleGird.getSelectionModel(); // 获得grid的SelectionMod ...

  7. zabbix3.2.1安装graphtrees插件

    https://blog.csdn.net/liang_baikai/article/details/53542317 graphtree介绍 由于zabbix的图像显示一块不太友好,图像没法集中显示 ...

  8. jquery中validation部分学习笔记

    1.valid()和rules()valid()方法:检查表单或某些元素是否有效,返回值为boolean型, 全部通过检查规则返回true,只要有不通过的检查规则都返回false rules()方法: ...

  9. Spring MVC 项目示例

    Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架.Spring的web框架围绕DispatcherServlet设计, 作用是将请求分发到不同 ...

  10. mycat接oracle和mysql多个实例

    Mycat 后面接一个Oracle实例与一个MySQL实例,假设用户表,订单表,转账记录表,Oracle字符集为GBK的,MySQL字符集则要求UTF8的完成用户表与订单表到MySQL的迁移过程,要求 ...