文章目录实验概述ROS 话题通信底层原理实验环境说明项目完整代码实现4.1 创建 ROS 功能包4.2 发布者 talker.py 代码4.3 订阅者 listener.py 代码项目编译与运行步骤运行效果展示常见报错问题解决实验总结与心得一、实验概述本次实验以 ROS 话题通信为核心实现发布者Publisher持续向指定话题发送字符串消息订阅者Subscriber监听话题并接收打印消息。实验目标理解 ROS Master、节点、话题、消息、发布 / 订阅五者的协作关系掌握 Python 实现 ROS 话题通信完整流程熟练使用 rosrun、roscore、catkin_make 等 ROS 基础命令区分话题通信的异步单向通信特性理解其适用场景。话题通信是机器人开发最常用的数据传输方式相机图像、激光雷达数据、底盘速度指令全部基于话题传输是机器人技术入门核心知识点。二、ROS 话题通信底层原理2.1 核心四大角色MasterROS 核心管理器节点注册中心记录所有节点与话题信息匹配发布者和订阅者Publisher 发布节点主动创建话题周期性向外发送自定义消息Topic 话题数据传输通道同一话题只能使用统一消息类型Subscriber 订阅节点向 Master 申请绑定指定话题收到消息自动触发回调函数。2.2 完整通信流程启动roscore开启 Master 管理中心发布节点启动向 Master 注册自己要发布的话题chatter订阅节点启动向 Master 声明订阅chatter话题Master 匹配两者信息建立发布者与订阅者点对点 TCP 连接发布者循环发送消息订阅者实时接收并执行回调逻辑。2.3 通信特点单向异步通信发布者只管发送无需等待订阅者回复多对多支持一个话题可多个发布者、多个订阅者适合高频连续数据流传输传感器、运动控制。三、实验环境说明操作系统Ubuntu 20.04 LTSROS 版本ROS Noetic Ninjemys编程语言Python3依赖库rospy、std_msgs标准消息库四、项目完整代码实现4.1 创建工作空间与功能包打开终端依次执行以下命令搭建项目工程# 1. 创建ROS工作空间 mkdir -p ~/topic_ws/src cd ~/topic_ws/src # 2. 创建话题通信功能包声明依赖 catkin_create_pkg topic_demo rospy roscpp std_msgs # 进入功能包新建脚本文件夹存放python代码 cd topic_demo mkdir scripts4.2 发布者代码 talker.py路径topic_ws/src/topic_demo/scripts/talker.py#!/usr/bin/env python3 # 导入ros核心库与标准字符串消息 import rospy from std_msgs.msg import String def talker(): # 1. 创建发布对象话题名chatter消息类型String消息队列长度10 pub rospy.Publisher(chatter, String, queue_size10) # 2. 初始化节点节点名称talker_nodeanonymous自动加后缀避免重名 rospy.init_node(talker_node, anonymousTrue) # 设置发布频率1Hz每秒发送1条消息 rate rospy.Rate(1) count 0 # 消息计数变量 # 未关闭ros节点时循环发送 while not rospy.is_shutdown(): # 拼接发送内容 send_msg fROS话题通信测试消息当前计数{count} # ROS日志打印输出相当于print rospy.loginfo(f【发布端】发送消息{send_msg}) # 将消息发布到chatter话题 pub.publish(send_msg) count 1 # 控制发送频率休眠1秒 rate.sleep() if __name__ __main__: try: talker() # 捕获CtrlC终止程序异常 except rospy.ROSInterruptException: pass4.3 订阅者代码 listener.py路径topic_ws/src/topic_demo/scripts/listener.py#!/usr/bin/env python3 import rospy from std_msgs.msg import String # 消息回调函数收到话题消息自动执行 def msg_callback(data): # 打印接收到的消息内容 rospy.loginfo(f【订阅端】成功接收消息{data.data}) def listener(): # 初始化订阅节点 rospy.init_node(listener_node, anonymousTrue) # 创建订阅对象订阅chatter话题绑定回调函数msg_callback rospy.Subscriber(chatter, String, msg_callback) rospy.loginfo(订阅节点启动等待接收chatter话题消息...) # 循环阻塞持续监听话题消息 rospy.spin() if __name__ __main__: listener()4.4 添加脚本执行权限代码写完后必须赋予可执行权限否则 rosrun 无法启动节点cd ~/topic_ws/src/topic_demo/scripts chmod x talker.py listener.py五、项目编译与运行步骤5.1 编译工作空间# 返回工作空间根目录编译 cd ~/topic_ws catkin_make # 刷新环境变量让系统识别新建功能包 source devel/setup.bash5.2 多终端分步启动需要 3 个独立终端窗口终端 1启动 ROS 核心 Masterroscore输出started core service [/rosout]代表启动成功。终端 2运行发布者节点rosrun topic_demo talker.py终端持续打印发送日志循环输出计数消息。终端 3运行订阅者节点rosrun topic_demo listener.py启动瞬间接收发布者实时推送的所有消息。六、运行效果展示这里插入你的运行截图文字描述如下终端 1roscore 启动成功显示核心服务运行终端 2发布者持续输出【发布端】日志计数持续自增终端 3订阅者实时同步打印和发布端完全一致的消息无延迟丢包。现象说明发布者与订阅者节点建立通信话题chatter数据传输正常实验功能全部实现。七、常见报错问题解决rosrun 找不到包解决执行source devel/setup.bash刷新环境变量PermissionError 权限不足解决给 py 文件添加chmod x执行权限消息接收空白 / 无输出解决确认发布者、订阅者话题名称完全一致大小写敏感roscore 启动失败端口占用解决执行killall roscore关闭残留进程后重启。八、实验总结与心得通过本次 ROS 话题通信实验我完整掌握了机器人底层最基础的通信模型理清了 Master、发布节点、订阅节点、话题消息之间的协作逻辑。话题通信适合传感器连续数据流传输是自动驾驶、移动机器人底盘控制的基础发布者依靠rospy.Publisher创建通道订阅者通过回调函数异步处理消息rospy.spin()是订阅节点持续监听的核心开发流程固定创建工作空间→新建功能包→编写节点代码→授权→编译→多终端分步调试实际开发中需要严格统一话题名、消息类型否则会出现节点无法通信的问题。本次实验为后续 ROS 服务通信、动作通信、自定义消息打下坚实基础理解异步通信模型对后续人工智能机器人项目开发至关重要。