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。我建议你装这个版本,兼容性最好。
安装步骤其实不复杂,但有几个坑要注意:
- 下载镜像:去Ubuntu官网下载22.04 LTS桌面版。别下成服务器版,那个没有图形界面。
- 制作启动盘:用Rufus(Windows)或balenaEtcher(跨平台)把镜像写入U盘。
- 分区建议:至少给Ubuntu分配50GB空间。我习惯分三个区:
/(根目录)30GB、/home(用户目录)剩余空间、swap(交换分区)8GB。 - 安装时断网:这一步很多人不知道。安装时断开网络,可以避免下载更新包,安装速度会快很多。装完再联网更新。
注意:如果你用的是双系统(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舒服太多了。