Skip to content

第十章:ROS2 核心概念详解——最重要的知识点

这一章讲 ROS2 的几个 核心概念。

重要性

理解了这些,后面学起来会顺很多。

这是整个 ROS2 的基础。


10.1 节点(Node)

什么是节点

定义

节点就是一个 独立运行的程序。

一个机器人系统通常由 多个节点 组成,每个节点负责一件事。


举例说明

比如一个节点负责:

  • 读摄像头
  • 处理图像
  • 控制电机

它们各自独立运行,通过 消息通信 来协作。


为什么要这样设计

模块化的好处

  • ✓ 改一个功能只需要改对应的节点
  • 其他不用动

  • ✓ 某个节点出问题了

  • 其他节点还能继续跑

  • ✓ 调试方便

  • 可以单独测试每个节点

节点的常用命令

# 列出当前运行的节点
ros2 node list

# 查看节点的详细信息
ros2 node info /节点名

实例

# 启动小海龟
ros2 run turtlesim turtlesim_node

# 另一个终端查看节点
ros2 node list
# 输出:/turtlesim

# 查看小海龟节点的详细信息
ros2 node info /turtlesim

node info 显示什么

可以看到节点的: - 订阅了哪些话题 - 发布了哪些话题 - 提供了哪些服务 - 使用了哪些参数


10.2 话题(Topic)

什么是话题

定义

话题是节点之间 传递数据的通道。

采用 "发布-订阅" 模式:

  • 发布者(Publisher) 往话题上发数据
  • 订阅者(Subscriber) 从话题上收数据

特点

解耦设计

  • 发布者不管谁在收
  • 订阅者也不管谁在发
  • 它们之间没有直接联系

一对多关系

灵活性

一个话题可以有: - 多个发布者 - 多个订阅者


举例

实际场景

摄像头节点往 /camera/image 话题发图像:

  • 图像处理节点订阅这个话题来处理
  • 同时显示节点也订阅这个话题来显示给你看

常用命令

# 列出所有话题
ros2 topic list

# 实时查看话题上的数据
ros2 topic echo /话题名

# 查看话题发布频率
ros2 topic hz /话题名

# 查看话题信息
ros2 topic info /话题名

# 手动发布消息
ros2 topic pub /话题名 类型 "数据"

实例

# 启动小海龟
ros2 run turtlesim turtlesim_node

# 查看所有话题
ros2 topic list
# 输出:
# /turtle1/cmd_vel
# /turtle1/pose
# /turtle1/color_sensor
# ...

# 实时查看小海龟的位置
ros2 topic echo /turtle1/pose

# 查看速度话题的发布频率
ros2 topic hz /turtle1/cmd_vel

# 手动发布速度指令(让小海龟动起来)
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist \
    "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"

调试神器

ros2 topic echo 是调试时 最常用的命令,

可以实时看到数据流动,非常直观。


10.3 消息(Message)

什么是消息

定义

消息是话题上传输的 数据的格式。

每个话题有固定的消息类型,

就像快递包裹有不同规格一样。


常用的消息类型

1. std_msgs/String

string data

用途

传输字符串


2. geometry_msgs/Twist

Vector3 linear
    float64 x
    float64 y
    float64 z
Vector3 angular
    float64 x
    float64 y
    float64 z

用途

控制机器人移动 - linear:线速度 - angular:角速度


3. sensor_msgs/Image

用途

传输图像数据


4. sensor_msgs/LaserScan

用途

激光雷达数据


查看消息结构

# 查看消息的详细结构
ros2 interface show geometry_msgs/msg/Twist

# 列出所有消息类型
ros2 interface list

实例

# 查看 Twist 消息的结构
ros2 interface show geometry_msgs/msg/Twist

# 输出:
# Vector3 linear
#     float64 x
#     float64 y
#     float64 z
# Vector3 angular
#     float64 x
#     float64 y
#     float64 z

编程时的作用

了解消息结构,方便编程时使用。


10.4 服务(Service)

什么是服务

定义

服务是 "请求-响应" 模式的通信。


工作流程

  1. 客户端 发一个请求
  2. 服务端 处理后返回响应

与话题的区别

特性 话题 服务
通信模式 单向,持续数据流 双向,一问一答
是否等待 不等待响应 等待响应
适用场景 传感器数据 获取状态、执行操作

适用场景

实际应用

  • 获取某个状态
  • 执行某个操作并等待结果

比如:

  • 问问机器人现在电量多少
  • 让机器人重置位置

常用命令

# 列出所有服务
ros2 service list

# 调用服务
ros2 service call /服务名 类型 "请求数据"

# 查看服务类型
ros2 service type /服务名

实例

# 启动小海龟
ros2 run turtlesim turtlesim_node

# 查看所有服务
ros2 service list
# 输出:
# /clear
# /reset
# /spawn
# ...

# 调用清除轨迹的服务
ros2 service call /clear std_srvs/srv/Empty

# 重置小海龟位置
ros2 service call /reset std_srvs/srv/Empty

# 生成新的海龟
ros2 service call /spawn turtlesim/srv/Spawn \
    "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"

10.5 动作(Action)

什么是动作

定义

动作用于 需要较长时间的任务。


工作流程

  1. 你发送一个 目标
  2. 执行过程中可以收到 进度反馈
  3. 最后收到 结果
  4. 中途还能 取消

类比理解

像网购

  • 你下单(发送目标)
  • 然后物流一直告诉你到哪了(反馈)
  • 最后收到货(结果)
  • 中间你还能取消订单

适用场景

实际应用

  • 导航到某个地点
  • 机械臂执行某个动作
  • 任何需要较长时间的任务

动作的组成

一个动作包含三部分:

  1. Goal(目标)
  2. 你想让机器人做什么

  3. Feedback(反馈)

  4. 执行过程中的进度

  5. Result(结果)

  6. 最终的执行结果

常用命令

# 列出所有动作
ros2 action list

# 发送目标
ros2 action send_goal /动作名 类型 "目标数据"

实例

# 控制小海龟转圈
ros2 action send_goal /turtle1/rotate_absolute \
    turtlesim/action/RotateAbsolute "{theta: 1.57}" \
    --feedback

10.6 参数(Parameter)

什么是参数

定义

参数是节点的 配置值,

可以在 运行时修改。


举例

实际应用

  • 机器人的最大速度
  • 传感器的采样频率
  • 背景颜色

这些都可以做成参数,

不用改代码就能调整。


常用命令

# 列出节点的所有参数
ros2 param list

# 获取参数值
ros2 param get /节点名 参数名

# 设置参数值
ros2 param set /节点名 参数名 值

# 保存参数到文件
ros2 param dump /节点名

# 从文件加载参数
ros2 param load /节点名 参数文件

实例

# 启动小海龟
ros2 run turtlesim turtlesim_node

# 查看小海龟节点的参数
ros2 param list /turtlesim
# 输出:
# background_b
# background_g
# background_r
# ...

# 查看背景红色值
ros2 param get /turtlesim background_r

# 修改背景颜色(改成红色)
ros2 param set /turtlesim background_r 255
ros2 param set /turtlesim background_g 0
ros2 param set /turtlesim background_b 0

# 需要调用 clear 服务才能看到效果
ros2 service call /clear std_srvs/srv/Empty

10.7 包(Package)

什么是包

定义

包是代码的 组织单位。

你写的每个功能模块都放在一个包里。


包里面有什么

  • 代码文件
  • 配置文件
  • 启动文件
  • 资源文件

创建包的命令

# Python 包
ros2 pkg create --build-type ament_python 包名 \
    --dependencies rclpy std_msgs

# C++ 包
ros2 pkg create --build-type ament_cmake 包名 \
    --dependencies rclcpp std_msgs

实例

cd ~/ros2_ws/src

# 创建一个 Python 包
ros2 pkg create --build-type ament_python my_robot_pkg \
    --dependencies rclpy std_msgs geometry_msgs

包的常用命令

# 列出所有包
ros2 pkg list

# 查找包的路径
ros2 pkg prefix 包名

# 查看包的可执行文件
ros2 pkg executables 包名

10.8 启动文件(Launch File)

什么是启动文件

定义

启动文件用来 一次启动多个节点,

还可以配置参数。


为什么需要

没有启动文件的痛苦

如果你的系统有 10 个节点,

没有启动文件的话,你要开 10 个终端,

分别运行 10 次 ros2 run。

有启动文件

一行命令全部启动。


启动文件的类型

ROS2 的启动文件是 Python 脚本,

文件名通常是 xxx.launch.py。


运行启动文件

ros2 launch 包名 xxx.launch.py

实例

# 启动 navigation2 导航
ros2 launch nav2_bringup navigation_launch.py

简单的启动文件示例

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='turtle_teleop_key',
            name='teleop',
            output='screen'
        ),
    ])

这个启动文件会

同时启动小海龟和键盘控制节点。


10.9 工作空间(Workspace)

什么是工作空间

定义

工作空间是放你 自己开发的包 的地方。


工作空间的结构

ros2_ws/
├── src/           # 源代码
│   ├── package1/
│   ├── package2/
│   └── ...
├── build/         # 编译产物
├── install/       # 安装文件
└── log/           # 日志

创建工作空间

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

使用工作空间

# 编译工作空间
cd ~/ros2_ws
colcon build

# 加载工作空间环境
source install/setup.bash

10.10 坐标变换(TF2)

什么是 TF2

定义

TF2 用来管理 坐标系之间的关系。


为什么需要

机器人身上有很多传感器:

  • 摄像头
  • 激光雷达
  • IMU

它们各自有自己的坐标系。

问题

摄像头看到一个物体在它前方 1 米,

但这 1 米在机器人坐标系里是哪里?


TF2 的作用

解决方案

TF2 自动处理这些坐标变换,

你可以查询任意两个坐标系之间的关系。


查看 TF 树

# 查看当前的 TF 树
ros2 run tf2_tools view_frames

# 会生成一个 PDF 文件显示坐标系关系

可视化 TF

在 RViz2 里可以显示 TF,

很直观地看到各个坐标系的位置关系。


10.11 核心概念关系图

机器人系统
    ↓
由多个节点组成
    ↓
节点之间通过三种方式通信:
    ├── 话题(Topic)        → 持续数据流
    ├── 服务(Service)      → 一问一答
    └── 动作(Action)       → 长时任务
        ↓
传输的数据有固定格式(消息 Message)
    ↓
节点有配置项(参数 Parameter)
    ↓
节点组织在包(Package)里
    ↓
包放在工作空间(Workspace)里
    ↓
可以用启动文件(Launch)一次启动多个节点
    ↓
坐标系用 TF2 管理

10.12 小海龟系统分析

以小海龟为例,分析 ROS2 系统

节点

/turtlesim        # 小海龟仿真节点
/teleop_turtle    # 键盘控制节点

话题

/turtle1/cmd_vel  # 速度指令(teleop → turtlesim)
/turtle1/pose     # 位置信息(turtlesim → 外界)

服务

/clear            # 清除轨迹
/reset            # 重置
/spawn            # 生成新海龟

参数

backgroun
background_g      # 背景绿色值
background_b      # 背景蓝色值

数据流动

键盘输入
    ↓
teleop_turtle 节点
    ↓
发布到 /turtle1/cmd_vel 话题
    ↓
turtlesim 节点订阅
    ↓
控制小海龟移动
    ↓
发布位置到 /turtle1/pose 话题

本章小结

通过这一章,你应该已经掌握:

  1. 节点(Node)

    独立运行的程序单元

  2. 话题(Topic)

    发布-订阅模式

    用于持续数据流

  3. 服务(Service)

    请求-响应模式

    用于一问一答

  4. 动作(Action)

    用于长时任务

    有反馈和结果

  5. 消息(Message)

    数据的格式定义

  6. 参数(Parameter)

    节点的配置项

  7. 包(Package)

    代码组织单位

  8. 启动文件(Launch)

    批量启动节点

  9. 工作空间(Workspace)

    开发环境

  10. TF2

    坐标变换管理


下一章预告

下一章我们会 开始写代码:

第一个 ROS2 程序——Hello World

手把手教你创建第一个 ROS2 节点,

从实践中加深对概念的理解。


评论区