第二章 环境搭建:Ubuntu + ROS Noetic 安装与Navigation Stack源码编译

说实话,做机器人导航这么多年,我见过太多人在环境搭建这一步就卡住了。有的装完ROS发现依赖冲突,有的编译Navigation Stack报错到怀疑人生。其实说白了,环境搭建就像盖房子的地基——地基没打好,后面调参调得再好也白搭。

这一章,我就带你一步步把整个开发环境搭起来。我会把我在项目中踩过的坑、总结的经验都告诉你。嗯,咱们开始吧。

2.1 操作系统选择与Ubuntu 20.04安装

ROS Noetic的官方支持系统是Ubuntu 20.04(Focal Fossa)。别问我为什么不用22.04——Noetic就是为20.04量身定做的,用其他版本你会遇到各种奇奇怪怪的依赖问题。

⚠ 重要提醒: 千万别在虚拟机上跑机器人导航的实时任务。我曾经有个学生用VMware跑导航,结果里程计数据延迟了200ms,机器人直接撞墙了。建议双系统或直接装实体机。

安装Ubuntu 20.04时,我个人的习惯是:

  • 磁盘分区: 至少给Ubuntu留80GB空间,ROS + Navigation Stack + 数据集很容易就吃掉30GB
  • 交换分区: 如果你的内存小于16GB,建议设置8GB交换分区。编译大型包时内存不够会直接OOM
  • 网络配置: 安装时就连上网络,让系统自动更新到最新补丁

2.2 ROS Noetic完整安装

ROS的安装其实不复杂,但有几个细节不注意就会翻车。我整理了一个标准流程,你照着做就行。

2.2.1 添加软件源与密钥

# 设置sources.list
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

# 添加密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

# 更新
sudo apt update
💡 小技巧: 如果你在国内,建议用中科大或清华的镜像源。把上面的packages.ros.org换成mirrors.ustc.edu.cn/ros/ubuntu,下载速度能快10倍。

2.2.2 安装ROS Noetic桌面完整版

sudo apt install ros-noetic-desktop-full

这个命令会安装ROS核心、rqt、rviz、仿真工具等所有常用组件。大概需要下载1.5GB左右,喝杯咖啡的功夫就装好了。

2.2.3 初始化rosdep

sudo rosdep init
rosdep update

rosdep是用来解决依赖的利器。但注意——rosdep update经常因为网络问题失败。我曾经在客户现场折腾了半小时,最后发现是公司网络屏蔽了raw.githubusercontent.com。解决办法是挂代理,或者手动下载依赖列表。

2.2.4 设置环境变量

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

这一步很多人会忘。不执行的话,每次打开终端都要手动source,烦得很。

2.3 Navigation Stack源码编译

为什么不用apt直接装?因为apt版本太老了,而且你没法修改源码。做导航调参,不改源码几乎不可能。所以我建议你从源码编译。

2.3.1 创建工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make

第一次编译会生成build和devel目录。如果报错,99%是因为缺少依赖。

2.3.2 克隆Navigation Stack源码

cd ~/catkin_ws/src
git clone https://github.com/ros-planning/navigation.git
cd navigation
git checkout noetic-devel

注意分支!一定要切到noetic-devel。我见过有人直接clone master分支,结果编译出一堆C++17的语法错误。

2.3.3 安装依赖库

Navigation Stack依赖三个核心库:Eigen3、PCL、OpenCV。下面我分别说。

依赖库 版本要求 安装方式 用途
Eigen3 ≥ 3.3 sudo apt install libeigen3-dev 矩阵运算、位姿变换
PCL ≥ 1.10 sudo apt install libpcl-dev 点云处理、障碍物检测
OpenCV ≥ 4.2 sudo apt install libopencv-dev 图像处理、特征提取
🔑 关键点: Eigen3是纯头文件库,不需要编译。但PCL和OpenCV的版本一定要和ROS Noetic匹配。我试过用OpenCV 4.5.4,结果编译时一堆ABI不兼容的报错。

2.3.4 编译Navigation Stack

cd ~/catkin_ws
catkin_make -j4

-j4表示用4个线程并行编译。如果你的CPU是8核以上,可以试试-j8。但注意——内存不够的话并行编译会直接崩。我16GB内存的笔记本用-j8编译,swap直接飙到10GB。

如果编译报错,先检查这几个常见问题:

  • 缺少XXX.h头文件: 用rosdep install --from-paths src --ignore-src -r -y自动安装缺失依赖
  • C++版本不匹配: 在CMakeLists.txt里加set(CMAKE_CXX_STANDARD 14)
  • PCL/OpenCV版本冲突: 用pkg-config --modversion pcl_common和pkg-config --modversion opencv4检查版本

2.4 工作空间配置与验证

编译成功后,别忘了配置工作空间的环境变量:

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

然后验证一下:

roscd nav_core
echo $ROS_PACKAGE_PATH

如果能看到你的工作空间路径,说明配置成功。

💡 我的习惯: 我会在~/.bashrc里加一行export ROS_WORKSPACE=~/catkin_ws,这样在终端里随时可以用$ROS_WORKSPACE快速定位工作空间。

2.5 环境搭建知识体系

下面这张图总结了整个环境搭建的流程和依赖关系,你保存下来,以后搭建环境时对照着看。

环境搭建知识体系 Ubuntu 20.04 ROS Noetic 完整安装 catkin_ws 工作空间 依赖库安装 Eigen3 PCL OpenCV Navigation Stack move_base amcl costmap_2d 环境验证与测试 💡 建议按顺序搭建

2.6 常见问题与避坑指南

环境搭建这块,我踩过的坑比走过的路还多。下面这几个问题你大概率会遇到:

⚠ 问题1:rosdep update失败
我曾经在客户现场折腾了半小时,最后发现是公司网络屏蔽了raw.githubusercontent.com。解决办法:
export ROS_DISTRO=noetic
rosdep update --include-eol-distros
或者直接挂代理。
⚠ 问题2:编译Navigation Stack时报错"undefined reference"
这通常是PCL或OpenCV版本不匹配导致的。检查一下:
pkg-config --modversion pcl_common
pkg-config --modversion opencv4
如果版本不对,用apt重新安装。
⚠ 问题3:catkin_make时内存不足
减少并行编译线程数:
catkin_make -j2
或者增加swap空间:
sudo fallocate -l 8G /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

好了,环境搭建就到这里。你按照这个流程走下来,应该不会出大问题。如果还有报错,别慌——99%的问题都是依赖没装全,用rosdep install扫一遍基本都能解决。