☰
Ubuntu 下 ROS/ROS2 一键安装:版本匹配、环境变量与常见排错
2026/9/30 4:01:34 网站建设 项目流程

拿到一台刚装好的 Ubuntu,第一件事不是急着敲apt install,而是先想清楚这台机器要跑 ROS 还是 ROS2、跑哪个发行版、配哪个 Ubuntu 版本。我刚入行那会儿,光是把 ROS 装起来就折腾了整整两天,报错一堆、依赖冲突、环境变量改错导致终端一开就飘红,那种体验现在回想起来还是有点头皮发麻。后来我摸清了一套思路,用社区里的一键安装脚本配合手动兜底,基本十分钟内能让roscore或者ros2 run demo_nodes_cpp talker跑起来,不管你是刚接触ROS的学生、要快速搭ROS2实验环境的工程师,还是准备搞机械臂和 Gazebo 仿真的人,这套流程都能直接抄。

这篇东西我想把为什么这样装、装之前要检查什么、脚本里到底干了哪些事、出问题怎么排查这几条线串起来讲。市面上的教程大多只给命令,不给逻辑,结果换个版本、换台机器就抓瞎。我更愿意把每一步背后的原因讲透,这样你自己就能判断哪一步该改、该绕、该重来。

1. 一键安装到底在装什么:先把需求拆清楚

很多人对"一键安装"有误解,以为是把一堆命令打包成一条脚本就完事了。实际上真正让一键脚本有价值的地方,是它帮你处理了版本匹配、软件源配置、密钥导入、依赖解析、环境变量写入这一整套容易出错的琐碎动作。搞清楚它干了什么,出问题你才知道去哪儿找原因。

1.1 Ubuntu 版本和 ROS 发行版的强制绑定关系

ROS 的发行版不是随便挑的,它和 Ubuntu 版本是硬绑定。这个绑定关系如果你不提前确认,很可能装到一半发现压根没有对应的包。下面这张对照表是我这几年用得最多的一张,建议收藏:

Ubuntu 版本对应 ROS1对应 ROS2支持状态
Ubuntu 20.04NoeticFoxyNoetic 是 ROS1 收官版本,长期维护
Ubuntu 22.04无官方 ROS1HumbleHumble 是当前 LTS,生态最全
Ubuntu 24.04无Jazzy较新的 LTS,部分包还在补齐

看到这张表你会发现一个关键信息:Ubuntu 22.04 之后官方就不给 ROS1 了。所以如果你手上的教程还在教你 Ubuntu 22.04 装 Noetic,大概率是错的,或者要折腾源码编译。这也是为什么我一直强调,先确认系统版本,再决定走 ROS1 还是 ROS2 的路线,别本末倒置。

判断自己系统版本很简单:

lsb_release -a

输出里的Release字段就是版本号。如果你拿到的是 20.04,那 ROS1 走 Noetic、ROS2 走 Foxy 是稳妥的;如果是 22.04,就直接上 Humble,别惦记 ROS1 了,除非你有明确的历史代码依赖。

1.2 一键脚本相比手动安装省了哪些事

手动装 ROS 的老流程大概是这样的:添加软件源、导入 GPG 密钥、apt update、安装ros-<distro>-desktop-full、初始化rosdep、配置环境变量。每一步都可能踩坑,尤其是 GPG 密钥和软件源这两步,一旦软件源写错,apt update直接报错,新手往往卡在这里就放弃了。

一键脚本的核心价值在于它把这一串动作顺序化、幂等化了。所谓幂等,就是你重复执行它也不会把系统搞乱——第二次跑它会检测到已经装过,跳过或者覆盖,而不像手动操作那样容易因为重复添加源而产生冲突。社区里流传比较广的那套一键安装脚本(用过的人应该知道是哪个),本质就是这么个东西:用 shell 封装了一组判断逻辑,根据你的系统版本自动选发行版,然后按顺序执行安装。

提示:一键脚本不是魔法,它只是把你的手替掉了。所以理解它执行的每一步,比无脑跑脚本更重要。

1.3 该选桌面版还是基础版

装 ROS 的时候会碰到ros-core、ros-base、desktop、desktop-full几个层级,很多人不知道选哪个。说人话:

  • ros-core只有最核心的通信机制,库都很少。
  • ros-base加了常用库和构建工具,适合做嵌入式或者服务器部署。
  • desktop加了 rviz、rqt 这些图形化工具,适合开发调试。
  • desktop-full在 desktop 基础上再加 Gazebo 仿真、导航、感知等一大票包,体积最大。

我个人的建议是,学习阶段直接上 desktop 或 desktop-full,别为了省几个 G 的空间折磨自己。等到你要往机器人上部署的时候,再考虑裁剪成 base。一键脚本通常会让你选,或者默认装 full,这点心里有数就行。

2. 装之前必须做的三件检查

脚本再智能,也架不住环境本身有问题。我见过太多"脚本跑一半失败了"的案例,最后查下来根本原因都是系统层面的小毛病。提前花三分钟检查,能省掉后面半小时的排错。

2.1 确认系统架构和软件源可用性

先看架构,x86_64 是最常见的,但也有用 ARM 板子跑 ROS 的情况:

uname -m

输出x86_64就是标准 64 位 PC 架构,aarch64是 ARM 64 位。这个信息决定了你后面能装哪些预编译包,ARM 平台有些包是要自己编译的。

然后是软件源。默认的软件源在国内访问可能很慢,脚本执行期间会频繁apt update,慢到超时就会失败。所以装之前我一般会先把源换成国内镜像:

# 先备份 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

换源这事儿各版本略有差异,24.04 之后用的是/etc/apt/sources.list.d/ubuntu.sources这个新格式。你要是图省事,直接用脚本站里附带的换源功能,或者手动把关键字换成国内镜像域名即可。换完记得:

sudo apt update

能正常跑完不报错,说明源的配置没问题。

2.2 检查磁盘空间和 apt 锁状态

ROS desktop-full 装下来轻松吃掉 5 到 10 个 G,如果你的虚拟机当初只分了 20G,装一半磁盘满是很常见的翻车点:

df -h

看根分区剩余空间,建议至少留 15G 以上。虚拟机用户可以提前扩容,别等到装到一半才想起来。

另一个高频问题是 apt 锁被占用,表现是提示"无法获得锁 /var/lib/dpkg/lock"。这通常是因为你开了两个终端同时在跑 apt,或者上次安装被强制中断了:

# 查看是不是有 apt 进程在跑 ps aux | grep -i apt

如果确实有残留进程,等它跑完;如果是异常中断导致的,可以用:

sudo rm /var/lib/dpkg/lock-frontend sudo dpkg --configure -a

注意:dpkg --configure -a这条命令是让 dpkg 把没配完的包重新配一遍,别嫌它慢,很多"依赖坏了"的假象跑一遍它就好了。

2.3 用户权限与 sudo 免密

一键脚本里大量使用sudo,如果每次都提示输密码,跑到一半你人不在电脑前,脚本就卡死了。所以有两个选择:要么全程盯着输密码,要么给当前用户配个 sudo 免密。后者改/etc/sudoers有风险,我一般不推荐新手碰,直接坐在电脑前跑脚本更稳。

如果你是在服务器或者远程 SSH 环境下跑,尤其要注意这点。我遇到过同事晚上挂着脚本跑,第二天来看卡在密码提示上,一晚上白等。所以远程操作的话,建议先用sudo -v刷新一下凭证缓存,默认 15 分钟内不会再问密码,脚本一般够跑完。

3. 一键安装的完整实操流程

前面铺垫这么多,现在进入正题。我把整个流程拆成下载脚本、执行、选版本、验证四步,每一步我都附上可能遇到的问题和我的处理方式。

3.1 获取并运行安装脚本

社区里那套一键安装脚本,通常可以通过一条命令直接拉取运行。标准做法是先下载再执行,别偷懒直接管道给 shell,这样你能先看一眼脚本内容:

wget http://fishros.com/install -O fishros && bash fishros

(这里以社区常见的入口为例,实际地址以你使用的脚本官方说明为准。)下载下来后,你可以用cat fishros | less快速浏览一下,看看它都干了哪些事,这一步是建立信任的关键,尤其是从网络拉下来的脚本,看一眼总没错。

脚本跑起来后一般会给你一个菜单,大致像这样:

1. 安装 ROS 2. 安装 ROS2 3. 配置系统源 4. 配置 rosdep ...

选 1 或 2 进入对应流程。如果你还没换源,建议先选配置系统源那一项,把源搞定再装,成功率高很多。

3.2 版本选择时的判断依据

进入安装流程后会让你选具体发行版。注意脚本给出的选项是根据你的 Ubuntu 版本过滤过的,也就是说 22.04 上它不会给你 Noetic 选项。这就是前面讲的版本绑定逻辑在起作用。

这时候你要做的判断是:我到底需要 ROS1 还是 ROS2?如果你没有历史包袱,新项目一律选 ROS2,这是趋势,生态也在往这边走。如果你要维护老代码或者跟着课程学,那就按课程要求来。

选完之后脚本开始跑,会经历几个明显阶段:换源、导入密钥、apt update、下载安装包、配置 rosdep。整个过程视网速从几分钟到二十分钟不等。rosdep init这一步有时候会失败,原因一般是网络问题或重复初始化,脚本通常会重试或者跳过,你留意一下最后的提示就行。

3.3 环境变量是怎么生效的

安装完成后最重要的一步是 source 环境变量。脚本一般会自动帮你在.bashrc里追加一行:

source /opt/ros/humble/setup.bash

(以 Humble 为例,其他版本把 humble 换成对应名字即可。)这行的作用是让当前 shell 能找到 ROS 的命令和库路径。追加完你需要让它在当前终端生效:

source ~/.bashrc

或者干脆关掉终端重开一个。我强烈建议验证一下是不是真的生效了:

echo $ROS_DISTRO

如果输出humble,恭喜你,环境配好了。如果输出空白,说明 source 没生效或者路径写错了,回去检查.bashrc里那行路径对不对。这是新手最容易忽略又最容易出问题的地方。

3.4 跑个小例子验证安装

环境配好不代表装成功,得跑个东西验证。ROS1 的话开两个终端,一个跑roscore,另一个跑小海龟:

# 终端 1 roscore # 终端 2 rosrun turtlesim turtlesim_node

能看到小海龟窗口、能按方向键让它动,说明通信机制是通的。ROS2 的话更简单,一句话搞定:

ros2 run demo_nodes_cpp talker

另开一个终端跑ros2 run demo_nodes_cpp listener,能看到两者在互相收发消息,就说明 ROS2 安装完全正常。这个验证习惯一定要养成,装完不验证,等真正开发时才发现问题,回头查更难。

4. 装完之后的收尾配置和一键安装的边界

一键脚本能帮你把 ROS 本体装好,但一个能用的开发环境还有几件事得自己做。这部分我列几个高频的收尾动作,都是实际干活绕不过去的。

4.1 常用工具和编译环境补齐

ROS 本身不带编译器和工作空间工具,这些得自己装:

sudo apt install python3-colcon-common-extensions python3-rosdep2 build-essential cmake git

colcon是 ROS2 的构建工具,catkin是 ROS1 的,build-essential和cmake是几乎所有包的基础依赖。这几个装完,你才能建工作空间、编译自己的代码。很多人装完 ROS 兴冲冲地colcon build,结果提示找不到 colcon,就是这一步漏了。

初始化 rosdep 也很关键,它是用来解决系统依赖的:

sudo rosdep init rosdep update

这两条如果报错,八成是网络问题或者之前初始化过残留了文件,删掉/etc/ros/rosdep/sources.list.d/下的旧文件重试即可。

4.2 建立自己的工作空间

装完 ROS 不等于能写代码,你还需要一个工作空间来放自己的功能包。以 ROS2 为例:

mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build source install/setup.bash

src目录下放你的功能包,colcon build编译,source install/setup.bash让当前终端能找到你编译出来的东西。这个source每次都做太麻烦,可以在.bashrc里加一句自动加载,但要注意别和/opt/ros的 source 顺序搞反,一般先 source 系统的,再 source 你自己的。

提示:.bashrc里 source 太多环境有时候会拖慢终端启动,我一般只在需要的时候手动 source 工作空间,系统环境那行常驻就行。

4.3 一键脚本不帮你做的那些事

这里得说句实在话,一键脚本的边界在哪。它擅长的是标准环境下的标准安装,但下面这些情况它帮不上忙:

  • 你要用特定版本的编译器或者交叉编译工具链。
  • 你要在非标准架构(比如某些 ARM 开发板)上装。
  • 你要多个 ROS 发行版共存,比如 ROS1 Noetic 和 ROS2 Humble 装同一台机器。

这些属于进阶需求,需要你手动处理依赖和路径。尤其是多版本共存,两个发行版的环境变量会打架,你得靠命名空间或者切换脚本手动管理。这些不是一键脚本的锅,是这类需求本身就复杂。

5. 常见问题排查实录

装 ROS 遇到的问题五花八门,但翻来覆去就那几类。我把这些年踩过的、同事问过的整理成一张速查表,配上排查思路,遇到类似的可以直接对号入座。

现象可能原因处理方式
脚本下载失败网络不通或地址失效检查网络,用浏览器打开地址看是否可访问
apt update 报错 GPG密钥没导入或过期重新导入密钥,或清理旧源重加
提示找不到包软件源里没有对应版本核对 Ubuntu 与 ROS 版本绑定关系
命令找不到 rosrun环境变量未 source检查 .bashrc,重新 source
rosdep 更新失败网络或残留文件清理 sources.list.d 重试
磁盘写满分区太小清理缓存或扩容
ROS1 和 ROS2 冲突环境变量叠加分开终端,用切换脚本管理
colcon build 找不到未装构建工具安装 colcon 扩展包

逐条说下我的处理心得。GPG 报错是最烦的一类,它的表现是apt update卡在某个源上刷屏报错,但其他源没事。这种时候先把出问题的源摘出来,一般是自己手动加源时加的。ROS2 从 Humble 开始,官方源的密钥方式和之前变了,用脚本自动加的基本没问题,手动加的容易错。环境变量冲突是另一大类,表现是明明装了 ROS2,敲ros2却说找不到命令,或者 ROS1 和 ROS2 的ROS_DISTRO互相覆盖。这种几乎都是.bashrc里 source 错了顺序,或者同时 source 了两个发行版的 setup.bash。解决办法是去.bashrc里只保留一个/opt/ros/<distro>/setup.bash。

还有一个隐蔽的坑,就是软件源优先级。如果你同时配了系统源里自带的 ROS 包和官方源,apt 可能会优先选系统源里的老版本,导致装了但版本不对。排查方式是:

apt-cache policy ros-humble-desktop

看候选版本是从哪个源来的,如果来源不对,就要调整源的优先级或者移除冲突的源。这个技巧不常用,但遇到"版本玄学"问题时非常管用。

6. 多版本共存与后续进阶方向

最后聊两个稍微进阶的话题,一个是 ROS1 和 ROS2 共存怎么办,另一个是装完之后往哪个方向深入。

6.1 ROS1 与 ROS2 打通的思路

现实中很多团队是 ROS1 存量代码 + ROS2 新项目并行,所以共存需求很真实。装的时候其实不难,Noetic 和 Humble 可以装在同一台 Ubuntu 20.04 上(或者用容器隔离)。难的是同时使用。ROS2 提供了一个叫ros1_bridge的工具,能在两个系统之间做消息桥接,让 ROS1 的节点和 ROS2 的节点互相通信。用法大致是先把两边环境都 source 上,再单独开一个终端跑 bridge:

# 分别 source ROS1 和 ROS2 环境 source /opt/ros/noetic/setup.bash source /opt/ros/humble/setup.bash ros2 run ros1_bridge dynamic_bridge

bridge 会把两边同名的消息类型自动打通。要注意消息类型不完全一致的时候得自己写映射,不是所有类型都能自动桥接。

6.2 装完 ROS 之后往哪儿走

ROS 装好只是起点,接下来几个方向看你的目标。做机械臂的,下一步是配 MoveIt 和 URDF 模型;做移动机器人导航的,要啃 Nav2(ROS2)或 move_base(ROS1)和代价地图、八叉树地图这些东西;做视觉的,去了解 cv_bridge 和相机标定;玩仿真的,Gazebo 和 rviz2 是必学工具。每个方向都能深挖很久,但基础都是这个能跑起来的 ROS 环境。

我的建议是先别贪多,找个官方教程或者靠谱的入门项目,把话题、服务、参数这几个基本通信机制敲一遍,跑通了再往上加复杂功能。ROS2 的命令行工具ros2 topic、ros2 node、ros2 service这几组命令要练熟,它们是排查一切问题的底牌。

说起来我在实际使用中发现一个规律,那些装完就急着上大项目的人,往往后期被各种环境问题拖累;反而是先把安装流程和基本验证做扎实的人,后面走得更顺。装环境这件事,快不是目的,稳才是。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询