[ROS2 学习指南1]---核心概念、常用命令、节点及话题通讯案例
2026/7/1 18:49:39 网站建设 项目流程

目录

一、核心基础概念

1.1 节点(Node)

1.2 功能包(Package)

1.3 话题(Topic)

1.4 消息(Message)

1.5 服务(Service)

二、构建系统:ament 与 colcon 详解

2.1 ament

2.2 colcon

2.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 ament

  • ament:是 ROS2 全新的包规范体系,ament 是 catkin(ROS1) 的升级迭代版本。

  • ament_python:ament 体系下专门适配 Python 代码的构建规则;对应ament_cmake则是 C++ 代码专用规则。

2.2 colcon

是 ROS2 统一的编译工具,我们日常使用的colcon build就是它的核心命令。

2.3 三者完整关系

  1. colcon:负责执行编译、安装等实际操作;

  2. ament:规定功能包的目录结构、配置文件格式;

  3. ament_python:针对 “Python 程序” 的细分建造标准,告诉 colcon 这是 Python 包,无需编译二进制文件,仅做脚本管理。

三、ROS2 常用命令

整理日常开发场景会用到的命令,分类整理,可直接收藏查阅。

3.1 工作空间 & 编译命令

# 进入工作空间根目录 cd ~/ros2_ws # 编译工作空间内所有功能包 colcon build # 编译后刷新环境(每次编译必执行) source install/setup.bash

3.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:编写基础打印节点

  1. 进入代码目录:

cd ~/ros2_ws/src/my_first_package/my_first_package

2. 创建并编辑节点文件hello_node.py

touch 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(args=None): rclpy.init(args=args) # 初始化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_node)

cd ~/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(args=None): rclpy.init(args=args) node = TalkerNode() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == "__main__": main()

步骤 2:编写订阅者节点(listener_node

touch 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(args=None): rclpy.init(args=args) 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_nodelistener_node);

  • 矩形 / 连线:代表话题/chatter);

  • 箭头方向:代表数据流向(发布者 → 话题 → 订阅者)。

六、入门核心知识点复盘

  1. 层级关系:工作空间 →src目录 → 功能包 → 节点,自定义代码统一放在ros2_ws/src下;

  2. 构建体系colcon负责编译,ament是包规范,Python 包固定使用ament_python

  3. 通信核心:话题采用发布 / 订阅模式,依靠话题名完成节点匹配,松耦合设计是 ROS2 优势;

  4. 固定流程:新建代码 → 配置setup.pycolcon build编译 →source刷新环境 → 运行节点。

注意:

1)每次修改代码、新增节点后,必须执行编译 + 刷新环境,否则 ROS2 无法识别更新;

2)调试优先使用ros2 topic echorqt_graph,快速定位通信问题。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询