回目录
ROS间通信机制
在ROS中,机器人系统被分成了一个一个节点,但每个节点并不是孤立的,比如导航定位算法节点需要知道激光雷达的数据,运动控制节点需要告诉电机驱动节点驱动电机到某一转角,等等。所以这就要求ROS提供一种节点间的通信机制。
其实,在ROS中有三种节点间的通信方式,这一节只说明第一种——topic。
Topic
topic是ROS中的一种发布/订阅的通信机制,由信息发送方发布信息到整个ROS系统,信息接收方可以在ROS中订阅需要的信息,由此来实现信息的传递。
实践中摸索一下
先建立workspace,具体可参见笔记一
mkdir ros_ws/src -p
cd ros_ws/src
catkin_init_workspace
catkin_create_pkg pub_sub rospy
cd ..
catkin_make
source ./devel/source.bash
在pub_sub文件夹下添加一个publisher.py
import rospy
from std_msgs
.msg
import Int32
def publish():
rospy
.init_node
('publisher')
pub
= rospy
.Publisher
('counter', Int32
)
rate
= rospy
.Rate
(2)
count
= 0
while not rospy
.is_shutdown
():
pub
.publish
(count
)
count
+= 1
rate
.sleep
()
if __name__
== '__main__':
publish
()
添加一个subsciber.py
import rospy
from std_msgs
.msg
import Int32
def callback(msg
):
print msg
.data
def subscribe():
rospy
.init_node
('subscriber')
sub
= rospy
.Subscriber
('counter', Int32
, callback
)
rospy
.spin
()
if __name__
== '__main__':
subscribe
()
运行
rosrun pub_sub publisher.py
rosrun pub_sub publisher.py
查看topic
先运行publiser.py和subscriber.py查看counter这个topic的信息
rostopic list
rostopic info counter
rostopic hz counter
rostopic
echo counter
其他关于topic
锁存topic
如果一个topic发布的频率很低(如地图信息), 而订阅者在两次发布之间订阅话题的话,可能很久也收不到一次话题。这种情况可以在发布的时候要求ros锁存上一帧消息,
pub
= rospy
.Publisher
('map', nav_msgs
/OcuupancyGrid
, latched
=True)
自定义topic
基本上ros里面的topic就够用了吧,这个先跳过…