1. Nav2 与 ROS2 生态:从零搭建你的导航开发环境

各位同学,欢迎来到《Nav2导航路径规划实战入门》的第一章。

做机器人导航这些年,我见过太多新手一上来就急着调参数,结果连环境都没搭对,折腾一星期还在编译报错里打转。说实话,导航这东西,环境搭好了,后面就顺了。今天我们就从 Nav2 的背景讲起,一步步把 ROS2 Humble 和 Nav2 源码装好,再把工作空间配明白。

1.1 Nav2 是什么?为什么选它?

Nav2,全称 Navigation2,是 ROS2 生态下最主流的导航框架。它负责让机器人从 A 点走到 B 点,过程中要避开障碍、规划路径、控制速度。

我个人习惯把 Nav2 看作一套「导航乐高」——它把地图服务、路径规划、控制、行为树这些模块拆开,你可以按需拼装。比起 ROS1 时代的 move_base,Nav2 最大的变化是:

  • 原生支持 ROS2:用上了 DDS 通信,实时性更好,分布式部署也更方便
  • 行为树驱动:导航流程不再是硬编码,而是用 XML 配置,改逻辑不用改 C++
  • 生命周期管理:每个模块都有明确的启动/配置/激活状态,系统更稳定

核心观点:Nav2 不是单一的程序,而是一组插件的集合。你完全可以只换掉全局规划器,其他模块不动。这种设计,说白了就是让你能「对症下药」。

1.2 ROS2 Humble 安装:选对版本很重要

ROS2 的版本很多,Humble 是目前最稳定的长期支持版(LTS),支持到 2027 年。我建议新手直接上 Humble,别折腾 Rolling 或 Iron——那些版本更新太快,今天能用的包明天可能就废了。

1.2.1 系统要求

项目 推荐配置 最低配置
操作系统 Ubuntu 22.04 LTS Ubuntu 22.04 LTS
CPU 4 核以上 2 核
内存 8 GB 4 GB
磁盘 40 GB 空闲 20 GB 空闲

注意:千万不要在 Ubuntu 20.04 上强行装 Humble 的包,依赖会冲突到让你怀疑人生。我曾经为了省事试过一次,结果 rosdep 解析依赖花了两个小时,最后还是重装了系统。

1.2.2 安装步骤

打开终端,按顺序执行以下命令:

# 1. 设置编码
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

# 2. 添加 ROS2 源
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install curl
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

# 3. 安装桌面版(包含 rviz2、demo 等)
sudo apt update
sudo apt install ros-humble-desktop

# 4. 安装开发工具
sudo apt install python3-colcon-common-extensions python3-rosdep python3-vcstool

# 5. 初始化 rosdep
sudo rosdep init
rosdep update

装完后,记得把下面这行加到 ~/.bashrc 里:

source /opt/ros/humble/setup.bash

然后 source ~/.bashrc 让它生效。验证一下:

ros2 run demo_nodes_cpp talker

如果看到「Publishing: 'Hello World'」不断刷屏,恭喜你,ROS2 装好了。

1.3 Nav2 源码编译与安装

为什么我推荐源码编译而不是直接 apt 安装?嗯,这里有个坑。apt 安装的 Nav2 版本通常比源码慢一两个小版本,而且你没法改代码。做导航开发,迟早要动源码的,不如一开始就编译。

1.3.1 创建工作空间

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

1.3.2 拉取源码

Nav2 的官方仓库在 GitHub 上,我们用 vcs 工具来管理多个仓库的版本:

cd ~/nav2_ws
wget https://raw.githubusercontent.com/ros-planning/navigation2/main/navigation2.repos
vcs import src < navigation2.repos

这一步会拉下来十几个包,包括 nav2_core、nav2_planner、nav2_controller、nav2_bt_navigator 等等。你想想看,如果手动一个一个 git clone,得累死。

1.3.3 安装依赖

cd ~/nav2_ws
rosdep install -r --from-paths src --ignore-src --rosdistro humble -y

这个命令会自动解析每个包的依赖,然后 apt 安装。如果遇到网络问题,多试几次,或者换个源。

1.3.4 编译

cd ~/nav2_ws
colcon build --symlink-install

--symlink-install 这个参数很重要。它会让编译后的文件以软链接方式安装,这样你改了 Python 脚本或 launch 文件后,不用重新编译就能生效。我在调试行为树时经常改 XML,这个参数帮我省了大量时间。

编译时间取决于你的机器配置,一般 10-20 分钟。如果报错,多半是依赖没装全,回头再跑一遍 rosdep install 就行。

1.3.5 配置环境变量

编译完成后,把工作空间的 setup 脚本加到 ~/.bashrc:

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

小技巧:如果你同时有 ROS2 官方包和 Nav2 源码,注意 source 顺序。先 source 官方的 /opt/ros/humble/setup.bash,再 source 工作空间的。这样工作空间的包会覆盖官方同名包,确保你用的是自己编译的版本。

1.4 工作空间配置:让开发更顺手

工作空间配好了,但离「顺手」还差几步。下面是我个人的一些配置习惯,供你参考。

1.4.1 创建别名

在 ~/.bashrc 里加几个别名,能省不少打字:

alias cbnav='cd ~/nav2_ws && colcon build --symlink-install'
alias sbnav='source ~/nav2_ws/install/setup.bash'
alias nav2='cd ~/nav2_ws/src/navigation2'

1.4.2 配置 VS Code 工作区

如果你用 VS Code,建议把 ~/nav2_ws 作为工作区根目录,然后安装这些插件:

  • C/C++:代码补全和调试
  • Python:Python 支持
  • XML:行为树 XML 高亮
  • ROS:ROS2 消息、服务、动作的语法支持

然后在 .vscode/c_cpp_properties.json 里添加 Nav2 的头文件路径:

{
  "configurations": [
    {
      "name": "Linux",
      "includePath": [
        "${workspaceFolder}/**",
        "/opt/ros/humble/include/**"
      ],
      "defines": [],
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "c17",
      "cppStandard": "c++17",
      "intelliSenseMode": "linux-gcc-x64"
    }
  ],
  "version": 4
}

1.4.3 验证安装

最后,跑一个简单的测试,确认 Nav2 能正常工作:

ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False

如果看到 rviz2 界面弹出,地图上有一个 TurtleBot3,并且你可以用「2D Nav Goal」给它发目标点,那就说明一切就绪。

避坑指南:我曾经在编译时漏了 nav2_msgs 这个包,结果跑 launch 时一直报「找不到消息类型」。后来发现是 vcs import 时网络断了,少拉了一个仓库。所以拉完源码后,记得检查一下 src 目录下有没有 navigation2、nav2_msgs、nav2_bringup 这些关键文件夹。

1.5 本章知识体系总览

下面这张图帮你理清本章的核心脉络:

第1章 知识体系总览 Nav2 与 ROS2 生态 Nav2 项目背景 ROS2 Humble 安装 Nav2 源码编译 工作空间配置 行为树驱动 生命周期管理 Ubuntu 22.04 LTS colcon build VS Code 配置 核心要点 • Nav2 是 ROS2 生态下的模块化导航框架 • 推荐使用 Ubuntu 22.04 + ROS2 Humble 组合 • 源码编译比 apt 安装更灵活,适合开发调试

这张图把本章的四个核心模块串起来了。从 Nav2 的背景出发,到 ROS2 安装、Nav2 编译,最后是工作空间配置。每一步都是下一步的基础,缺一不可。

1.6 小结

这一章我们做了三件事:

  1. 搞清楚了 Nav2 是什么,以及它为什么值得学
  2. 装好了 ROS2 Humble 和 Nav2 源码
  3. 配好了开发环境,让后续编码更顺手