ROS机器人编程实践》学习笔记2.1-- ROS节点间通信之topic

回目录

ROS间通信机制

在ROS中,机器人系统被分成了一个一个节点,但每个节点并不是孤立的,比如导航定位算法节点需要知道激光雷达的数据,运动控制节点需要告诉电机驱动节点驱动电机到某一转角,等等。所以这就要求ROS提供一种节点间的通信机制。

其实,在ROS中有三种节点间的通信方式,这一节只说明第一种——topic。

Topic

topic是ROS中的一种发布/订阅的通信机制,由信息发送方发布信息到整个ROS系统,信息接收方可以在ROS中订阅需要的信息,由此来实现信息的传递。

实践中摸索一下
  1. 先建立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
  1. 在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()
  1. 添加一个subsciber.py
#!/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()
  1. 运行
# 运行发布节点
rosrun pub_sub publisher.py
# 运行订阅节点
# 屏幕上会打印不断增加的数字,表示发布、订阅成功
rosrun pub_sub publisher.py
查看topic
  1. 先运行publiser.py和subscriber.py
  2. 查看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就够用了吧,这个先跳过…

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值