与话题消息的定义与使用相似,可做对应参考。
1.自定义服务数据
在功能包中创建srv文件夹,在此文件夹中创建Person.srv文件,具体内容如下:
string name
uint8 age
uint8 sex
uint8 unknown =0
uint8 male = 1
uint8 female = 2
---
string result
“---”上方为request的数据,即客户端(client)发送给服务器(service)的数据类型,下方为response数据,服务器端发送给客户端的数据类型。
srv文件需要在package.xml中添加依赖:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
在CMakeLists.txt添加编译选项:
find_package( …… message_generation)
add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
catkin_package(…… message_runtime)
2.创建服务器代码(Python)
import rospy
from learning_service.srv import Person, PersonResponse
def personCallback(req):
# 显示请求数据
rospy.loginfo("Person: name:%s age:%d sex:%d", req.name, req.age, req.sex)
# 反馈数据
return PersonResponse("OK")
def person_server():
# ROS节点初始化
rospy.init_node('person_server')
# 创建一个名为/show_person的server,注册回调函数personCallback
s = rospy.Service('/show_person', Person, personCallback)
# 循环等待回调函数
print "Ready to show person informtion."
rospy.spin()
if __name__ == "__main__":
person_server()
from learning_service.srv import Person, PersonResponse
Person.srv文件编译之后,rospy会自动将该文件拆分为三部分,即通过srv文件中的“---”进行拆分,分别为Person、PersonResponse、PersonRequest。对于服务器来说,需要引入Person和PersonResponse这两个类型。
其他的函数说明和话题消息的定义与使用类似。
3.创建客户端代码
import sys
import rospy
from learning_service.srv import Person, PersonRequest
def person_client():
# ROS节点初始化
rospy.init_node('person_client')
# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
rospy.wait_for_service('/show_person')
try:
person_client = rospy.ServiceProxy('/show_person', Person)
# 请求服务调用,输入请求数据
response = person_client("Tom", 20, PersonRequest.male)
return response.result
except rospy.ServiceException, e:
print "Service call failed: %s"%e
if __name__ == "__main__":
#服务调用并显示调用结果
print "Show person result : %s" %(person_client())