1、ROS2概述与环境搭建:ROS2起源、核心概念、与ROS1的区别、Ubuntu系统安装、ROS2 Humble安装、工作空间创建与编译

1.1 ROS2的起源——为什么要有ROS2?

说起ROS2的起源,得先聊聊ROS1的「痛」。ROS1诞生于2007年,那时候机器人还比较「单纯」,大多跑在单台电脑上。我2016年刚接触ROS1时,觉得这东西真方便——节点通信、消息传递,一套搞定。

但后来做项目就发现问题了。有一次我在一个多机器人协同的项目里,两台机器人需要实时交换位置信息。ROS1的通信依赖一个叫「roscore」的中心节点,这玩意儿一旦挂了,整个系统就瘫痪了。你想想看,机器人正在仓库里跑着,突然通信断了……嗯,那场面挺尴尬的。

所以ROS2在2015年开始设计,2017年发布第一个正式版。它的核心目标就三个:去中心化、实时性、跨平台。说白了,就是让机器人系统更健壮、更灵活。

核心变化:ROS2抛弃了roscore,改用DDS(数据分发服务)作为底层通信。DDS本身就是工业级的标准,天生支持分布式、实时通信。

1.2 核心概念——节点、话题、服务、动作

这四个概念是ROS2的「四梁八柱」。我建议你先把它们理解透,后面写代码会顺手很多。

1.2.1 节点(Node)

节点就是ROS2里的「最小执行单元」。每个节点负责一个具体的功能,比如控制电机、处理激光雷达数据。我个人习惯把节点想象成「一个人」——每个人只做一件事,但大家配合起来就能完成复杂任务。

举个例子:一个机器人可能有「电机控制节点」「激光雷达节点」「路径规划节点」。它们各自独立运行,通过话题或服务通信。

1.2.2 话题(Topic)

话题是「发布-订阅」模式。一个节点发布消息到某个话题,其他节点订阅这个话题就能收到消息。这是一种异步通信,适合传感器数据这种持续更新的信息。

我在项目中遇到过一个问题:激光雷达数据频率是10Hz,但订阅节点处理太慢,导致消息堆积。后来我调整了队列大小,才解决。嗯,这里要注意——话题的队列长度要根据实际场景设置,不是越大越好。

1.2.3 服务(Service)

服务是「请求-响应」模式。客户端发送请求,服务端处理并返回结果。这是一种同步通信,适合「问一句答一句」的场景,比如「请告诉我当前电池电量」。

我曾经在调试时犯过一个低级错误:在回调函数里调用了另一个服务,结果造成了死锁。所以记住:不要在服务回调里调用其他服务,除非你很清楚自己在做什么。

1.2.4 动作(Action)

动作是「目标-反馈-结果」模式。它比服务更复杂,适合需要长时间执行的任务,比如「让机器人走到A点」。动作可以随时取消,还能实时反馈进度。

我个人觉得动作是ROS2里最优雅的设计之一。它把「目标」「反馈」「结果」三个部分拆开,让开发者能精细控制任务执行。

通信方式 模式 适用场景 示例
话题 发布-订阅 持续数据流 激光雷达数据
服务 请求-响应 一次性查询 获取电池电量
动作 目标-反馈-结果 长时间任务 导航到目标点

1.3 ROS2与ROS1的区别——不只是版本升级

很多人以为ROS2就是ROS1的升级版,其实不是。它们是两套不同的系统。我列几个关键区别:

  • 通信架构:ROS1用TCPROS/UDPROS,依赖roscore;ROS2用DDS,去中心化。
  • 操作系统支持:ROS1主要跑在Linux上;ROS2支持Linux、Windows、macOS,甚至RTOS。
  • 实时性:ROS2原生支持实时调度,ROS1需要额外打补丁。
  • 安全性:ROS2内置DDS安全机制,支持加密和认证;ROS1基本没有安全考虑。
  • 编程接口:ROS2的API更现代化,支持C++11/14、Python3,而ROS1还停留在C++03。

我的建议:如果你是从零开始学,直接学ROS2。ROS1已经进入维护模式,新项目基本都用ROS2了。

1.4 Ubuntu系统安装——打好地基

ROS2 Humble官方推荐Ubuntu 22.04 LTS。我建议你装这个版本,兼容性最好。

安装步骤其实不复杂,但有几个坑要注意:

  1. 下载镜像:去Ubuntu官网下载22.04 LTS桌面版。别下成服务器版,那个没有图形界面。
  2. 制作启动盘:用Rufus(Windows)或balenaEtcher(跨平台)把镜像写入U盘。
  3. 分区建议:至少给Ubuntu分配50GB空间。我习惯分三个区:/(根目录)30GB、/home(用户目录)剩余空间、swap(交换分区)8GB。
  4. 安装时断网:这一步很多人不知道。安装时断开网络,可以避免下载更新包,安装速度会快很多。装完再联网更新。

注意:如果你用的是双系统(Windows+Ubuntu),一定要先关闭Windows的快速启动。否则Ubuntu可能无法正常挂载Windows分区,甚至导致数据丢失。

1.5 ROS2 Humble安装——一步到位

ROS2 Humble是2022年发布的LTS版本,支持到2027年。我个人觉得这是目前最稳定的ROS2版本。

安装命令很简单,但顺序别搞错:

# 1. 设置locale
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 $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 3. 安装ROS2 Humble桌面版
sudo apt update
sudo apt install ros-humble-desktop

# 4. 设置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装完成后,可以测试一下:

# 启动一个发布者
ros2 run demo_nodes_cpp talker

# 另开一个终端,启动订阅者
ros2 run demo_nodes_py listener

如果能看到「I heard: Hello World」之类的输出,说明安装成功了。

避坑指南:我曾经在安装时忘了设置locale,结果编译时一堆乱码错误。所以第一步的locale设置千万别跳过。

1.6 工作空间创建与编译——你的第一个ROS2项目

工作空间(Workspace)是ROS2项目的「容器」。所有代码、依赖、编译产物都放在里面。

创建步骤:

# 1. 创建工作空间目录
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws

# 2. 编译工作空间(第一次编译)
colcon build

# 3. 设置环境变量
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

这里有个小细节:colcon build默认会编译所有包。如果你只想编译某个包,可以用:

colcon build --packages-select 你的包名

我刚开始用ROS2时,每次编译都等很久。后来发现可以用--symlink-install参数,这样修改Python文件后不用重新编译,直接运行就行:

colcon build --symlink-install

注意:每次打开新终端,都要执行source ~/ros2_ws/install/setup.bash,否则系统找不到你自定义的包。我建议直接写到.bashrc里,一劳永逸。

好了,到这里ROS2的环境就搭好了。下一章我们会开始写第一个ROS2节点,实现一个简单的发布-订阅程序。到时候你会发现,ROS2的编程体验比ROS1舒服太多了。