3、Nav2源码编译:从GitHub拉取Nav2源码,使用colcon编译,解决常见编译错误
好,咱们进入正题。上一章我们把ROS2环境搭好了,现在该请出Nav2本尊了。
源码编译,说白了就是让Nav2的代码在你的机器上跑起来。我见过太多人卡在这一步,一编译就报错,然后就放弃了。其实没那么可怕,今天我就带你走一遍。
3.1 准备工作:确认你的ROS2版本
动手之前,先确认一件事:你的ROS2版本。不同版本的Nav2,依赖和代码结构有差异。我个人习惯用Humble,稳定,坑少。
| ROS2 版本 | Nav2 分支 | Ubuntu 版本 |
|---|---|---|
| Humble | humble | 22.04 |
| Iron | iron | 22.04 / 24.04 |
| Rolling | main | 24.04 |
怎么查版本?终端里敲:
ros2 --version
如果输出是 ros2 humble,那就对了。如果是别的版本,记得把后面命令里的分支名改一下。
3.2 从GitHub拉取Nav2源码
我建议你建一个专门的目录来放工作空间。别乱放,不然以后找都找不到。
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws/src
然后拉取代码。这里有个小技巧:用 --branch 指定分支,避免拉到最新的开发版,那个可能不稳定。
git clone https://github.com/ros-planning/navigation2.git --branch humble
嗯,这里要注意。GitHub有时候会抽风,下载慢或者失败。我曾经在客户现场,网络差到连git clone都跑不完。后来我改用代理或者直接下载zip包再解压,省心不少。
git clone --depth 1,只拉取最新版本,不下载历史记录,速度快很多。
3.3 安装依赖:别跳过这一步
很多人编译报错,十有八九是依赖没装全。Nav2依赖一大堆包,一个一个手动装?不现实。ROS2提供了自动安装工具。
cd ~/nav2_ws
rosdep install -y --from-paths src --ignore-src --rosdistro humble
这个命令会自动检测 src 目录下所有包的依赖,然后从系统源里安装。如果提示 rosdep 没初始化,先跑:
sudo rosdep init
rosdep update
为什么会这样?因为 rosdep 需要先知道去哪里找依赖信息。我第一次用的时候也忘了这步,结果卡了半天。
3.4 使用colcon编译
依赖装好了,开始编译。我个人习惯用 colcon build,简单直接。
cd ~/nav2_ws
colcon build --symlink-install
--symlink-install 这个参数很实用。它会让编译后的文件以软链接形式存在,这样你修改Python脚本后不用重新编译,直接生效。调试的时候特别方便。
第一次编译会比较慢,大概10到20分钟,取决于你的机器性能。去泡杯咖啡,回来差不多就好了。
echo "source ~/nav2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc
这样每次打开终端,Nav2的环境就自动加载了。
3.5 常见编译错误及解决方法
编译过程中,你可能会遇到一些报错。别慌,我帮你整理了几个最常见的,以及怎么解决。
错误1:找不到某个依赖包
报错信息类似:Could not find a package configuration file provided by "xxx"
原因很简单:某个依赖没装。用 rosdep install 再跑一遍,或者手动安装:
sudo apt install ros-humble-xxx
把 xxx 换成报错里提示的包名就行。
错误2:编译过程中内存不足
这个我遇到过。Nav2代码量不小,编译时内存占用高。如果你的机器内存只有4GB或8GB,可能会卡死。
解决办法:限制并行编译的任务数。
colcon build --symlink-install --parallel-workers 2
把 2 改成你的CPU核心数的一半,或者更少。虽然慢一点,但至少不会崩。
错误3:Python模块导入失败
有时候编译成功,但运行时报错说找不到某个Python模块。这通常是因为 PYTHONPATH 没设置对。
检查一下:
echo $PYTHONPATH
确保它包含了 /home/你的用户名/nav2_ws/install/lib/python3.10/site-packages。如果没有,重新source一下环境变量。
sudo colcon build!这会导致文件权限混乱,后续source会失败。如果已经用了,把整个工作空间删了重新来。
3.6 验证编译是否成功
编译完成后,怎么知道Nav2能不能用?跑一个简单的测试。
ros2 run nav2_util lifecycle_bringup
如果终端没有报错,说明Nav2的核心库已经正常工作了。你也可以试试:
ros2 pkg list | grep nav2
你会看到一长串以 nav2_ 开头的包名,比如 nav2_amcl、nav2_bt_navigator 等等。看到这些,就说明编译成功了。
3.7 知识体系一览
为了让你对整个流程有个直观的认识,我画了一张图。它展示了从拉取代码到编译成功的完整链路。
这张图把整个流程串起来了。你跟着走,基本不会出大问题。
3.8 我的个人经验
最后分享一点我的体会。Nav2源码编译,说白了就是一次环境对齐的过程。你的系统版本、ROS2版本、依赖版本,三者必须匹配。任何一个对不上,就会报错。
我曾经在Ubuntu 20.04上强行编译Nav2的humble分支,结果各种依赖冲突,折腾了两天。后来老老实实换了22.04,半小时搞定。所以,别跟环境较劲,该换系统就换。
还有,编译过程中如果报错,别急着百度。先看错误信息的前几行,它通常会告诉你缺了什么。缺什么就装什么,这是最直接的解法。
好了,这一章就到这里。源码编译搞定后,下一章我们就可以开始配置Nav2的参数了。到时候见。