求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 


业务架构设计
4月18-19日 在线直播



基于UML和EA进行系统分析设计
4月25-26日 北京+在线



AI 智能化软件测试方法与实践
5月23-24日 上海+在线
 
追随技术信仰

随时听讲座
每天看新闻
 
 
ROS教程
1.初级教程
1.1 安装和配置ROS环境
1.2 ROS文件系统导览
1.3 创建ROS软件包
1.4 构建ROS软件包
1.5 理解ROS节点
1.6 理解ROS话题
1.7 理解ROS服务和参数
1.8 使用rqt_console和roslaunch
1.9 使用rosed在ROS中编辑文件
1.10 创建ROS消息和服务
1.11 编写简单的发布者和订阅者(C++)
1.12 编写简单的发布者和订阅者(Python)
1.13 检验简单的发布者和订阅者
1.14 编写简单的服务和客户端(C++)
1.15 编写简单的服务和客户端(Python)
1.16 检验简单的服务和客户端
1.17 录制和回放数据
1.18 从bag文件中读取消息
1.19 roswtf入门
1.20 探索ROS维基
1.21 接下来做什么?
2.中级教程
2.1手动创建ROS包
2.2管理系统依赖项
2.3Roslaunch在大型项目中的使用技巧
2.4ROS在多机器人上的使用
2.5自定义消息
2.6在python中使用C++类
2.7如何编写教程
ROS标准
ROS开发者指南
标准计量单位和坐标约定
 
 
编写简单的服务和客户端(Python)
来源: ros.org 在线教程    编辑:Alice(火龙果软件)
743 次浏览
9次  

Description: 本教程介绍如何用Python编写服务和客户端节点。

Tutorial Level: BEGINNER

1 编写服务节点

这里,我们将创建简单的服务(Service)节点add_two_ints_server,该节点将接收两个整数,并返回它们的和。

将当前目录切换到之前的教程中创建的beginner_tutorials包中:

$ roscd beginner_tutorials

请确保你已经按照之前教程中的指示创建了本教程中需要的服务AddTwoInts.srv。(确保在页面顶部选对了所使用的构建工具)

1.1 代码

在beginner_tutorials包中创建scripts/add_two_ints_server.py文件并粘贴以下内容进去:

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

别忘了给节点执行权限:

chmod +x scripts/add_two_ints_server.py

然后将以下内容添加到CMakeLists.txt文件。这样可以确保正确安装Python脚本,并使用合适的Python解释器。

catkin_install_python(PROGRAMS scripts/
add_two_ints_server.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )

1.2 解释

现在,让我们把代码分解。

使用rospy编写服务的难度非常小。我们使用init_node()声明我们的节点,然后再声明我们的服务:

  12     s = rospy.Service('add_two_ints',
AddTwoInts, handle_add_two_ints)

这声明了一个名为add_two_ints的新服务,其服务类型为AddTwoInts。所有的请求(request)都传递给了handle_add_two_ints函数。handle_add_two_ints被AddTwoIntsRequest的实例调用,返回AddTwoIntsResponse实例。

就像订阅者中的例子一样,rospy.spin()可以防止代码在服务关闭之前退出。

2 编写客户端节点

2.1 代码

在beginner_tutorials包中创建scripts/add_two_ints_client.py文件并粘贴以下内容进去:

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

别忘了给节点执行权限:

$ chmod +x scripts/add_two_ints_client.py

然后,在你的CMakeLists.txt中编辑catkin_install_python()调用,就像这样:

catkin_install_python(PROGRAMS scripts/
add_two_ints_server.py scripts/add_two_ints_client.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )

2.2 解释

现在,让我们把代码分解。

客户端(用来调用服务)的代码也很简单。对于客户端来说不需要调用init_node()。我们首先调用:

  10     rospy.wait_for_service('add_two_ints')

这是一种很方便的方法,可以让在add_two_ints服务可用之前一直阻塞。

  12         add_two_ints = rospy.
ServiceProxy
('add_two_ints', AddTwoInts)

这里我们为服务的调用创建了一个句柄(handle)。

  13         resp1 = add_two_ints(x, y)
  14         return resp1.sum

然后我们可以使用这个句柄,就像普通的函数一样调用它。

因为我们已经将服务的类型声明为AddTwoInts,它会为你生成AddTwoIntsRequest对象 (you're free to pass in your own instead)。如果调用失败,rospy.ServiceException将会抛出,所以你应该弄一个合适的try/except部分。

3 构建节点

我们使用CMake作为构建系统。是的,即使是Python节点也必须使用它。这是为了确保能为创建的消息和服务自动生成Python代码。

切换当前目录到你的catkin工作空间,然后运行catkin_make:

# 在你的catkin工作空间中
$ cd ~/catkin_ws
$ catkin_make

现在你已经编写了一个简单的服务和客户端,开始检验简单的服务和客户端吧。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



743 次浏览
9次