前言

  在ros中定义一个服务,计算字符串中单词的数量   实现过程   1、创建服务WordCount.srv   1.1、进入basic包:  
cd ~/catkin_ws/src/basic/
  1.2、创建srv目录:  
mkdir srv
  1.3、在srv目录下创建WordCount.srv文件:  
cd srv
vi WordCount.srv
  1.4、输入如下内容:     2、修改CMakeLists.txt  
cd ..
vi CMakeLists.txt
  2.1、修改CMakeLists.txt的find_package()如下:     2.2、修改add_service_files()去掉注释加入WordCount.srv如下图:     2.3、修改generate_messages()如下图:     3、修改package.xml文件加入message_generation和message_runtime如下图:  
vi package.xml
    4、返回catkin根目录编译:  
cd ~/catkin_ws
catkin_make
  5、编译成功后测试是否有这个服务了:  
rossrv show WordCount
    6、实现服务:   6.1、在basic包的src文件夹下创建service_server.py文件,设置权限:  
cd ~/catkin_ws/src/basic/src
vi service_server.py
chmod 777 service_server.py
  service_server.py  
#!/usr/bin/env python

import rospy

from basic.srv import WordCount,WordCountResponse

def count_words(request):
	return WordCountResponse(len(request.words.split()))

rospy.init_node('service_server')

service = rospy.Service('word_count',WordCount,count_words)

rospy.spin()
  7、打开新终端运行roscore:  
roscore
  8、在原来的终端返回catkin的根目录编译:  
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic service_server.py
    这是已经在运行了不过没写现象。   9、用ros的服务包里面的list检查服务是否可见(打开新终端):  
rosservice list
    可以看到word_count已经在服务了。   10、用ros服务包的info来看更多信息:  
rosservice info word_count
    他告诉了我们四项参数:  
  • Node:当前提供服务的节点名字。
  • URL:服务的端口号
  • Type:服务的类型
  • Args:参数
  11、直接命令调用使用服务  
rosservice call word_count 'one two three'
    12、代码方式使用服务   12.1、在basic的src内创建service_client.py文件:  
cd ~/catkin_ws/src/basic/src
vi service_client.py
chmod 777 service_client.py
  service_client.py:  
#!/usr/bin/env python

import rospy

from basic.srv import WordCount

import sys

rospy.init_node('service_client')

rospy.wait_for_service('word_count')

word_counter=rospy.ServiceProxy('word_count',WordCount)

words=' '.join(sys.argv[1:])

word_count=word_counter(words)

print words,'->',word_count.count
  12.2、返回catkin根目录编译运行  
cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic service_client.py one two three
    ok到此结束啦~enjoy it