如果你是在 VMware 虚拟机里装了 Ubuntu,然后跟着 ROS Melodic 的安装教程敲下 sudo apt install ros-melodic-desktop-full,终端却回了一句 E: Unable to locate package ros-melodic-desktop-full,这时候先别怀疑网络,也别急着重装虚拟机。这个报错的意思很直接:apt 在它当前的软件包索引里,根本找不到你让它安装的那个名字。换句话说,这不是“下载失败”,而是“仓库里没有这个候选”。
真正让人头疼的地方在于,同一个报错背后能藏好几种完全不同的原因。可能是 ROS 软件源压根没加,可能是源加了但系统版本不对,也可能是包名在 ROS Melodic 发行版里根本不存在。我见过太多人在“重新装一遍 Ubuntu”和“反复 apt update”之间浪费几个小时,结果一看源文件,ros-latest.list 里写的是 Ubuntu 20.04 的代号。这篇文章就把这个 ROS Melodic 安装过程中高频出现的 E: Unable to locate package 从原理到排查完整拆一遍,尤其是虚拟机环境下容易忽略的几个细节。
1. E: Unable to locate package 其实对应三种完全不同的问题
先把结论摆出来,后面的每一步排查都靠这个判断兜底。你在终端里看到“无法定位软件包”时,对应的真实问题通常只有三选一:ROS 源没加、ROS 源加的代号不对、包名在源里不存在。偶尔还会有第四种情况,就是密钥或缓存问题导致 apt update 没有真正把 ROS 仓库索引拉下来,但表象也是“找不到包”。
1.1 压根没把 ROS 软件源写进 apt
这是最基础但也最常见的情况。ROS Melodic 的二进制软件包并不在 Ubuntu 自带的官方源里,而是放在 packages.ros.org 这个独立软件仓库。所以如果你只是在一台刚装好的 Ubuntu 18.04 上运行 sudo apt install ros-melodic-desktop-full,apt 在自己的默认源列表里翻来找去,发现根本没有 ros-melodic-* 这种前缀的包,自然就会提示 E: Unable to locate package。
怎么判断是不是这个问题?直接看源文件:
bash复制ls -l /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/ros-latest.list
如果提示 No such file or directory,或者 ros-latest.list 文件不存在,那么 ROS 源就没配过。这是整个问题链里最容易修的一种,照着官方流程添加源、导入公钥、更新索引就能解决,后面会专门讲。
1.2 源加了,但是 Ubuntu 版本代号和 ROS 发行版对不上
软件仓库在 apt 眼里是按 Ubuntu 发行版代号分目录存放的。packages.ros.org/ros/ubuntu 下面有 dists/bionic/、dists/focal/ 这些子目录,分别对应 Ubuntu 18.04 和 Ubuntu 20.04。ROS Melodic 官方支持的是 Ubuntu 18.04 Bionic,所以 apt 只会在 bionic 这个目录里寻找 Melodic 的包。
很多安装教程会建议这样添加源:
bash复制sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
这段命令本身没问题,它会把当前系统的代号自动填进去。但如果你实际上用的是 Ubuntu 20.04,lsb_release -sc 会返回 focal,最终源文件里就写着 focal main。问题是 apt 在 focal 目录里只能找到 ROS Noetic 的二进制包,而你要装的是 Melodic,那结果就是更新索引成功,但依然什么都装不上。
ROS 1 各发行版和 Ubuntu 版本的对应关系是固定的:
| ROS 发行版 | Ubuntu 版本 | Ubuntu 代号 |
|---|---|---|
| ROS Melodic | Ubuntu 18.04 | bionic |
| ROS Noetic | Ubuntu 20.04 | focal |
| ROS Kinetic | Ubuntu 16.04 | xenial |
如果你想要的某个 ROS 发行版,和你现在系统版本对不上,添加再多的源也没有用。
1.3 包名在 Melodic 的发行索引里不存在
第三种情况稍微隐蔽一点。ROS 的软件包并不是所有版本都发布到二进制仓库,rosdistro 里记录了每个发行版实际会生成哪些 deb 包。你想装的某个功能包如果没被维护者发布到 Melodic 的二进制索引里,那么即使 ROS 源配得完全正确,apt install ros-melodic-xxx 也照样给你报 Unable to locate package。
举个例子,你在网上看到一篇文章推荐安装某个工具,文章写的是 `sudo a
