在上一服务中直接通过call子命令调用服务,这里在代码中调用服务
service_client.py
1 #!/usr/bin/env python 2 3 import rospy 4 5 from basic.srv import WordCount 6 7 import sys 8 9 rospy.init_node('service_client') 10 11 rospy.wait_for_service('word_count') 12 13 word_counter = rospy.ServiceProxy('word_count',WordCount) 14 15 words = ' '.join(sys.argv[1:]) 16 17 word_count = word_counter(words) 18 19 print words, '->',word_count.count
首先要等待服务端声明之前的服务,如果在服务声明之前使用它,这个调用会失败,并抛出异常,
这里与话题的区别是即使话题没有声明也可以调用它。
rospy,wait_for_service('word_count')
客户端要指定服务的名字和类型,这会使我们像调用本地函数一样使用服务,它将会帮我们作服务调用
miao@openlib:~$ rosrun basic service_client.py these are some words hhh
these are some words hhh -> 5
停止服务端并重新运行客户端节点,客户端节点将会阻塞。等待服务被声明。此时启动服务端节点会使客户端节点继续工作。
ros最大的限制是:当服务端因为某些原因不可用时服务端可能将永远等下去。服务意外终止,或者客户端在调用服务时弄错了名字等情况都会造成客户端卡住。