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

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

原文地址:https://www.cnblogs.com/aobosir/p/5928571.html