• 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

  • 相关阅读:
    hive使用derby的服务模式(可以远程模式)
    使用sqoop过程
    使用mongodump及mongorestore备份及恢复数据
    sql server 2000 错误229 拒绝了对象sysobjects 的select 权限
    node.js 连接 sql server 包括低版本的sqlserver 2000
    centos7 安装jdk1.8
    mybatis配置时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
    该网页已屏蔽以下插件Adobe Flash Player
    关于IntelliJ IDEA 文档无法编辑的解决办法
    华硕_ZX50JX4200 安装ssd固态盘
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928571.html
Copyright © 2020-2023  润新知