ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ROS2在Ubuntu上的完整安装与卸载指南:从版本匹配到环境配置

2026/8/17 9:51:55 拓冰建站 浏览量
ROS2在Ubuntu上的完整安装与卸载指南:从版本匹配到环境配置

1. 项目概述:为什么ROS2的安装与卸载值得单独成文?

如果你正在接触机器人开发,或者打算从ROS1迁移到ROS2,那么“在Ubuntu上安装ROS2”这个看似简单的任务,很可能就是你遇到的第一个拦路虎。我见过太多新手,包括我自己早期,在安装这一步就耗费了大半天,最后因为一个依赖项没装对或者环境变量没配好,导致后续所有教程都跑不起来,信心备受打击。更麻烦的是,当你需要切换ROS2版本,或者系统出了问题需要重装时,一个不彻底的卸载过程会留下各种“幽灵文件”,导致新版本安装失败,问题排查起来让人抓狂。

所以,这篇内容的目的很明确:它不仅仅是一份按部就班的操作指南。我会结合自己多次在不同机器、不同Ubuntu版本上部署ROS2的经验,把安装过程中的每一个关键选择、可能遇到的坑,以及如何干净、彻底地卸载ROS2,都掰开揉碎了讲清楚。你会发现,安装不只是敲几条命令,卸载也不仅仅是apt remove。从系统版本匹配、源配置的玄学,到环境变量设置的几种流派,再到卸载后那些隐藏的残留文件如何手动清理,我都会一一覆盖。

无论你是刚入门机器人操作系统的小白,还是需要为团队搭建统一开发环境的老手,这篇文章都能帮你节省大量试错时间,让你获得一个纯净、可控的ROS2工作环境。我们接下来要聊的,就是如何把这件事做得既专业又省心。

2. 核心准备:理清Ubuntu与ROS2的版本对应关系

在动手之前,最重要的一步往往被忽略:确认你的Ubuntu版本和你要安装的ROS2发行版是否匹配。ROS2不像普通软件,它对操作系统内核、库文件的版本有严格的要求,官方会为每个ROS2发行版指定一个或多个支持的Ubuntu版本。装错了版本,后续编译、运行百分之百会出问题。

2.1 官方支持矩阵与长期支持版的选择

截至我撰写本文时,ROS2的主流活跃发行版主要有以下几个,它们与Ubuntu的对应关系是:

  • ROS2 Humble Hawksbill官方推荐用于Ubuntu 22.04 (Jammy Jellyfish)。这是目前的长期支持版本,支持到2027年5月。对于新项目和新用户,我强烈建议直接选择这个组合。Ubuntu 22.04 LTS本身也是长期支持版,系统稳定,社区资源丰富。
  • ROS2 Rolling Ridley:这是一个滚动更新版本,始终跟踪最新的软件包。它理论上支持多个Ubuntu版本,但更适合资深用户或需要最新特性的开发者,因为它的稳定性不如固定发行版。新手不建议从Rolling开始。
  • ROS2 Galactic Geochelone:已结束标准支持,仅维护到2022年11月,对应Ubuntu 20.04 (Focal Fossa)。除非你有遗留项目必须使用,否则不应选择。
  • ROS2 Foxy Fitzroy:已结束标准支持,对应Ubuntu 20.04。

所以,第一步,打开你的终端,输入lsb_release -a,记下你的Ubuntu版本号(例如,22.04)。如果你的系统不是22.04,我建议你考虑升级或重装系统到Ubuntu 22.04,以获得最好的兼容性和支持周期。为了最稳定的体验,坚持使用“Ubuntu LTS” + “ROS2 LTS”这个黄金组合。

2.2 系统更新与基础依赖安装

在添加ROS2仓库之前,我们需要确保系统本身的软件源是最新的,并且安装一些ROS2依赖的通用工具。这能避免很多因基础库缺失导致的奇怪错误。

打开终端,依次执行以下命令:

# 1. 更新软件包索引,并升级所有可升级的软件包 sudo apt update && sudo apt upgrade -y

这个操作会花费一些时间,它确保你的系统底层库和工具处于一个较新的状态。接下来,安装一些不可或缺的工具:

# 2. 安装curl、git、python3等基础工具,以及locale相关包 sudo apt install -y curl git python3-pip python3-venv # 3. 设置区域设置,避免后续ROS2构建或运行时出现语言警告 sudo apt install -y 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

注意:关于locale的设置,如果你主要使用中文环境,也可以将en_US替换为zh_CN.UTF-8。但根据我的经验,在开发环境中使用英文locale可以避免一些软件在终端输出乱码的问题,尤其是处理日志和错误信息时更清晰。你可以根据个人习惯选择。

3. 安装ROS2:从添加源到验证测试的完整流程

准备好了系统,我们就可以开始正式的安装过程了。ROS2官方提供了多种安装方式,包括二进制包安装、源码编译安装等。对于绝大多数用户,尤其是初学者和用于应用开发的场景,通过APT二进制包安装是最推荐、最稳定、最省事的方式。源码编译通常只在需要修改ROS2底层代码或为特定平台(如ARM架构)移植时才需要。

3.1 添加ROS2软件源与GPG密钥

Ubuntu系统使用apt管理软件包,它需要知道从哪里获取ROS2的软件包。我们需要将ROS2官方的软件仓库地址添加到系统的源列表中。

首先,确保已安装curl,然后下载并添加ROS2的GPG密钥,这个密钥用于验证下载的软件包是否来自可信的官方源,防止被篡改。

# 1. 添加ROS2的GPG密钥 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg

接下来,将ROS2仓库源添加到系统。这里需要根据你的Ubuntu版本选择对应的命令。以Ubuntu 22.04 (Jammy) 安装ROS2 Humble为例:

# 2. 将ROS2仓库源添加到系统(针对Ubuntu 22.04 Jammy) echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

关键点解析

  • $(dpkg --print-architecture):自动获取你系统的架构(通常是amd64或arm64)。
  • signed-by=:指定我们刚刚添加的GPG密钥路径。
  • $(lsb_release -cs):自动获取你的Ubuntu版本代号(例如,Jammy)。
  • sudo tee ... > /dev/null:将echo的内容写入受保护的/etc/apt/sources.list.d/ros2.list文件,/dev/null用于屏蔽多余的输出。

3.2 安装ROS2基础桌面版

添加源之后,再次更新软件包列表,让系统识别到新的ROS2仓库。

# 3. 更新软件包列表(此时会读取新添加的ros2.list) sudo apt update

ROS2提供了不同规模的软件包集合:

  • ros-humble-ros-base:仅包含通信库、消息包等核心组件,没有图形化工具。
  • ros-humble-desktop:推荐选择。包含核心组件、常用的GUI工具(如RQt)、教程和基础功能包。
  • ros-humble-desktop-full:包含桌面版的所有内容,外加仿真器(如Gazebo)、导航、感知等大量功能包。体积庞大,初次安装不建议。

对于学习和大多数开发场景,安装desktop版本是最佳平衡点。

# 4. 安装ROS2 Humble桌面版 sudo apt install -y ros-humble-desktop

这个安装过程会持续一段时间,因为它要下载几百MB甚至上GB的软件包及其依赖。耐心等待即可。

3.3 配置Shell环境变量

安装完成后,ROS2的命令(如ros2)还不能直接在终端中使用。因为相关的可执行文件和库路径还没有被添加到你的Shell环境变量里。ROS2提供了一个脚本来帮你设置。

重要选择:环境变量的设置有两种主流方式,各有优劣。

方法一:每次打开新终端时手动source(推荐给新手和多版本共存用户)这种方法最安全,不会影响系统其他部分。你需要在每次打开新的终端窗口并想使用ROS2时,运行以下命令:

# 在每一个需要使用ROS2的终端中执行 source /opt/ros/humble/setup.bash

然后你才能运行ros2 --help等命令。它的缺点是麻烦。为了省事,大多数人会把这条命令加到Shell的配置文件中,这就是方法二。

方法二:将source命令添加到Shell配置文件中(推荐给单一ROS2版本用户)这样每次打开终端,环境变量都会自动设置好。编辑你的Shell配置文件(如果你不确定,通常是~/.bashrc):

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc # 然后让当前终端立即生效 source ~/.bashrc

实操心得:我强烈建议新手先使用方法一手动source几天。这能帮助你理解环境变量的作用。当你确定这是你系统上唯一的ROS2版本,并且觉得手动操作太繁琐时,再用方法二。如果你未来需要安装另一个版本的ROS2(比如测试Rolling),方法二可能会造成冲突,需要你回头修改.bashrc文件。

3.4 安装额外的编译工具colcon

ROS2使用一个新的构建工具colcon来编译你的工作空间中的代码。它类似于ROS1的catkin_make,但更强大。虽然有些桌面版可能包含了它,但为了确保无误,我们单独安装:

sudo apt install -y python3-colcon-common-extensions

3.5 验证安装:运行小海龟演示

现在,让我们用一个经典的例子来验证ROS2是否安装成功。我们将启动一个节点来发布乌龟的移动指令,另一个节点来可视化乌龟。

第一步:打开第一个终端,启动ROS2核心ROS2的所有节点都需要一个核心程序来协调通信。

# 终端1 source /opt/ros/humble/setup.bash # 如果没加入.bashrc则需要执行 ros2 run turtlesim turtlesim_node

你会看到一个蓝色背景的窗口,中间出现一只小乌龟。

第二步:打开第二个终端,启动控制节点

# 终端2 source /opt/ros/humble/setup.bash # 如果没加入.bashrc则需要执行 ros2 run turtlesim turtle_teleop_key

这个终端会提示你用方向键控制乌龟。按几下方向键,看看第一个窗口里的乌龟是否移动。

如果乌龟能正常移动,那么恭喜你,ROS2的核心通信机制工作正常,安装成功!

4. 卸载ROS2:如何做到彻底不留痕

当你需要升级系统、更换ROS2版本,或者只是想清理空间时,一个干净的卸载至关重要。不彻底的卸载会导致残留文件干扰新版本的安装,产生各种难以排查的依赖错误。

4.1 使用APT移除ROS2软件包

首先,我们用apt卸载所有通过它安装的ROS2相关包。apt remove会移除软件包但保留配置文件,apt purge则会连配置文件一起删除。为了干净,我们使用purge

# 1. 卸载ROS2桌面版包(请根据你安装的版本替换‘humble’) sudo apt purge -y ros-humble-*

这条命令中的ros-humble-*会匹配所有以ros-humble-开头的包,将它们全部清除。这步操作会移除绝大部分ROS2文件。

4.2 移除ROS2软件源

既然ROS2已经卸载,我们也可以把它的软件源列表删掉,保持系统源的整洁。

# 2. 删除ROS2的软件源列表文件 sudo rm /etc/apt/sources.list.d/ros2.list # 3. (可选)移除GPG密钥 sudo rm /usr/share/keyrings/ros-archive-keyring.gpg

4.3 清理APT缓存并自动移除无用依赖

卸载软件包后,系统里可能会留下一些不再被需要的依赖库(称为“孤儿包”)。我们可以清理它们并更新本地包索引。

# 4. 更新软件包列表,并自动移除不再需要的依赖包 sudo apt update sudo apt autoremove -y # 5. 清理已下载的软件包缓存(可选,用于释放磁盘空间) sudo apt clean

4.4 手动检查与清理残留文件和目录

尽管apt purge很强大,但有些由用户或构建过程产生的文件可能还残留在系统里。我们需要手动检查几个关键位置:

  1. 工作空间(Workspace):这是你自己创建代码和编译的地方,apt不会碰它。通常在你的家目录下,比如~/ros2_ws~/dev_ws。如果你不需要了,直接删除整个文件夹即可。

    rm -rf ~/ros2_ws
  2. 环境变量配置:如果你之前把source /opt/ros/humble/setup.bash添加到了~/.bashrc(或~/.zshrc等)文件中,现在需要编辑该文件,找到并删除这一行。使用文本编辑器(如nano):

    nano ~/.bashrc

    找到类似source /opt/ros/humble/setup.bash的行,删除它,然后保存退出。最后执行source ~/.bashrc使更改生效。

  3. 用户本地安装的Python包:如果你通过pip安装过一些ROS2相关的Python工具(比如某些消息生成器插件),它们可能还留在~/.local/lib/python3.x/site-packages/目录下。通常影响不大,但如果遇到问题,可以尝试用pip uninstall命令移除。

  4. 检查/opt/ros目录:执行sudo ls /opt/ros,如果卸载干净,这个目录应该是空的或者不存在。如果里面还有humble文件夹的残余,可以手动删除:

    sudo rm -rf /opt/ros/humble

完成以上所有步骤后,你的系统就应该基本恢复到安装ROS2之前的状态了。此时,你可以尝试重新开始安装流程,或者进行其他操作。

5. 安装后的进阶配置与常见问题排错

成功安装并运行小海龟只是第一步。要让ROS2在开发中真正顺手,还需要进行一些进阶配置,并了解如何应对常见问题。

5.1 配置ROS_DOMAIN_ID(多机/多环境通信关键)

这是一个非常重要但常被忽略的设置。ROS2使用DDS作为底层通信中间件,默认情况下,同一网络中的所有ROS2节点都能相互发现和通信。这在你有多台机器人,或者在同一个局域网内有多个开发者在测试时,会造成严重的干扰——你的乌龟可能被别人的控制节点遥控了!

为了解决这个问题,ROS2引入了ROS_DOMAIN_ID环境变量。只有ROS_DOMAIN_ID相同的节点才能相互通信。ID范围是0到232。

设置方法: 你可以为每个独立的工作组设置一个唯一的ID(比如团队A用0,团队B用1,你自己的不同项目用10, 11等)。

# 临时设置(仅当前终端有效) export ROS_DOMAIN_ID=10 # 永久设置,加入.bashrc echo "export ROS_DOMAIN_ID=10" >> ~/.bashrc source ~/.bashrc

实测场景:在一次多机器人协同的实验室项目中,我们没有设置ROS_DOMAIN_ID,结果一台机器人的导航目标点被另一台机器的调试程序意外发布,导致机器人乱跑。设置之后,各个子系统的通信立刻被隔离,问题迎刃而解。

5.2 解决“找不到命令”与环境变量问题

如果你在终端中输入ros2命令,系统提示“Command ‘ros2’ not found”,99%的原因是环境变量没有正确设置。

排查步骤

  1. 确认source操作:首先,明确你是否已经执行了source /opt/ros/humble/setup.bash。可以通过echo $ROS_DISTRO命令来检查,如果输出了humble,则说明环境变量已加载。
  2. 检查安装路径:确认ROS2是否真的安装在了/opt/ros/humble。使用ls /opt/ros/查看。
  3. 检查Shell配置文件:如果你修改了~/.bashrc,确保没有语法错误。可以用bash -x来调试,或者简单地在新终端中echo $ROS_DISTRO看是否有输出。
  4. 使用绝对路径:作为临时测试,你可以直接使用完整路径运行ROS2命令:/opt/ros/humble/bin/ros2 --help。如果能运行,那问题就锁定在环境变量上。

5.3 处理软件包依赖冲突与密钥错误

sudo apt update时,你可能会遇到以下错误:

  • GPG密钥错误:提示“The following signatures couldn‘t be verified”。这通常是因为密钥没添加好或过期了。重新执行添加GPG密钥和源的步骤,确保网络通畅。
  • 404 Not Found:提示某些包找不到。这几乎总是因为你的Ubuntu版本代号与ROS2源中的不匹配。再次用lsb_release -cs确认你的系统代号,并检查/etc/apt/sources.list.d/ros2.list文件中的代号是否正确。
  • 依赖关系破损:在安装或卸载其他软件后,可能导致ROS2的依赖被破坏。可以尝试修复:
    sudo apt --fix-broken install

5.4 创建并编译你的第一个ROS2工作空间

验证完系统安装后,你应该创建一个属于自己的工作空间来存放和编译代码。

# 1. 创建并进入工作空间目录 mkdir -p ~/ros2_ws/src cd ~/ros2_ws # 2. 拉取一些示例代码(可选,用于测试编译环境) git clone https://github.com/ros2/examples src/examples -b humble # 3. 解决示例代码的依赖(如果拉取了的话) sudo apt install -y ros-humble-rclcpp ros-humble-rclpy ros-humble-std-msgs # 4. 在工作空间根目录编译 colcon build # 5. 编译完成后,source工作空间的安装目录 source install/setup.bash

编译成功后,你可以尝试运行一个C++的发布订阅例子:

# 终端1:运行发布者 ros2 run examples_rclcpp_minimal_publisher publisher_member_function # 终端2:运行订阅者 ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function

你应该能在订阅者终端看到不断打印的消息。这证明你的开发环境从系统ROS2到自定义工作空间的整个链路都打通了。

6. 不同场景下的安装策略与资源推荐

根据你的具体需求,安装策略可以有所调整。此外,知道去哪里找资源和帮助,是持续学习的关键。

6.1 轻量级安装与Docker方案

  • 仅安装ROS-Base:如果你的应用场景是部署到资源受限的嵌入式设备(如树莓派、Jetson Nano),或者服务器上运行无界面的机器人算法,可以只安装ros-humble-ros-base,它能节省大量磁盘空间和内存。
  • 使用Docker容器:这是实现环境隔离和复现的终极方案。你可以拉取ROS2官方的Docker镜像(如osrf/ros:humble-desktop),在容器内进行开发。这能完美解决“在我机器上好好的,怎么到你那就不行了”的问题,也方便进行持续集成。对于团队协作和复杂项目,我强烈推荐研究Docker方案。

6.2 学习资源与社区支持

安装只是起点,如何学习ROS2才是更长的路。

  1. 官方文档:永远是第一选择。ROS2的官方文档(docs.ros.org)质量很高,从教程、概念到API参考一应俱全。尤其是“Tutorials”部分,跟着走一遍能打下坚实基础。
  2. 高质量书籍:《ROS2机器人开发从入门到实践》这类书籍提供了结构化的学习路径和项目实例,适合初学者系统学习。
  3. 项目实例与代码:GitHub上搜索ros2 exampleros2 project能找到大量开源代码。从模仿开始是最好的学习方式。前面提到的ros2/examples仓库就是很好的起点。
  4. 社区与问答
    • ROS Answers:官方问答论坛。提问前先搜索,很多问题已经有人问过。
    • GitHub Issues:如果你认为发现了ROS2某个功能包的bug,可以在对应的仓库提Issue。
    • Discord / Slack频道:一些活跃的ROS社区有实时聊天频道,能获得更快的帮助。

6.3 从ROS1迁移的注意事项

如果你有ROS1的经验,需要注意ROS2在架构和概念上的重大变化:

  • 构建系统:从catkin+catkin_make变为ament+colcon
  • 启动系统:从roslaunch变为ros2 launch,语法是Python文件而非XML。
  • 参数管理:动态参数变得更强大和规范。
  • 通信可靠性:默认基于DDS,提供了更丰富的QoS(服务质量)策略,可以精细控制通信行为。

不要试图用ROS1的思维完全套用ROS2,最好将其视为一个需要重新学习的新系统,虽然很多高层概念是相通的。

整个安装和配置过程,最需要的就是耐心和仔细。尤其是环境变量和依赖管理,一步错可能导致后续步步错。我的建议是,严格按照步骤操作,理解每一条命令的目的,并善用echowhichls等命令来验证中间状态。当你成功运行起第一个自己编写的节点时,你会发现之前所有的折腾都是值得的。ROS2是一个强大的工具,而一个干净、稳定的基础环境是高效使用它的前提。