2. ROS2基础与环境搭建:ROS2 Humble安装、工作空间创建、Colcon编译工具、核心概念
说实话,很多初学者一上来就急着写代码,结果环境没搭好,后面全是坑。我见过太多人在编译上浪费一整天,最后发现是依赖没装全。这一章,咱们就把地基打牢。
ROS2 Humble 是目前最稳定的长期支持版本,也是我们整个课程的基础。我会带着你一步步装好它,再聊聊那些绕不开的核心概念。
2.1 ROS2 Humble 安装
我个人习惯用 Ubuntu 22.04 搭配 ROS2 Humble。为什么选这个组合?因为官方支持最久,社区最活跃,你遇到问题随便一搜就有答案。
2.1.1 设置软件源
先把系统源换成国内的,不然下载慢到怀疑人生。我当年在海外服务器上装,等了一个小时……后来换了清华源,五分钟搞定。
sudo apt update
sudo apt install curl gnupg lsb-release
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
sudo apt update
2.1.2 安装桌面版(推荐)
桌面版包含了可视化工具和示例代码,调试时特别有用。我建议你装这个,别省那点空间。
sudo apt install ros-humble-desktop
如果你是在服务器上跑,或者空间实在紧张,可以装基础版:
sudo apt install ros-humble-ros-base
2.1.3 配置环境变量
装完只是第一步。你得让系统知道 ROS2 在哪。每次打开终端都要 source 一下,很烦对吧?我直接把它写进 .bashrc 里,一劳永逸。
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
.bashrc 里写个别名切换,比如 alias ros1='source /opt/ros/noetic/setup.bash',避免冲突。
2.1.4 验证安装
跑个小例子试试,看看能不能听到话题数据:
ros2 run demo_nodes_cpp talker
再开一个终端,运行:
ros2 run demo_nodes_py listener
如果你看到 talker 在发 "Hello World",listener 在收,那就成了。嗯,这里要注意,如果收不到消息,八成是环境变量没 source 对。
2.2 工作空间创建与 Colcon 编译
工作空间就是你的项目文件夹。ROS2 用 Colcon 来编译代码,取代了 ROS1 时代的 Catkin。说实话,Colcon 比 Catkin 快不少,而且支持并行编译。
2.2.1 创建工作空间
我习惯把工作空间放在 ~/ros2_ws 下,结构清晰:
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build
第一次编译会生成 build、install、log 三个文件夹。别手贱去删它们,Colcon 依赖这些目录做增量编译。
2.2.2 Colcon 常用命令
| 命令 | 作用 | 我常用的场景 |
|---|---|---|
colcon build |
编译整个工作空间 | 第一次编译,或者改了多个包 |
colcon build --packages-select 包名 |
只编译指定包 | 只改了一个包时,省时间 |
colcon build --symlink-install |
使用符号链接安装 | 开发 Python 节点时,改代码不用重新编译 |
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release |
Release 模式编译 | 性能测试前,编译优化版本 |
colcon build 重新编译。Python 代码则不用,加 --symlink-install 就行。
2.2.3 配置工作空间环境
每次编译完,都要 source 一下工作空间的 setup 文件,才能找到你写的节点:
source ~/ros2_ws/install/setup.bash
你也可以把它写进 .bashrc,但要注意顺序——先 source ROS2 系统环境,再 source 工作空间环境。
2.3 核心概念:节点、话题、服务、动作
这四个概念是 ROS2 的基石。你想想看,机器人系统里那么多模块——导航、机械臂、传感器、决策——它们怎么互相通信?就是靠这些东西。
下面这张图能帮你理清它们的关系:
2.3.1 节点(Node)
节点就是 ROS2 里的最小执行单元。每个节点负责一件事,比如摄像头节点只管采集图像,机械臂控制节点只管发指令。节点之间通过通信机制协作,互不干扰。
启动一个节点很简单:
ros2 run <包名> <节点名>
比如:
ros2 run turtlesim turtlesim_node
你会看到一只小乌龟出现在屏幕上。这就是一个节点在运行。
2.3.2 话题(Topic)
话题是 ROS2 里最常用的通信方式。一个节点发布数据,其他节点订阅。发布者和订阅者互不知道对方存在,这就是解耦。
举个例子,摄像头节点发布 /image_raw 话题,图像处理节点订阅它。你完全可以在不修改摄像头节点的情况下,换一个图像处理算法。
常用命令:
ros2 topic list # 列出所有话题
ros2 topic echo /topic # 查看话题数据
ros2 topic info /topic # 查看话题信息
ros2 topic echo /turtle1/pose 看看小乌龟的位置数据。你会发现话题里传的是结构化的消息,不是裸数据。
2.3.3 服务(Service)
服务和话题不一样。话题是“发完就不管了”,服务是“你问我答”。客户端发一个请求,服务端处理完返回一个响应。典型的同步通信。
比如你让小乌龟去某个坐标:
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2}"
服务端会返回新生成乌龟的名字。这就是一问一答。
常用命令:
ros2 service list # 列出所有服务
ros2 service type /服务名 # 查看服务类型
ros2 service call ... # 调用服务
2.3.4 动作(Action)
动作是 ROS2 里最复杂的通信机制,专门处理那些需要很长时间才能完成的任务。比如让机械臂从 A 点移动到 B 点,中间可能需要几秒钟,你希望知道它走到哪了。
动作有三个阶段:
- 目标(Goal):客户端告诉服务端要做什么
- 反馈(Feedback):服务端在执行过程中不断报告进度
- 结果(Result):执行完毕,返回最终结果
举个例子,让小乌龟转圈:
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}" --feedback
加上 --feedback 参数,你会看到它实时报告当前角度。这在调试导航和机械臂时特别有用。
2.4 本章小结
这一章我们干了三件事:装好了 ROS2 Humble,学会了用 Colcon 编译工作空间,理清了节点、话题、服务、动作这四个核心概念。说实话,这些概念一开始可能有点抽象,但别急,后面每一章都会用到它们。等你亲手写几个节点、发几条话题,自然就熟了。
嗯,环境搭好了,概念也清楚了。接下来,咱们就可以开始真正动手写代码了。