第2章:ROS2核心概念与开发环境搭建

各位同学,欢迎来到第二章。这一章咱们要啃两块硬骨头:一是把ROS2的四个核心概念搞清楚,二是把开发环境搭起来。我个人觉得,概念这东西就像盖房子的地基,地基不稳,后面写代码全是坑。

2.1 节点:ROS2的最小执行单元

节点是什么?说白了,就是一个能独立完成某件事的进程。比如你让一个节点负责读取激光雷达数据,另一个节点负责规划路径,它们各干各的,互不干扰。

我在项目中遇到过一个问题:一开始把所有功能都写在一个节点里,结果调试起来简直要命。改一个地方,整个节点都得重启。后来拆成多个节点,每个节点只干一件事,世界清净了。

核心要点:一个节点就是一个可执行文件,拥有唯一的名称。节点之间通过话题、服务、动作进行通信。

2.2 话题:异步通信的“广播站”

话题是ROS2里最常用的通信方式。想象一下,一个节点在广播消息,其他节点可以选择收听,也可以选择不听。这就是发布/订阅模式。

举个例子:摄像头节点不断发布图像数据到 /camera/image 话题,图像处理节点订阅这个话题,拿到数据就开始处理。发布者和订阅者完全解耦,谁都不需要知道对方的存在。

我的经验:话题通信适合持续性的数据流,比如传感器数据、状态信息。但要注意,话题没有反馈机制——你发出去的消息,对方收没收到,你根本不知道。

2.3 服务:同步通信的“一问一答”

服务就不一样了。它是同步的,客户端发一个请求,服务端必须给出响应。这就像你打电话问客服:“我的快递到哪了?”客服必须回答你,不能挂电话。

我刚开始用服务时犯过一个错:在控制循环里频繁调用服务,结果程序卡死了。为什么?因为服务是同步阻塞的,调用后必须等响应回来才能继续往下走。所以,服务适合偶尔触发的操作,比如“打开摄像头”、“获取当前位姿”。

# 服务端示例
def handle_add_two_ints(request, response):
    response.sum = request.a + request.b
    return response

# 客户端示例
future = client.call_async(AddTwoInts.Request(a=3, b=5))
rclpy.spin_until_future_complete(node, future)
print(f'Result: {future.result().sum}')

2.4 动作:带反馈的“长期任务”

动作是ROS2里最复杂的通信方式,但也是最强大的。它结合了话题和服务的特点:你可以发起一个目标请求(像服务),然后在执行过程中不断收到反馈(像话题),最后还能取消任务。

嗯,这里要注意:动作适合执行时间较长的任务,比如“导航到目标点”、“机械臂抓取物体”。我曾经用服务来实现导航,结果客户端等响应等到超时,整个系统都卡住了。换成动作后,一切顺畅。

通信方式 特点 适用场景
话题 异步、无反馈、一对多 传感器数据、状态广播
服务 同步、有响应、一对一 触发式操作、参数查询
动作 异步、有反馈、可取消 长时间任务、导航控制

2.5 知识体系总览

下面这张图是我手绘的,把四个核心概念的关系串起来了。你仔细看,节点是中心,话题、服务、动作都是节点之间的通信桥梁。

节点 Node 话题 Topic 服务 Service 动作 Action 其他节点 Other Nodes 发布/订阅 请求/响应 目标/反馈 通信 虚线 = 异步通信 | 实线 = 同步通信

2.6 Ubuntu + ROS2 Humble 安装实战

环境搭建这块,我踩过的坑比吃过的盐还多。咱们直接上干货,按步骤来,一步都别跳。

2.6.1 系统要求

  • Ubuntu 22.04 LTS(别用20.04,兼容性有问题)
  • Python 3.10+(系统自带)
  • 至少4GB内存,20GB磁盘空间

2.6.2 安装步骤

# 1. 设置语言环境
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 2. 添加ROS2源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装ROS2 Humble
sudo apt update
sudo apt install ros-humble-desktop -y

# 4. 安装开发工具
sudo apt install python3-colcon-common-extensions -y

避坑指南:我曾经在安装时忘了执行 sudo apt update,结果装了一堆旧版本包,编译时各种报错。记住:每执行一步操作前,先更新索引。

2.6.3 环境配置与验证

# 配置环境变量(建议写入 ~/.bashrc)
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

# 验证安装
ros2 --version
# 应该输出:ros2 humble

# 运行小乌龟测试
ros2 run turtlesim turtlesim_node

看到小乌龟窗口弹出来,说明环境搭好了。如果没出来,检查一下是不是防火墙挡住了端口,或者环境变量没生效。

我的习惯:每次打开新终端,第一件事就是敲 ros2 --version。如果没输出,说明环境变量没加载,赶紧 source 一下。

2.7 本章小结

这一章我们干了三件事:搞懂了节点、话题、服务、动作这四个核心概念;画了一张知识体系图帮你理清关系;亲手搭好了ROS2 Humble开发环境。你想想看,有了这些基础,后面写代码是不是心里有底多了?

记住:概念不懂就多画图,环境出问题就检查日志。ROS2的日志系统很强大,ros2 doctor 命令能帮你诊断大部分问题。

可可精品资料库