第一章 Nav2概览与环境搭建

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

做机器人导航,说白了就是让机器人知道「我在哪」「要去哪」「怎么去」。Nav2 是目前 ROS2 生态下最主流的导航框架,没有之一。我最早接触 Nav2 时还在用 ROS1 的 move_base,那时候每次参数调崩了就得重启整个节点,很痛苦。后来 Nav2 用生命周期节点管理,稳定性和灵活性都上了一个台阶。

这一章我们先搭好环境,把地基打牢。后面所有调参、改算法、跑仿真,都依赖这一章的内容。

1.1 Nav2架构简介

Nav2 不是一个单一的程序,而是一套模块化的导航系统。它把定位、规划、控制、恢复行为拆成了独立的插件,你可以按需组合。

我习惯把 Nav2 的核心模块分成三层:

  • 感知层:处理传感器数据,比如激光雷达、深度相机、IMU。输出地图和位姿。
  • 规划层:全局规划器(Global Planner)算出一条从起点到终点的路径;局部规划器(Local Planner)实时避障,把全局路径切成可执行的局部轨迹。
  • 控制层:把规划好的轨迹转换成速度指令,发给底盘。

嗯,这里要注意,Nav2 的架构里还有一个容易被忽略的部分——行为树(Behavior Tree)。它负责管理导航任务的流程,比如「先定位,再规划,如果规划失败就执行恢复行为」。我个人觉得,理解行为树是调参进阶的关键,后面我们会专门讲。

核心要点:Nav2 的模块化设计让你可以替换任意组件。比如你觉得默认的全局规划器 Navfn 不够好,可以换成 Smac Planner 或者 Hybrid-A*。这种灵活性在实际项目中非常有用。

下面这张图展示了 Nav2 的核心模块和它们之间的数据流:

Nav2 核心架构与数据流 感知层 激光雷达 / 深度相机 / IMU 地图服务 代价地图 / 静态地图 定位模块 AMCL / 里程计 规划层 全局规划器 + 局部规划器 Navfn / Smac / DWB / TEB 行为树 任务流程管理 恢复行为 / 重规划 控制层 速度指令 / 底盘控制 数据流方向 传感器 → 地图/定位 → 规划 → 控制 行为树贯穿整个流程,管理任务状态

1.2 ROS2 Humble安装

ROS2 的版本很多,Humble 是目前最稳定的长期支持版(LTS),也是 Nav2 官方推荐的首选。我建议你直接用 Ubuntu 22.04 + ROS2 Humble,这个组合我用了两年,兼容性最好。

安装步骤其实很简单,别被网上的长篇教程吓到。核心就这几步:

  1. 设置编码和源
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository universe
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
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
sudo apt update
  1. 安装桌面版(推荐)
sudo apt install ros-humble-desktop

这个包包含了 rviz2、tf2、常用消息类型等,够用了。

  1. 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

小技巧:如果你同时装了 ROS1 和 ROS2,记得在 .bashrc 里只 source 一个版本,或者用别名切换。我踩过这个坑,两个版本同时 source 会导致环境变量冲突,编译时各种找不到包。

  1. 验证安装
ros2 run demo_nodes_cpp talker

打开另一个终端,运行:

ros2 run demo_nodes_py listener

如果能看到「I heard: Hello World」,说明安装成功。

1.3 Nav2源码编译与安装

Nav2 可以通过 apt 直接安装二进制包,但我个人更推荐源码编译。为什么呢?因为调参时你经常需要看源码里的注释,甚至改代码。二进制包看不到源码,出了问题很难排查。

源码编译的步骤如下:

  1. 创建工作空间
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
  1. 克隆 Nav2 源码
git clone https://github.com/ros-planning/navigation2.git --branch humble

注意分支名一定要是 humble,别下错了。

  1. 安装依赖
cd ~/nav2_ws
rosdep install -y -r -q --from-paths src --ignore-src

如果提示 rosdep 没安装,先装一下:

sudo apt install python3-rosdep2
sudo rosdep init
rosdep update
  1. 编译
colcon build --symlink-install

--symlink-install 这个参数很实用,它让 Python 脚本和 launch 文件以软链接方式安装。你改了源码后不用重新编译,直接运行就能生效。调试时能省很多时间。

  1. 配置环境
echo "source ~/nav2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

注意:编译时如果报错缺少某个依赖包,别慌。先运行 rosdep install 检查一遍,大部分依赖问题都能解决。如果还缺,手动 sudo apt install 对应的包就行。我曾经在编译时卡在 nav2_msgs 的依赖上,后来发现是 rosdep 没更新,运行 rosdep update 后就好了。

1.4 Turtlebot3仿真环境搭建

没有实体机器人?没关系,仿真环境一样能跑 Nav2。Turtlebot3 是 ROS2 生态里最经典的仿真平台,轻量、稳定、文档全。

搭建步骤:

  1. 安装 Turtlebot3 相关包
sudo apt install ros-humble-turtlebot3*
sudo apt install ros-humble-gazebo-ros2-control
  1. 设置机器人型号

Turtlebot3 有三种型号:Burger、Waffle、Waffle Pi。我一般用 Waffle,因为它带深度相机,适合做更复杂的感知实验。

echo "export TURTLEBOT3_MODEL=waffle" >> ~/.bashrc
source ~/.bashrc
  1. 启动仿真环境
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

你会看到 Gazebo 启动,一个带有障碍物的室内场景出现在屏幕上。机器人就在场景中央。

  1. 启动 Nav2 导航

新开一个终端:

ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True

rviz2 会打开,加载地图和机器人模型。这时候你可以用「2D Nav Goal」工具给机器人一个目标点,它就会开始规划路径并移动。

避坑指南:我第一次跑仿真时,机器人一直原地打转,就是不往前走。后来发现是 use_sim_time:=True 这个参数没加。仿真环境的时间是模拟出来的,如果不设置这个参数,Nav2 的时间戳会和仿真时间不同步,导致规划器认为机器人一直在原地。

本章小结

这一章我们做了三件事:理解了 Nav2 的模块化架构,装好了 ROS2 Humble 和 Nav2 源码,搭起了 Turtlebot3 仿真环境。你现在应该已经能在仿真里让机器人动起来了。