文章目录
ROS机器人入门第四课:话题通信
一、话题通信概述
话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,比如下面一个常见场景:
机器人在执行导航功能,使用的传感器是激光雷达,机器人会采集激光雷达感知到的信息并计算,然后生成运动控制信息驱动机器人底盘运动。
在上述场景中,就不止一次使用到了话题通信。
- 以激光雷达信息的采集处理为例,在 ROS 中有一个节点需要时时的发布当前雷达采集到的数据,导航模块中也有节点会订阅并解析雷达数据。
- 再以运动消息的发布为例,导航模块会根据传感器采集的数据时时的计算出运动控制信息并发布给底盘,底盘也可以有一个节点订阅运动信息并最终转换成控制电机的脉冲信号。
以此类推,像雷达、摄像头、GPS… 等等一些传感器数据的采集,也都是使用了话题通信,换言之,话题通信适用于不断更新的数据传输相关的应用场景。
(一)概念
以发布订阅的方式实现不同节点之间数据交互的通信模式。
(二)作用
用于不断更新的、少逻辑处理的数据传输场景。
二、话题通信基本操作
需求:
编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。
分析:
在模型实现中,ROS master 不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:
- 发布方
- 接收方
- 数据(此处为普通文本)
流程:
- 编写发布方实现;
- 编写订阅方实现;
- 为python文件添加可执行权限;
- 编辑配置文件;
- 编译并执行。
(一)发布方
这段代码是一个使用ROS(Robot Operating System,机器人操作系统)的Python脚本示例,旨在创建一个名为talker_p
的节点,该节点周期性地向名为chatter
的话题发送包含字符串的消息。它是一个简单的发布者(Publisher)节点,演示了ROS中发布消息的基本模式。下面对代码进行详细注释,并解释其中使用的关键ROS函数。
#! /usr/bin/env python
# - coding: utf-8 -*-
# 导入 rospy 库,rospy 是 ROS 在 Python 中的客户端库,用于使Python代码能与ROS通信。
import rospy
# 从 std_msgs 包中导入 String 消息类型,std_msgs 包含了许多标准的消息类型,String 是其中用于传输文本信息的一个类型。
from std_msgs.msg import String
# 判断此脚本是直接被执行而不是被导入到其他文件中时,下面的代码块将被执行。
if __name__ == "__main__":
# 初始化ROS节点,命名为 "talker_p"。
# 每个ROS节点都必须有一个唯一的名称,这样其他节点就可以与之通信。
rospy.init_node("talker_p")
# 实例化发布者对象。
# 这一步创建了一个发布者对象,它能够向名为 "chatter" 的话题发布 String 类型的消息。