环境搭建与依赖安装:在 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 编译结果
编译完了,怎么知道有没有问题?我一般跑两个测试:
- 检查节点列表:
ros2 pkg list | grep nav2,看看有没有nav2_controller、nav2_planner等核心包。 - 运行一个简单测试:
ros2 launch nav2_bringup nav2_bringup_launch.py,看看能不能正常启动。
如果启动时报错说找不到某个库,别慌。大概率是依赖没装全。回到 rosdep install 那一步,重新跑一遍,看看有没有遗漏。
2.6 本章知识体系总览
为了让你对整个流程有个直观印象,我画了一张流程图。你可以把它当作一个检查清单,每完成一步就打个勾。
这张图把整个流程串起来了。你跟着箭头走,每一步都别跳。尤其是「安装 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,先把基础打牢。我见过太多人因为环境问题浪费了几天时间,最后发现只是少装了一个包。嗯,跟着我的步骤来,你不会踩这些坑的。