ros机器人编程实践(4.1)- 发布与使用服务

182
0
2020年8月12日 10时04分

前言

 

在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、输入如下内容:

 

ros机器人编程实践(4.1)- 发布与使用服务插图

 

2、修改CMakeLists.txt

 

cd ..
vi CMakeLists.txt

 

2.1、修改CMakeLists.txt的find_package()如下:

 

ros机器人编程实践(4.1)- 发布与使用服务插图(1)

 

2.2、修改add_service_files()去掉注释加入WordCount.srv如下图:

 

ros机器人编程实践(4.1)- 发布与使用服务插图(2)

 

2.3、修改generate_messages()如下图:

 

ros机器人编程实践(4.1)- 发布与使用服务插图(3)

 

3、修改package.xml文件加入message_generation和message_runtime如下图:

 

vi package.xml

 

ros机器人编程实践(4.1)- 发布与使用服务插图(4)

 

4、返回catkin根目录编译:

 

cd ~/catkin_ws
catkin_make

 

5、编译成功后测试是否有这个服务了:

 

rossrv show WordCount

 

ros机器人编程实践(4.1)- 发布与使用服务插图(5)

 

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

 

ros机器人编程实践(4.1)- 发布与使用服务插图(6)

 

这是已经在运行了不过没写现象。

 

9、用ros的服务包里面的list检查服务是否可见(打开新终端):

 

rosservice list

 

ros机器人编程实践(4.1)- 发布与使用服务插图(7)

 

可以看到word_count已经在服务了。

 

10、用ros服务包的info来看更多信息:

 

rosservice info word_count

 

ros机器人编程实践(4.1)- 发布与使用服务插图(8)

 

他告诉了我们四项参数:

 

  • Node:当前提供服务的节点名字。
  • URL:服务的端口号
  • Type:服务的类型
  • Args:参数

 

11、直接命令调用使用服务

 

rosservice call word_count 'one two three'

 

ros机器人编程实践(4.1)- 发布与使用服务插图(9)

 

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

 

ros机器人编程实践(4.1)- 发布与使用服务插图(10)

 

ok到此结束啦~enjoy it

发表评论

后才能评论