前言
在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
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