ROS:用Python写一个简单服务

一.编写服务数据:

在功能包的顶级目录中,创建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))

 

你可能感兴趣的:(Python,ROS)