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 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配置文件(如果你不确定,通常是~/.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-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等)文件中,现在需要编辑该文件,找到并删除这一行。使用文本编辑器(如nano):nano ~/.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_ID=10 # 永久设置,加入.bashrc echo "export ROS_DOMAIN_ID=10" >> ~/.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 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才是更长的路。
- 官方文档:永远是第一选择。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在架构和概念上的重大变化:
- 构建系统:从
catkin+catkin_make变为ament+colcon。 - 启动系统:从
roslaunch变为ros2 launch,语法是Python文件而非XML。 - 参数管理:动态参数变得更强大和规范。
- 通信可靠性:默认基于DDS,提供了更丰富的QoS(服务质量)策略,可以精细控制通信行为。
不要试图用ROS1的思维完全套用ROS2,最好将其视为一个需要重新学习的新系统,虽然很多高层概念是相通的。
整个安装和配置过程,最需要的就是耐心和仔细。尤其是环境变量和依赖管理,一步错可能导致后续步步错。我的建议是,严格按照步骤操作,理解每一条命令的目的,并善用echo、which、ls等命令来验证中间状态。当你成功运行起第一个自己编写的节点时,你会发现之前所有的折腾都是值得的。ROS2是一个强大的工具,而一个干净、稳定的基础环境是高效使用它的前提。