ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_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 updateROS2提供了不同规模的软件包集合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配置文件如果你不确定通常是~/.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc # 然后让当前终端立即生效 source ~/.bashrc实操心得我强烈建议新手先使用方法一手动source几天。这能帮助你理解环境变量的作用。当你确定这是你系统上唯一的ROS2版本并且觉得手动操作太繁琐时再用方法二。如果你未来需要安装另一个版本的ROS2比如测试Rolling方法二可能会造成冲突需要你回头修改.bashrc文件。3.4 安装额外的编译工具colconROS2使用一个新的构建工具colcon来编译你的工作空间中的代码。它类似于ROS1的catkin_make但更强大。虽然有些桌面版可能包含了它但为了确保无误我们单独安装sudo apt install -y python3-colcon-common-extensions3.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.gpg4.3 清理APT缓存并自动移除无用依赖卸载软件包后系统里可能会留下一些不再被需要的依赖库称为“孤儿包”。我们可以清理它们并更新本地包索引。# 4. 更新软件包列表并自动移除不再需要的依赖包 sudo apt update sudo apt autoremove -y # 5. 清理已下载的软件包缓存可选用于释放磁盘空间 sudo apt clean4.4 手动检查与清理残留文件和目录尽管apt purge很强大但有些由用户或构建过程产生的文件可能还残留在系统里。我们需要手动检查几个关键位置工作空间Workspace这是你自己创建代码和编译的地方apt不会碰它。通常在你的家目录下比如~/ros2_ws或~/dev_ws。如果你不需要了直接删除整个文件夹即可。rm -rf ~/ros2_ws环境变量配置如果你之前把source /opt/ros/humble/setup.bash添加到了~/.bashrc或~/.zshrc等文件中现在需要编辑该文件找到并删除这一行。使用文本编辑器如nanonano ~/.bashrc找到类似source /opt/ros/humble/setup.bash的行删除它然后保存退出。最后执行source ~/.bashrc使更改生效。用户本地安装的Python包如果你通过pip安装过一些ROS2相关的Python工具比如某些消息生成器插件它们可能还留在~/.local/lib/python3.x/site-packages/目录下。通常影响不大但如果遇到问题可以尝试用pip uninstall命令移除。检查/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_ID10 # 永久设置加入.bashrc echo export ROS_DOMAIN_ID10 ~/.bashrc source ~/.bashrc实测场景在一次多机器人协同的实验室项目中我们没有设置ROS_DOMAIN_ID结果一台机器人的导航目标点被另一台机器的调试程序意外发布导致机器人乱跑。设置之后各个子系统的通信立刻被隔离问题迎刃而解。5.2 解决“找不到命令”与环境变量问题如果你在终端中输入ros2命令系统提示“Command ‘ros2’ not found”99%的原因是环境变量没有正确设置。排查步骤确认source操作首先明确你是否已经执行了source /opt/ros/humble/setup.bash。可以通过echo $ROS_DISTRO命令来检查如果输出了humble则说明环境变量已加载。检查安装路径确认ROS2是否真的安装在了/opt/ros/humble。使用ls /opt/ros/查看。检查Shell配置文件如果你修改了~/.bashrc确保没有语法错误。可以用bash -x来调试或者简单地在新终端中echo $ROS_DISTRO看是否有输出。使用绝对路径作为临时测试你可以直接使用完整路径运行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 install5.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才是更长的路。官方文档永远是第一选择。ROS2的官方文档docs.ros.org质量很高从教程、概念到API参考一应俱全。尤其是“Tutorials”部分跟着走一遍能打下坚实基础。高质量书籍《ROS2机器人开发从入门到实践》这类书籍提供了结构化的学习路径和项目实例适合初学者系统学习。项目实例与代码GitHub上搜索ros2 example、ros2 project能找到大量开源代码。从模仿开始是最好的学习方式。前面提到的ros2/examples仓库就是很好的起点。社区与问答ROS Answers官方问答论坛。提问前先搜索很多问题已经有人问过。GitHub Issues如果你认为发现了ROS2某个功能包的bug可以在对应的仓库提Issue。Discord / Slack频道一些活跃的ROS社区有实时聊天频道能获得更快的帮助。6.3 从ROS1迁移的注意事项如果你有ROS1的经验需要注意ROS2在架构和概念上的重大变化构建系统从catkincatkin_make变为amentcolcon。启动系统从roslaunch变为ros2 launch语法是Python文件而非XML。参数管理动态参数变得更强大和规范。通信可靠性默认基于DDS提供了更丰富的QoS服务质量策略可以精细控制通信行为。不要试图用ROS1的思维完全套用ROS2最好将其视为一个需要重新学习的新系统虽然很多高层概念是相通的。整个安装和配置过程最需要的就是耐心和仔细。尤其是环境变量和依赖管理一步错可能导致后续步步错。我的建议是严格按照步骤操作理解每一条命令的目的并善用echo、which、ls等命令来验证中间状态。当你成功运行起第一个自己编写的节点时你会发现之前所有的折腾都是值得的。ROS2是一个强大的工具而一个干净、稳定的基础环境是高效使用它的前提。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进