之前在topic里面也做人了,不过就是单向的。现在在service里面也做一个有反馈的人。
先定义一下人设
因为是service,所以就不之前的文件名下写人设了。按传统工艺是在/catkin_ws/src/learning_service 这层里面新建svc文件夹
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result
***有没有看到有
---
这三个短横线很重要,不是为了好看。
是为了区分,线上面的是需求request, 线下面的是反馈response。
简单来讲就是给出去的格式和收到的格式。
人设弄好了,现在就要设置环境了。Python是不用,没有讲其他的不用啊。
Package.xml
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
...
message_generation
)
add_service_files(
FILES Person.srv
)
generate_messages(
DEPENDENCIES std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_service
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
# DEPENDS system_lib
)
环境也准备好了。
那就开始Python啦。
在script里面新建person_server.py
#!/usr/bin/env 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():
rospy.init_node('person_server')
s = rospy.Service('/show_person', Person, personCallBack)
print "Ready show person information."
rospy.spin()
if __name__ == '__main__':
person_server()
再来一个,person_client.py
#!/usr/bin/env python
import rospy
import sys
from learning_service.srv import Person, PersonRequest
def person_client():
rospy.init_node('person_client')
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())
两文件准备好了。
雄起。
老规矩,来到catkin_ws
catkin_make
roscore
rosrun learning_service person_server.py
rosrun learning_service person_client.py
再几个人,再来几次 rosrun learning_service person_server.py