环境搭建与依赖安装:在 Ubuntu 22.04 上安装 ROS2 Humble,编译 Nav2 源码,配置工作空间

说实话,搞机器人导航,环境搭建这一步最容易被轻视。很多人急着跑 Demo,结果编译报错一整天,心态直接崩了。我刚开始接触 Nav2 时也踩过不少坑,尤其是 ROS2 和 ROS1 的思维差异,真得花点时间适应。

这一章,咱们就把地基打牢。我会带着你一步步在 Ubuntu 22.04 上装好 ROS2 Humble,然后从源码编译 Nav2,最后配好工作空间。嗯,跟着我的节奏来,别跳步。

2.1 为什么选择 Ubuntu 22.04 + ROS2 Humble?

你可能要问:为什么非得是 Ubuntu 22.04?我用 20.04 行不行?

我的建议是:别折腾。ROS2 Humble 是 2022 年发布的 LTS 版本,官方明确推荐 Ubuntu 22.04 (Jammy)。虽然也能在 20.04 上强行装,但依赖冲突会让你怀疑人生。我在项目中试过一次,最后老老实实重装了系统。

组件 推荐版本 说明
操作系统 Ubuntu 22.04 LTS 官方支持最完善,依赖库版本匹配
ROS2 发行版 Humble Hawksbill 2022-2027 LTS,与 Nav2 主线兼容
Nav2 版本 Humble 分支源码 直接从 GitHub 拉取,保持最新
编译器 GCC 11.x / Clang 14+ 系统自带,无需额外安装

核心原则:ROS2 的依赖管理比 ROS1 严格得多。版本不对,编译报错时你连错误日志都看不懂。所以,请务必使用 Ubuntu 22.04 原版镜像,不要用任何魔改版。

2.2 安装 ROS2 Humble

安装过程其实不复杂,但有几个细节容易翻车。我习惯把步骤拆成四块:设置源、装包、配环境、验证。

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

小技巧:如果你在校园网或企业内网,建议提前把 ros.key 下载到本地,避免 curl 超时。我曾经在客户现场折腾了半小时,最后发现是网络策略拦截了 raw.githubusercontent.com。

2.2.2 安装 ROS2 Humble 桌面版

我个人习惯装桌面版(desktop),因为它包含了 RViz、Gazebo 等可视化工具,调试时非常方便。如果你硬盘空间紧张,也可以只装基础版(ros-base),但后续你可能还得补装一堆包。

sudo apt update
sudo apt upgrade

# 安装桌面版(推荐)
sudo apt install ros-humble-desktop

# 或者只装基础版
# sudo apt install ros-humble-ros-base

这个过程大概需要 10-20 分钟,取决于你的网速。趁这个时间,你可以去泡杯咖啡。

2.2.3 配置环境变量

装完之后,别忘了把 ROS2 加到你的 bash 环境里。不然每次打开终端都要手动 source,烦得很。

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

注意:如果你同时装了 ROS1 和 ROS2,千万别把两个 setup.bash 都 source 到同一个终端里。它们的环境变量会打架,导致各种诡异问题。我建议用别名或单独开终端来区分。

2.2.4 验证安装

装完别急着走,先跑个简单测试,确保 ROS2 能正常工作。

# 检查 ROS2 版本
ros2 --version

# 启动一个 talker 节点
ros2 run demo_nodes_cpp talker &

# 再开一个终端,启动 listener 节点
ros2 run demo_nodes_py listener

如果你看到 talker 在发 "Hello World",listener 在收,那就说明 ROS2 装好了。嗯,这一步虽然简单,但能帮你排除 90% 的环境问题。

2.3 安装 Nav2 依赖

ROS2 装好只是第一步。Nav2 还需要一些额外的依赖库,比如 navigation2 本身、slam_toolbox、nav2_bringup 等。我建议直接用 apt 装二进制版本来满足依赖,然后源码编译 Nav2 核心。

# 安装 Nav2 相关依赖
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
sudo apt install ros-humble-slam-toolbox
sudo apt install ros-humble-turtlebot3-gazebo

# 安装编译工具
sudo apt install python3-colcon-common-extensions
sudo apt install python3-rosdep

为什么先装二进制版?因为 Nav2 的依赖树很复杂,用 apt 装二进制版会自动解决所有依赖。之后你编译源码时,这些库会被 colcon 识别为系统依赖,不会重复编译。说白了,就是省时间。

2.4 从源码编译 Nav2

好了,重头戏来了。为什么要从源码编译?因为二进制版是稳定版,但 Nav2 的迭代很快,很多新功能和新修复都在源码里。我在项目中遇到过二进制版没有的避障参数,最后还是靠源码解决的。

2.4.1 创建工作空间

mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src

# 克隆 Nav2 源码(Humble 分支)
git clone https://github.com/ros-planning/navigation2.git -b humble

2.4.2 安装依赖

Nav2 的依赖管理用的是 rosdep。第一次用的话,记得先初始化。

# 初始化 rosdep
sudo rosdep init
rosdep update

# 安装工作空间依赖
cd ~/nav2_ws
rosdep install -y --from-paths src --ignore-src --rosdistro humble

避坑指南:我曾经在 rosdep install 这一步卡了半小时,最后发现是网络问题。如果你也遇到依赖下载失败,可以试试设置代理,或者手动下载缺失的 deb 包。另外,--ignore-src 参数很重要,它告诉 rosdep 只装系统依赖,不处理源码包。

2.4.3 编译 Nav2

编译 Nav2 需要点耐心。我第一次编译时,笔记本风扇直接起飞,跑了将近 40 分钟。建议你确保电脑散热良好,别在膝盖上编译。

cd ~/nav2_ws

# 编译所有包
colcon build --symlink-install

# 如果你只想编译特定包(比如 nav2_core)
# colcon build --packages-select nav2_core

--symlink-install 参数的意思是:安装时用符号链接代替复制文件。这样你修改 Python 脚本后不用重新编译,直接就能生效。调试时非常方便。

2.4.4 配置工作空间环境

编译完成后,别忘了把工作空间加到环境变量里。不然你运行 ros2 run 时找不到 Nav2 的节点。

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

注意顺序:如果你同时 source 了 ROS2 的全局 setup.bash 和 Nav2 工作空间的 setup.bash,一定要把工作空间的放在后面。因为工作空间的包会覆盖全局的同名包。顺序错了,你运行的可能是旧版本。

2.5 验证 Nav2 编译结果

编译完了,怎么知道有没有问题?我一般跑两个测试:

  1. 检查节点列表:ros2 pkg list | grep nav2,看看有没有 nav2_controller、nav2_planner 等核心包。
  2. 运行一个简单测试:ros2 launch nav2_bringup nav2_bringup_launch.py,看看能不能正常启动。

如果启动时报错说找不到某个库,别慌。大概率是依赖没装全。回到 rosdep install 那一步,重新跑一遍,看看有没有遗漏。

2.6 本章知识体系总览

为了让你对整个流程有个直观印象,我画了一张流程图。你可以把它当作一个检查清单,每完成一步就打个勾。

环境搭建与依赖安装流程 环境搭建与依赖安装流程 安装 Ubuntu 22.04 安装 ROS2 Humble 安装 Nav2 依赖 编译 Nav2 源码 配置工作空间 ⚠️ 关键提醒 • 版本必须匹配 • 网络问题提前准备 • 编译顺序别搞反 💡 个人经验 • 先装二进制再源码 • 用 --symlink-install • 工作空间 source 放最后

这张图把整个流程串起来了。你跟着箭头走,每一步都别跳。尤其是「安装 Nav2 依赖」和「编译 Nav2 源码」之间,很多人会漏掉 rosdep install,结果编译报错一堆 missing package。

2.7 常见问题与解决方案

最后,我整理了几个我遇到过的高频问题。如果你在搭建过程中卡住了,先来这里翻一翻。

问题现象 可能原因 解决方案
rosdep init 报错 网络问题或已初始化 检查网络,或跳过 sudo rosdep init 直接 rosdep update
编译时找不到 nav2_msgs 依赖未安装或未 source 重新运行 rosdep install,确认 source /opt/ros/humble/setup.bash
colcon build 卡在 0% 内存不足或磁盘空间满 检查 free -h 和 df -h,关闭其他程序
启动 Nav2 时提示 libnav2_core.so 找不到 工作空间未 source 或编译失败 确认 source ~/nav2_ws/install/setup.bash,重新编译

最后说一句:环境搭建这件事,一次配好,后面省心。别急着跑 Demo,先把基础打牢。我见过太多人因为环境问题浪费了几天时间,最后发现只是少装了一个包。嗯,跟着我的步骤来,你不会踩这些坑的。