安装与编译:从源码编译Nav2、使用二进制包安装、依赖检查与常见问题

这一章咱们聊聊怎么把Nav2请进你的系统里。说实话,安装这事看着简单,但我在项目里见过太多人卡在这一步——不是依赖冲突,就是版本不对,折腾一整天连个demo都跑不起来。所以我把两种主流方式都拆开讲清楚,你根据自己的情况选一种就行。

方式一:二进制包安装(推荐新手)

如果你刚接触Nav2,或者就想快速验证一个想法,我个人建议直接用二进制包。省心,省时间。

核心命令(ROS2 Humble为例):

sudo apt update
sudo apt install ros-humble-nav2-bringup
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-turtlebot3-gazebo  # 如果你需要仿真环境

嗯,这里要注意:ros-humble-nav2-bringup 这个包会把大部分核心组件都拉下来,包括 nav2_planner、nav2_controller、nav2_bt_navigator 等等。你不需要一个个手动装。

小技巧: 装完后用 ros2 pkg list | grep nav2 检查一下,看看哪些包已经就位了。我习惯先跑一遍这个命令,心里有个底。

方式二:从源码编译(推荐进阶用户)

为什么要从源码编译?说白了,就两个原因:一是你想改源码,二是你需要最新的功能分支。我在做某个工业项目时,二进制包里的A*算法版本太老,不支持自定义代价函数,最后只能走源码编译这条路。

步骤其实不复杂,但每一步都有坑。我按顺序来:

1. 创建工作空间

mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
git clone https://github.com/ros-planning/navigation2.git --branch humble

分支一定要选对。我见过有人直接clone了main分支,结果编译时一堆API不兼容。ROS2的版本和Nav2的分支是绑定的,Humble对应humble分支,Iron对应iron分支。

2. 安装系统依赖

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

这一步会自动帮你装好所有系统级的依赖包。但rosdep有时候会漏掉一些东西,比如libserial-dev、libudev-dev这些。如果后面编译报错说找不到某个头文件,大概率就是这里漏了。

注意: 如果你在Ubuntu 22.04上装Humble,记得先确认rosdep已经初始化了。命令是sudo rosdep init && rosdep update。我刚开始时忘了这步,卡了半小时。

3. 编译

cd ~/nav2_ws
colcon build --symlink-install

--symlink-install这个参数我强烈建议加上。它会让编译后的文件以符号链接的方式安装,这样你修改Python脚本后不需要重新编译,直接就能生效。调试时特别方便。

编译时间取决于你的机器。我第一次编译时用了大概15分钟(i7-12700H)。如果中途报错,别慌,看错误信息的前几行,通常能定位到是哪个包出了问题。

依赖检查清单

不管用哪种方式,有些依赖是绕不开的。我整理了一个表格,你可以对照着检查:

依赖项 用途 常见问题
ROS2(Humble/Iron/Rolling) 基础通信框架 版本不匹配导致API找不到
tf2 坐标变换 缺少tf2_geometry_msgs包
nav_msgs 导航消息定义 二进制包安装时自动包含
costmap_2d 代价地图核心 与voxel_grid版本冲突
pluginlib 插件加载机制 注册插件时路径配置错误
Boost C++基础库 系统自带版本过旧

我的经验: 依赖问题里,最常见的是costmap_2d和voxel_grid的版本冲突。如果你从源码编译,确保这两个包来自同一个ROS2发行版,不要混着用。

常见问题与避坑指南

这部分我直接说干货,都是我在项目里踩过的坑。

  • 编译时提示Could NOT find Python3:安装python3-dev和python3-venv。Ubuntu最小安装经常不带这些。
  • colcon build卡在某个包不动:大概率是内存不够。试试colcon build --parallel-workers 2,降低并行度。
  • 运行时提示pluginlib: class_loader.ClassLoader错误:插件注册文件没找到。检查nav2_core的plugin_description.xml路径是否正确。
  • 二进制包安装后ros2 run nav2_bringup找不到命令:没source环境。运行source /opt/ros/humble/setup.bash,或者加到.bashrc里。

曾经有个坑: 我在一台只有4GB内存的工控机上编译Nav2,结果colcon build直接OOM了。后来我加了swap分区,又把--parallel-workers降到1,才勉强编译通过。如果你也是低配机器,建议直接用二进制包。

两种安装方式对比

为了让你看得更清楚,我画了一张对比图:

安装方式对比 二进制包安装 apt install 一行搞定 源码编译安装 git clone + colcon build 优点 • 安装快,5分钟搞定 • 依赖自动解决 • 适合新手和快速验证 缺点 • 版本固定,无法定制 • 无法调试源码 优点 • 可定制算法参数 • 可修改源码 • 获取最新功能 缺点 • 编译耗时15-30分钟 • 依赖问题较多

看到这张图你应该明白了:二进制包适合「拿来就用」,源码编译适合「我要改东西」。没有的好坏,看你的场景。

验证安装是否成功

装完之后,跑一个最简单的测试:

ros2 launch nav2_bringup nav2_bringup_launch.py use_sim_time:=True

如果能看到终端输出一堆日志,没有报错,那就说明安装成功了。我第一次看到那个日志滚动时,心里还是挺踏实的——至少环境没白配。

最后一个小建议: 不管用哪种方式,装完后都做一次ros2 pkg list | grep nav2,看看包的数量。二进制包大概有30多个,源码编译会更多一些。如果少于20个,说明有依赖没装全。