Ubuntu 20.04源码编译ROS2 Humble避坑指南:从崩溃边缘到完美运行
当你在Ubuntu 20.04上尝试源码编译ROS2 Humble时,官方文档看起来就像是一份完美的食谱——直到你真正开始动手。作为一名经历过无数次失败才最终成功的开发者,我想分享那些官方文档没告诉你的关键细节和解决方案。
1. 环境准备:那些容易被忽略的细节
在开始之前,大多数人会直接跳到安装步骤,但环境配置中的小细节往往决定了整个过程的成败。
1.1 系统基础配置
首先检查你的Ubuntu 20.04系统是否满足以下基本要求:
- GCC版本:至少需要GCC 7以上,但建议使用GCC 9或10
- Python版本:ROS2 Humble需要Python 3.8+
- 磁盘空间:至少预留15GB空间用于源码和编译
验证GCC版本:
gcc --version如果版本过低,升级方法:
sudo apt install gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 91.2 区域设置(locale)的正确配置
区域设置问题会导致各种奇怪的编译错误,特别是当系统默认不是UTF-8时。以下是完整配置流程:
- 首先检查当前设置:
locale- 如果输出中没有en_US.UTF-8,需要安装并配置:
sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8- 验证设置是否生效:
locale2. 网络问题:跨越那道看不见的墙
在安装过程中,网络问题是最常见的障碍之一,特别是对于国内开发者。
2.1 解决raw.githubusercontent.com访问问题
这个域名经常无法访问,导致rosdep init和rosdep update失败。解决方法是在/etc/hosts中添加:
185.199.108.133 raw.githubusercontent.com 185.199.109.133 raw.githubusercontent.com 185.199.110.133 raw.githubusercontent.com 185.199.111.133 raw.githubusercontent.com注意:IP地址可能会变化,如果上述IP失效,可以通过https://www.ipaddress.com/查询最新的IP。
2.2 使用国内镜像源加速
对于国内用户,可以使用清华或中科大的镜像源加速下载:
# 备份原有源 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak # 替换为清华源 sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list sudo sed -i 's@//.*security.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list对于ROS2的软件源,也可以使用国内镜像:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null3. 依赖安装:避开那些隐藏的陷阱
依赖问题是ROS2安装过程中最令人头疼的部分之一,特别是当某些包无法正常安装时。
3.1 rosdep初始化与更新
rosdep init和rosdep update是常见的失败点。如果遇到问题,可以尝试以下步骤:
- 手动创建rosdep的sources.list.d文件:
sudo mkdir -p /etc/ros/rosdep/sources.list.d/ sudo curl -o /etc/ros/rosdep/sources.list.d/20-default.list https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list- 然后运行更新:
rosdep update如果仍然失败,可以尝试使用--include-eol-distros参数:
rosdep update --include-eol-distros3.2 跳过特定包的安装
有些包如fastcdr和rti-connext-dds-6.0.1可能会造成问题,可以在安装时跳过它们:
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"4. 源码编译:优化你的构建过程
当所有依赖都安装完成后,就可以开始编译ROS2源码了,但这个过程也有不少需要注意的地方。
4.1 选择合适的构建工具
ROS2 Humble推荐使用colcon作为构建工具。在编译前,建议安装一些有用的插件:
sudo apt install python3-colcon-common-extensions python3-colcon-mixin4.2 编译命令与参数
基本的编译命令是:
colcon build --symlink-install但为了优化编译过程,可以添加以下参数:
--parallel-workers:设置并行编译的工作线程数,通常设置为CPU核心数--cmake-args:传递额外的CMake参数--packages-up-to:只编译特定包及其依赖
例如,使用4个线程编译:
colcon build --symlink-install --parallel-workers 44.3 解决常见编译错误
在编译过程中可能会遇到各种错误,以下是一些常见问题的解决方法:
- 内存不足:如果系统内存不足,可以尝试减少并行编译线程数或增加swap空间:
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile- Python模块缺失:有些ROS2包需要额外的Python模块,可以通过pip安装:
python3 -m pip install -U \ flake8-blind-except \ flake8-builtins \ flake8-class-newline \ flake8-comprehensions \ flake8-deprecated \ flake8-import-order \ flake8-quotes \ "pytest>=5.3" \ pytest-repeat \ pytest-rerunfailures5. 环境配置与测试
编译完成后,还需要正确配置环境才能使用ROS2。
5.1 设置环境变量
将以下内容添加到~/.bashrc文件中:
source ~/ros2_humble/install/setup.bash如果你同时安装了多个ROS版本,可以设置一个简单的切换机制:
echo "Which ROS version to use? (1) ROS1 Noetic (2) ROS2 Humble" read choose case $choose in 1) source /opt/ros/noetic/setup.bash;; 2) source ~/ros2_humble/install/setup.bash;; esac5.2 验证安装
运行以下命令验证ROS2是否安装成功:
ros2 doctor这个命令会检查你的ROS2环境并报告任何问题。如果一切正常,你应该能看到类似以下的输出:
All 5 checks passed5.3 运行示例节点
为了进一步验证,可以尝试运行ROS2的示例talker和listener节点:
在一个终端中运行:
ros2 run demo_nodes_cpp talker在另一个终端中运行:
ros2 run demo_nodes_py listener如果能看到talker发送消息而listener接收消息,说明你的ROS2 Humble安装完全成功了。