[ROS2 学习指南1]---核心概念、常用命令、节点及话题通讯案例

发布时间:2026/7/1 18:50:06
[ROS2 学习指南1]---核心概念、常用命令、节点及话题通讯案例 目录一、核心基础概念1.1 节点Node1.2 功能包Package1.3 话题Topic1.4 消息Message1.5 服务Service二、构建系统ament 与 colcon 详解2.1 ament2.2 colcon2.3 三者完整关系三、ROS2 常用命令3.1 工作空间 编译命令3.2 功能包相关命令3.3 节点相关命令3.4 话题相关命令3.5 服务相关命令四、实战案例一创建功能包 编写首个节点步骤 1环境准备步骤 2编写基础打印节点步骤 3配置节点入口关键步骤 4编译 运行节点五、实战案例二话题通信发布者 订阅者步骤 1编写发布者节点talker_node步骤 2编写订阅者节点listener_node步骤 3注册新节点步骤 4编译运行步骤 5可视化调试rqt_graph 查看节点拓扑六、入门核心知识点复盘一、核心基础概念在动手写代码前先搞懂 ROS2 五大核心名词。1.1 节点Node节点是 ROS2 中最小的独立执行单元可以理解为一个个独立运行的小程序。设计特点单一职责一个节点只负责一件事摄像头采集、雷达测距、运动控制等节点相互独立单个节点崩溃不会影响整体系统。运行规则所有节点都必须隶属于某个功能包通过ros2 run命令启动。1.2 功能包Package功能包是 ROS2 管理代码、配置文件、启动文件的最小容器本质就是一个标准化文件夹。关系类比功能包 书包节点 书包里的书本 / 文具。核心规则一个功能包内可以存放多个不同功能的节点用户自定义的功能包统一存放在工作空间的src目录下。1.3 话题Topic节点之间单向异步通信的 “数据管道”是 ROS2 最常用的通信方式。工作模式发布Publish 订阅Subscribe一个节点发布数据多个节点可同时订阅数据。特点一对多、多对多通信发布者和订阅者无需感知对方存在依靠话题名自动匹配。1.4 消息Message话题中传输数据的格式规范规定了数据的类型字符串、图像、坐标、速度等。 常用基础类型std_msgs/msg/String字符串、geometry_msgs/msg/Twist运动速度、sensor_msgs/msg/Image图像。1.5 服务Service节点之间双向同步通信模式采用「请求 - 响应」一问一答形式多用于单次指令交互开关设备、查询状态等。二、构建系统ament 与 colcon 详解2.1 amentament是 ROS2 全新的包规范体系ament 是 catkinROS1 的升级迭代版本。ament_pythonament 体系下专门适配 Python 代码的构建规则对应ament_cmake则是 C 代码专用规则。2.2 colcon是 ROS2 统一的编译工具我们日常使用的colcon build就是它的核心命令。2.3 三者完整关系colcon负责执行编译、安装等实际操作ament规定功能包的目录结构、配置文件格式ament_python针对 “Python 程序” 的细分建造标准告诉 colcon 这是 Python 包无需编译二进制文件仅做脚本管理。三、ROS2 常用命令整理日常开发场景会用到的命令分类整理可直接收藏查阅。3.1 工作空间 编译命令# 进入工作空间根目录 cd ~/ros2_ws # 编译工作空间内所有功能包 colcon build # 编译后刷新环境每次编译必执行 source install/setup.bash3.2 功能包相关命令# 查看系统所有功能包 ros2 pkg list # 创建 Python 类型功能包 ros2 pkg create --build-type ament_python 包名 # 创建 C 类型功能包 ros2 pkg create --build-type ament_cmake 包名3.3 节点相关命令# 查看当前正在运行的所有节点 ros2 node list # 查看单个节点详情发布/订阅话题、服务 ros2 node info 节点名 # 运行指定功能包下的节点核心命令 ros2 run 功能包名 节点名3.4 话题相关命令# 查看所有活跃话题 ros2 topic list # 查看话题的数据类型 ros2 topic info 话题名 # 实时打印话题传输的数据调试神器 ros2 topic echo 话题名 # 手动向话题发布数据 ros2 topic pub 话题名 消息类型 数据3.5 服务相关命令# 查看所有服务 ros2 service list # 手动调用服务 ros2 service call 服务名 服务类型 参数 # 启动节点、话题关系可视化工具 rqt_graph四、实战案例一创建功能包 编写首个节点步骤 1环境准备先创建标准 ROS2 工作空间已有可跳过mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src 步骤 1创建 Python 功能包 ros2 pkg create --build-type ament_python my_first_package执行后ros2_ws/src目录下会生成my_first_package功能包自动生成 ROS2 所需配置文件。步骤 2编写基础打印节点进入代码目录cd ~/ros2_ws/src/my_first_package/my_first_package2. 创建并编辑节点文件hello_node.pytouch hello_node.py gedit hello_node.py将如下代码拷贝至文件中#!/usr/bin/env python3 import rclpy from rclpy.node import Node # 定义节点类 class HelloNode(Node): def __init__(self): super().__init__(hello_node) # 定义节点名称 # 定时器每隔1秒执行一次回调函数 self.create_timer(1.0, self.timer_callback) def timer_callback(self): # 日志打印输出 self.get_logger().info(我的第一个ROS2节点运行啦) def main(argsNone): rclpy.init(argsargs) # 初始化ROS2环境 node HelloNode() # 实例化节点 rclpy.spin(node) # 保持节点持续运行 node.destroy_node() # 销毁节点 rclpy.shutdown() # 关闭ROS2环境 if __name__ __main__: main()步骤 3配置节点入口关键ROS2 默认无法识别自定义节点需要修改setup.py注册节点回到功能包根目录找到 entry_points 字段添加节点映射cd ~/ros2_ws/src/my_first_package gedit setup.py # 填充 entry_points 字段 entry_points{ console_scripts: [ hello_node my_first_package.hello_node:main, ], },步骤 4编译 运行节点cd ~/ros2_ws # 回到工作空间 colcon build # 编译 source install/setup.bash # 刷新环境 ros2 run my_first_package hello_node # 运行节点运行效果终端每秒自动打印日志代表节点正常运行。五、实战案例二话题通信发布者 订阅者话题是 ROS2 核心通信方式本案例实现两个节点双向收发消息。步骤 1编写发布者节点talker_nodecd ~/ros2_ws/src/my_first_package/my_first_package touch talker_node.py gedit talker_node.py # 拷贝如下代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String # 引入字符串消息类型 class TalkerNode(Node): def __init__(self): super().__init__(talker_node) # 创建发布者话题名chatter消息类型String队列长度10 self.publisher self.create_publisher(String, chatter, 10) # 1秒发布一次消息 self.timer self.create_timer(1.0, self.timer_callback) self.get_logger().info(发布者已启动) def timer_callback(self): msg String() msg.data Hello ROS2! self.publisher.publish(msg) # 发布消息 self.get_logger().info(f发布{msg.data}) def main(argsNone): rclpy.init(argsargs) node TalkerNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()步骤 2编写订阅者节点listener_nodetouch listener_node.py gedit listener_node.py # 粘贴如下代码 #!/usr/bin/env python3 import rclpy from rclpy.node import Node from std_msgs.msg import String class ListenerNode(Node): def __init__(self): super().__init__(listener_node) # 创建订阅者监听chatter话题 self.subscription self.create_subscription( String, chatter, self.callback, 10 ) self.get_logger().info(订阅者已启动) # 收到消息后自动执行的回调函数 def callback(self, msg): self.get_logger().info(f收到{msg.data}) def main(argsNone): rclpy.init(argsargs) node ListenerNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()步骤 3注册新节点再次打开setup.py在entry_points中追加两行配置entry_points{ console_scripts: [ hello_node my_first_package.hello_node:main, talker_node my_first_package.talker_node:main, listener_node my_first_package.listener_node:main, ], },步骤 4编译运行cd ~/ros2_ws colcon build source install/setup.bash # 打开两个终端分别运行 # 终端1启动发布者 ros2 run my_first_package talker_node # 终端2启动订阅者 ros2 run my_first_package listener_node运行效果发布者持续发送消息订阅者实时接收并打印。步骤 5可视化调试rqt_graph 查看节点拓扑保持发布者、订阅者两个节点持续运行新开第三个终端执行命令rqt_graph椭圆图形代表节点talker_node、listener_node矩形 / 连线代表话题/chatter箭头方向代表数据流向发布者 → 话题 → 订阅者。六、入门核心知识点复盘层级关系工作空间 →src目录 → 功能包 → 节点自定义代码统一放在ros2_ws/src下构建体系colcon负责编译ament是包规范Python 包固定使用ament_python通信核心话题采用发布 / 订阅模式依靠话题名完成节点匹配松耦合设计是 ROS2 优势固定流程新建代码 → 配置setup.py→colcon build编译 →source刷新环境 → 运行节点。注意1每次修改代码、新增节点后必须执行编译 刷新环境否则 ROS2 无法识别更新2调试优先使用ros2 topic echo和rqt_graph快速定位通信问题。