上文已经介绍了ros topic的基本概念信息
在这篇文章中将介绍ros service <server-client模型>,和ROS中的数据类型,msg和srv
1. ROS Service
Service和我们之前说的Topic都是ROS操作系统中应用/节点之间通讯的方式。但是Service通讯使用的是<server-client模型> ,所以区别可以概括为以下几个方面:
- Service的通讯是同步的,意思是Server节点和Client节点建立连接后,对request需要作出及时反馈response
- Service通讯类型为srv,后面会展开一点说,Topic通讯类型为msg
- 和subscriber订阅topic后只管接收信息不一样,因为这里的服务器消费者模型,所以消费者需要等待服务器响应,建立连接,之后才能得到服务器的response
我们还是使用上一节中的例子
由numberpublisher.py按照一定评率发布数字,numbercounter.py 对发布的数字进行累加,然后再以publisher的身份发出给/rostopic_2901....; 不同的是,numbercounter.py同时还要作为server,对client reset的请求作出响应
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int64
from std_srvs.srv import SetBool
counter = 0
pub = None
def callback_function(msg):
global counter
counter += msg.data
new_msg = Int64()
new_msg.data = counter
pub.publish(new_msg)
def callback_reset_counter(req):
if req.data:
global counter
counter = 0
return True, "Counter has been successfully reset"
return False, "Counter has not been reset"
if __name__ == "__main__":
rospy.init_node("number_counter")
sub = rospy.Subscriber("/number", Int64, callback_function)
pub = rospy.Publisher("/number_counter",Int64, queue_size=10)
reset_service = rospy.Service("/reset_counter", SetBool, callback_reset_counter)
rospy.spin()
响应如下:
2. msg数据类型
msg是topic通讯当中经常用到的数据类型,可以自行定义或者用标准的数据类型,比如std_msgs就是ros中已定义的标准数据类型。自定数据类型可以是几种标准数据类型的集合,比如ID:可以有Name(String),Age(Int8),...
std_msgs - ROS Wiki (
)
3. srv数据类型
和topic不一样的是,因为运用于service通讯,所以包含request数据类型和response数据类型,中间用“---”分割。
新建自己的srv或者msg也很简单,
1. catkin_create_pkg 建立一个package统一管理srv和msg
2. 在文件夹内建立msg和srv文件夹,因为
3. 修改cmakelists.txt文件
4. 在srv文件夹下新建ComputeDiskArea.srv
5. 回到catkin_ws重新catkin_make
这样ComputeDiskArea srv通讯数据类型就创建了
今天就讲到这里,基础框架基本搭建完了,后面就开始讲一些功能包比如:TF,SLAM,MoveIt.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)