ROS-写一个简单的服务器和客户端(Python)(roswiki初级教程rospy部分翻译以及程序注释)

service通信机制---编写简单的Service和Client

http://wiki.ros.org/cn/ROS/Tutorials/WritingServiceClient%28python%29

(可参考创客智造中的教程https://www.ncnynl.com/category/ros-python/

 

1.编写服务器节点(Service)

创建一个服务节点(“add_two_ints_server()”),它将接受两个int数据并返回两个数据的求和结果

将目录切换到beginner_tutorials.

$cd beginner_tutorials

代码:

$cd scripts  #切换到脚本文件路径
$vi add_two_ints_server.py  #建立服务节点并编写内容
$chmod +x add_two_ints_server.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import rospy
from beginner_tutorials.srv import *  #导入定义的服务

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) #AddTwoIntsResponse由服务生成的返回函数
	
def add_two_ints_server():
	rospy.init_node('add_two_ints_server')
	#定义服务器节点名称,服务类型,处理函数
	#处理函数调用实例化的AddTwoIntsRequest接收请求和返回实例化的AddTwoIntsResponse
	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()
import rospy
from beginner_tutorials.srv import *  #导入定义的服务

首先是导入beginner_tutorials.srv中所有的函数(其中的*是通配符,表示所有函数,即beginner_tutorials.srv这个module中的所有函数),导入rospy。

rospy.init_node('add_two_ints_server')
#定义服务器节点名称,服务类型,处理函数
#处理函数调用实例化的AddTwoIntsRequest接收请求和返回实例化的AddTwoIntsResponse
s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)

这是主函数中的程序。第一句是注册和初始化节点,节点的名称为add_two_ints_server。第二句是声明了一个名字为“add_two_ints”的服务,服务类型是AddTwoInts。定义了一个处理函数handle_add_two_ints,所有的请求都将被传递给该函数进行处理。Handle_add_two_ints是被实例AddTwoIntsRequest调用,返回实例AddTwoIntsResponce。

 

2.编写客户端节点(Client)

$vi add_two_ints_client.py
$chmod +x add_two_ints_client.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-

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))
import sys

导入sys模块,sys.argv的功能是在外部向程序的内部传递参数sys.argv(number),number=0的时候是脚本的名称(即add_two_ints_client.py),1,2,…则为命令行下传递的参数。

def add_two_ints_client(x, y):
	#等待接入服务节点
	rospy.wait_for_service('add_two_ints')

定义一个函数add_two_ints_client(x,y),第二句是调用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

try是正常执行程序,后一句是构造函数,创建client客户端(服务的请求方),客户端名字为add_two_ints,服务类型为AddTwoInts。可当成普通函数一样的调用add_two_ints,如后两句所示。因为我们已经声明了服务的类型是AddTwoInts,所以它会为你生成AddTwoIntsRequest对象(这个可以自行转入)。返回值是AddTwoIntsResponce对象。如果调用失败,可能会抛出ros.ServiceException异常,因此需要设置适当的try-except语句进行异常处理

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值