一.编写服务数据:
在功能包的顶级目录中,创建srv文件夹,并在里面创建.srv文件(先成为a.srv)
在srv文件中,填入服务数据,如:
int64 a int64 b --- int64 sum
其中,---上方是请求数据,下方是答应数据
二.修改CmakeList和Package.xml:
CmakeList:
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
add_service_files( FILES a.srv )
generate_messages( DEPENDENCIES std_msgs )
Package.xml:
message_generation message_runtime
三.返回工作空间顶级目录,catkin_make编译(记得要source,IDE的路径要设置好,我的是
/home/ch/forTest/devel/lib/python2.7/dist-packages)
四.编写服务py文件:
from beginner_tutorials(功能包名).srv import *
import rospy
def handle_add_two_ints(req): # 请求处理函数,req是请求数据包
print "Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b))
return AddTwoIntsResponse(req.a + req.b) #返回应答数据包(这里传进去的参数按.srv文件的顺序填写)
def add_two_ints_server():
rospy.init_node('add_two_ints_server(服务节点名)')
s = rospy.Service('add_two_ints(服务名)', AddTwoInts(srv文件名), handle_add_two_ints)
print "Ready to add two ints."
rospy.spin()
if __name__ == "__main__":
add_two_ints_server()
五.编写请求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) # 直接将参数按.srv文件中的顺序填好,传入句柄,即可得到结果
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))