第一章 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 的核心模块和它们之间的数据流:
1.2 ROS2 Humble安装
ROS2 的版本很多,Humble 是目前最稳定的长期支持版(LTS),也是 Nav2 官方推荐的首选。我建议你直接用 Ubuntu 22.04 + ROS2 Humble,这个组合我用了两年,兼容性最好。
安装步骤其实很简单,别被网上的长篇教程吓到。核心就这几步:
- 设置编码和源
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
- 安装桌面版(推荐)
sudo apt install ros-humble-desktop
这个包包含了 rviz2、tf2、常用消息类型等,够用了。
- 配置环境变量
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
小技巧:如果你同时装了 ROS1 和 ROS2,记得在 .bashrc 里只 source 一个版本,或者用别名切换。我踩过这个坑,两个版本同时 source 会导致环境变量冲突,编译时各种找不到包。
- 验证安装
ros2 run demo_nodes_cpp talker
打开另一个终端,运行:
ros2 run demo_nodes_py listener
如果能看到「I heard: Hello World」,说明安装成功。
1.3 Nav2源码编译与安装
Nav2 可以通过 apt 直接安装二进制包,但我个人更推荐源码编译。为什么呢?因为调参时你经常需要看源码里的注释,甚至改代码。二进制包看不到源码,出了问题很难排查。
源码编译的步骤如下:
- 创建工作空间
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
- 克隆 Nav2 源码
git clone https://github.com/ros-planning/navigation2.git --branch humble
注意分支名一定要是 humble,别下错了。
- 安装依赖
cd ~/nav2_ws
rosdep install -y -r -q --from-paths src --ignore-src
如果提示 rosdep 没安装,先装一下:
sudo apt install python3-rosdep2
sudo rosdep init
rosdep update
- 编译
colcon build --symlink-install
--symlink-install 这个参数很实用,它让 Python 脚本和 launch 文件以软链接方式安装。你改了源码后不用重新编译,直接运行就能生效。调试时能省很多时间。
- 配置环境
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 生态里最经典的仿真平台,轻量、稳定、文档全。
搭建步骤:
- 安装 Turtlebot3 相关包
sudo apt install ros-humble-turtlebot3*
sudo apt install ros-humble-gazebo-ros2-control
- 设置机器人型号
Turtlebot3 有三种型号:Burger、Waffle、Waffle Pi。我一般用 Waffle,因为它带深度相机,适合做更复杂的感知实验。
echo "export TURTLEBOT3_MODEL=waffle" >> ~/.bashrc
source ~/.bashrc
- 启动仿真环境
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
你会看到 Gazebo 启动,一个带有障碍物的室内场景出现在屏幕上。机器人就在场景中央。
- 启动 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 仿真环境。你现在应该已经能在仿真里让机器人动起来了。