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

    xiaoxiao2023-10-29  183

    回目录

    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() 添加一个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() 运行 # 运行发布节点 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就够用了吧,这个先跳过…

    最新回复(0)