ROS机器人编程实践》学习笔记2.1-- ROS节点间通信之topic
程序员文章站
2022-07-12 09:48:29
...
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
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
def publish():
# 初始化ROS节点,名字叫做publihser
rospy.init_node('publisher')
# 发布一个叫做counter的topic,类型是Int32
pub = rospy.Publisher('counter', Int32)
# 2hz的循环变量
rate = rospy.Rate(2)
# 初始化一个count,按2hz的频率发布和+1
count = 0
# 当节点要被关闭的时候(例如ctrl-c),is_shutdown返回true
while not rospy.is_shutdown():
# 发布
pub.publish(count)
# count++
count += 1
# 等待500ms
rate.sleep()
if __name__ == '__main__':
publish()
#!/usr/bin/env python
import rospy
from std_msgs.msg import Int32
def callback(msg):
# 打印topic里面的信息
print msg.data
def subscribe():
# 初始化一个叫做subscriber的节点
rospy.init_node('subscriber')
# 订阅counter话题,设置回调函数为callback
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的信息
# 列出所有ros中在运行的topic
rostopic list
# 查看counter的信息
rostopic info counter
# 查看counter的发布频率
rostopic hz counter
# 查看counter里面的内容
rostopic echo counter
其他关于topic
锁存topic
如果一个topic发布的频率很低(如地图信息), 而订阅者在两次发布之间订阅话题的话,可能很久也收不到一次话题。这种情况可以在发布的时候要求ros锁存上一帧消息,
pub = rospy.Publisher('map', nav_msgs/OcuupancyGrid, latched=True)
# 但是我在发布counter这个话题的时候,加不了latched, 提示TypeError: __init__() got an unexpected keyword argument 'latched', 不知道为啥
自定义topic
基本上ros里面的topic就够用了吧,这个先跳过…
上一篇: Robot_pose_ekf源码笔记
下一篇: 54. 螺旋矩阵