2. ROS2开发环境搭建:Ubuntu系统安装、ROS2 Humble安装、工作空间创建与编译测试

好,咱们正式开始动手。这一章,我会带你从零搭建一套能跑ROS2 Humble的开发环境。别小看这一步,我见过太多人后面编译报错、节点跑不起来,追根溯源都是环境没搞利索。咱们稳扎稳打,把地基打牢。

2.1 Ubuntu 22.04 LTS 系统安装

ROS2 Humble 官方推荐的是 Ubuntu 22.04 LTS。说白了,版本要对上,不然依赖库版本冲突会让你头疼。

2.1.1 系统镜像与启动盘

  • 镜像下载:去 Ubuntu 官网下载 ubuntu-22.04.3-desktop-amd64.iso。我个人习惯用 LTS 版本,稳定,社区支持好。
  • 制作启动盘:用 Rufus(Windows)或 dd 命令(Linux/macOS)把镜像写入 U 盘。注意,制作过程会格式化 U 盘,数据提前备份好。

2.1.2 安装要点与避坑

安装过程其实很傻瓜式,但有几点我建议你留意:

  • 分区建议:如果你是双系统,给 Ubuntu 至少留 80GB 空间。我建议分三个区:/(根目录)50GB、/home(用户数据)剩余空间、swap(交换分区)8GB。这样重装系统时,你的代码和配置都在 /home 里,不会丢。
  • 软件更新:安装时勾选「为图形和 Wi-Fi 安装第三方软件」。嗯,这里要注意,NVIDIA 显卡驱动建议装完系统后再手动安装,避免黑屏。
  • 避坑指南:我曾经在一台老笔记本上装 Ubuntu 22.04,结果无线网卡不识别。后来发现是内核版本问题,手动装了驱动才解决。所以,装完系统第一件事,先确认网络和显卡驱动正常。
我的小技巧:装完系统后,立刻执行 sudo apt update && sudo apt upgrade -y,把系统包更新到最新。这一步能避免很多因系统库过旧导致的编译问题。

2.2 ROS2 Humble 安装

ROS2 的安装方式有两种:Debian 包(推荐)和源码编译。咱们用 Debian 包,省时省力。

2.2.1 设置软件源

先让系统能识别 ROS2 的仓库。打开终端,逐条执行:

# 设置 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
export LANG=en_US.UTF-8

# 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe

# 添加 ROS2 GPG 密钥
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

# 将仓库添加到 sources.list
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

2.2.2 安装 ROS2 Humble

更新索引后,直接安装桌面版(包含 GUI 工具):

sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop

这个过程大概 10-20 分钟,取决于你的网速。安装完成后,记得配置环境变量:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:如果你用的是 zsh,记得把 .bashrc 换成 .zshrc。我刚开始用 zsh 时就忘了这茬,每次打开终端都要手动 source,很烦。

2.2.3 验证安装

运行一个简单的测试,看看 ROS2 能不能正常工作:

# 终端1:启动一个发布者
ros2 run demo_nodes_cpp talker

# 终端2:启动一个订阅者
ros2 run demo_nodes_py listener

如果两个终端都能正常输出,说明安装成功。你想想看,一个节点发 "Hello World",另一个节点收到并打印,这就是最基础的通信模型。

2.3 工作空间创建与编译测试

工作空间(Workspace)是 ROS2 项目的根目录。所有代码、包、配置文件都放在这里。我习惯用 colcon 来编译,它是 ROS2 的官方构建工具。

2.3.1 创建工作空间

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

第一次编译会生成 build、install、log 三个目录。其中 install 里是编译好的可执行文件和库文件。

2.3.2 配置环境变量

每次打开新终端,都要 source 工作空间的 setup 文件:

echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

为什么要这么做?因为 ROS2 通过环境变量来查找包。不 source,你的节点就找不到自己写的代码。

2.3.3 创建第一个 ROS2 包

咱们创建一个简单的 C++ 发布者节点,测试整个流程:

cd ~/ros2_ws/src
ros2 pkg create my_first_pkg --build-type ament_cmake --dependencies rclcpp std_msgs

这个命令会生成一个包模板。在 src/my_first_pkg/src 下新建一个 publisher.cpp:

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

int main(int argc, char *argv[]) {
    rclcpp::init(argc, argv);
    auto node = std::make_shared<rclcpp::Node>("minimal_publisher");
    auto publisher = node->create_publisher<std_msgs::msg::String>("topic", 10);
    auto message = std_msgs::msg::String();
    message.data = "Hello from my_first_pkg!";

    rclcpp::WallRate loop_rate(1);
    while (rclcpp::ok()) {
        RCLCPP_INFO(node->get_logger(), "Publishing: '%s'", message.data.c_str());
        publisher->publish(message);
        rclcpp::spin_some(node);
        loop_rate.sleep();
    }
    rclcpp::shutdown();
    return 0;
}

别忘了修改 CMakeLists.txt,添加可执行文件:

add_executable(publisher src/publisher.cpp)
ament_target_dependencies(publisher rclcpp std_msgs)
install(TARGETS publisher DESTINATION lib/${PROJECT_NAME})

2.3.4 编译与运行

cd ~/ros2_ws
colcon build --packages-select my_first_pkg
source install/setup.bash
ros2 run my_first_pkg publisher

如果终端每秒打印一条 "Publishing: 'Hello from my_first_pkg!'",恭喜你,环境搭建完成!

核心逻辑总结:整个开发环境搭建,本质上就是「系统 → ROS2 核心 → 工作空间 → 自定义包」的层层嵌套。每一层都依赖上一层正确配置。下面这张图可以帮你理清关系。
第1层:Ubuntu 22.04 LTS 系统 系统内核、驱动、网络、基础库 第2层:ROS2 Humble 核心 rclcpp、rclpy、通信中间件(DDS) 第3层:工作空间(Workspace) src / build / install / log 目录结构 第4层:自定义 ROS2 包 节点、话题、服务、参数

这张图很直观:底层是 Ubuntu 系统,往上依次是 ROS2 核心、工作空间、自定义包。每一层都依赖下一层正确配置。我在项目中遇到过有人跳过系统更新直接装 ROS2,结果编译时缺库,折腾了一下午。所以,别偷懒,按顺序来。

我的习惯:每次新建工作空间,我都会在 src 目录下放一个 .gitignore 文件,把 build、install、log 排除掉。这样代码仓库只存源码,清爽很多。

好了,环境搭好了,代码也能跑了。下一章咱们会深入 ROS2 的通信机制,看看节点之间到底是怎么「聊天」的。嗯,到时候你会觉得,ROS2 的设计其实挺优雅的。