ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

解决ROS Melodic安装报错:Unable to locate package 排查与修复指南

解决ROS Melodic安装报错:Unable to locate package 排查与修复指南 1. 问题现象一条看似简单的报错卡住了一整晚我到现在还记得第一次在Ubuntu 18.04上装ROS Melodic时遇到这个报错的感觉。明明照着教程一步步执行系统也没报什么“网络不通”或者“权限不足”偏偏就在sudo apt install ros-melodic-desktop-full这一步终端冷冰冰地回了一句E: Unable to locate package ros-melodic-desktop-full说实话这一行字对新手来说特别劝退。它不像“无法连接服务器”那样直白也不像“权限被拒绝”那样有明确的处理方向而是告诉你“找不到这个软件包”。但问题是全世界做ROS的人都在用这条命令怎么就找不到呢这篇文章我会把这条报错背后的原理、排查思路、解决办法全部拆开讲清楚。不管是刚开始接触ROS的小白还是已经被这个报错折磨了几个小时的老哥按着下面的步骤走基本都能解决。我还会额外讲几个很容易被忽视的坑比如公钥问题、系统版本不匹配、镜像源失效这些都能让你在同一个地方反复栽跟头。先说结论这个报错几乎从来不是“这个软件包不存在”而是“你的apt根本不知道去哪里找这个软件包”。理解了这句话问题就解决了一半。2. 报错背后的原理apt到底是怎么“找包”的2.1 apt的软件包查找机制要搞懂Unable to locate package先得知道apt的工作流程。你可以把apt想象成一个快递系统它不是自己生产包裹而是按照一份“货物清单”去仓库取货。这份清单就是/etc/apt/sources.list以及/etc/apt/sources.list.d/目录下的所有.list文件。当你执行sudo apt install ros-melodic-desktop-full时实际发生的过程是apt读取本地所有软件源配置知道“该去哪几个仓库找货”在本地缓存中搜索名字匹配的软件包如果找到开始解析依赖关系并安装如果找不到直接报E: Unable to locate package关键在第2步。这里的“本地缓存”不是安装时实时从网上下载的索引而是你上一次运行sudo apt update时生成的。也就是说如果你没有运行过update或者update的时候源里没有ROS相关的条目那apt就根本不知道世界上存在ros-melodic-*这些包。所以最直接的排查顺序就是先检查软件源里有没有ROS仓库再检查update有没有成功刷新索引最后才轮到怀疑网络和系统环境。2.2 Ubuntu版本和ROS发行版的对应关系这个坑我见过无数人踩。ROS Melodic对应的操作系统是Ubuntu 18.04 Bionic这是官方在2018年发布时的硬性绑定。换句话说ROS Melodic的预编译二进制包只发布在18.04的源里。如果你用的是Ubuntu 20.04那系统默认的源里自然不会有ros-melodic-*的软件包因为官方根本没给20.04编译Melodic的版本。20.04对应的ROS发行版是Noetic16.04对应的是Kinetic。这里有个很容易迷惑人的地方你在Ubuntu 20.04上执行sudo apt install ros-melodic-desktop-full系统不会提示“版本不匹配”而是会告诉你“找不到这个包”。这就让很多人误以为是自己操作有问题实际上是系统版本根本不支持。我在实际交流中遇到过一位朋友非要在Ubuntu 22.04上装Melodic折腾了两天都没成功。后来换了Noetic十分钟装完。倒不是说完全不能从源码编译但对于绝大多数场景直接换对应版本的ROS发行版才是最理智的选择。2.3 软件源的核心作用这里补充一个概念。Ubuntu的软件源分为几个部分官方源、镜像源、第三方源。ROS的软件包不在Ubuntu官方源里它是由Open Robotics以及后来的OSRF维护的独立仓库。所以你必须手动把这个第三方仓库添加到apt的源列表中。这就像你平时去固定的超市买东西但ROS这箱货不在这个超市你得先知道另一家专卖店并且把这家店的地址加到你的购物清单里。如果不加地址你跑再多次大超市也买不到。具体来说ROS仓库在源文件里长这样deb http://packages.ros.org/ros/ubuntu bionic main如果你用的系统是18.04但写成了focal20.04的代号同样会找不到包。如果你用的系统是20.04但写成了bionic即使能装上也极大概率出现依赖冲突。3. 逐步排查与解决从快速定位到彻底根治3.1 第一步确认系统版本不要凭感觉判断系统版本直接看事实lsb_release -a输出里会明确显示Release: 18.04或者20.04等。这一步能帮你判断是不是版本不匹配导致的“找不到包”。如果发现你的系统版本不是18.04那你需要做的不是继续折腾Melodic而是选择对应版本的ROS。具体对应关系如下Ubuntu版本系统代号对应ROS发行版16.04XenialKinetic18.04BionicMelodic20.04FocalNoetic22.04JammyHumbleROS 224.04NobleJazzyROS 2看到这里你就明白了ros-melodic-*这个命名里的melodic是发行版代号不是随便起的它和Ubuntu版本是严格绑定的。3.2 第二步检查软件源配置如果你确认系统是18.04下一步就是看ROS的源有没有配置过。执行ls /etc/apt/sources.list.d/或者直接查看主源文件cat /etc/apt/sources.listROS的仓库通常被添加在/etc/apt/sources.list.d/ros-latest.list文件里内容是deb http://packages.ros.org/ros/ubuntu bionic main如果这个文件不存在或者里面的内容被注释掉了那apt当然找不到ROS的包。另外要注意的是有些教程会教你用sudo sh -c echo deb ... /etc/apt/sources.list.d/ros-latest.list这种方式添加源。这种写法没问题但如果你之前执行过但没成功文件可能是不完整的甚至包含了换行符问题。建议直接删掉重建不要纠结。3.3 第三步添加ROS软件源这里我给出的方法是官方标准的做法只是对国内用户来说默认源可能比较慢我会在后面的章节单独讲镜像源的问题。首先安装一些基础工具sudo apt update sudo apt install -y curl gnupg2 lsb-release然后添加ROS仓库的公钥。这一步经常被忽略但没有公钥的话即使源配置正确update的时候也会报错关于这个我后面详细展开。sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg接着把仓库地址写入源列表。在Ubuntu 18.04上可以这样写echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros/ubuntu bionic main | sudo tee /etc/apt/sources.list.d/ros-latest.list注意这里用了signed-by参数指定了公钥文件路径这是较新版本apt支持的写法。如果你用的是老版本apt可能需要用传统的方式sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654不过apt-key在较新版本的Ubuntu上已经被标记为废弃建议优先用signed-by的方式。3.4 第四步刷新索引再安装这一步是核心中的核心。添加完源之后必须执行sudo apt update。如果不执行apt不知道新的仓库里有什么你直接安装还是会报错。sudo apt update执行完以后你可以先用搜索命令确认一下包是否存在apt policy ros-melodic-desktop-full apt search ros-melodic 2/dev/null | head -20如果看到了候选版本信息那说明源已经生效了接下来安装就是水到渠成的事sudo apt install -y ros-melodic-desktop-full整个流程走下来大部分人的问题都能解决。如果你严格按照这个顺序操作还是报错那继续往下看下面的内容基本覆盖了所有剩下可能的情况。4. 隐藏的坑公钥失效、镜像源和国内网络的硬核解法4.1 公钥报错的识别与处理很多人在执行sudo apt update的时候会看到类似下面的输出W: GPG error: http://packages.ros.org/ros/ubuntu bionic InRelease: The following signatures couldnt be verified because the public key is not available: NO_PUBKEY F42ED6FBAB17C654这个报错和Unable to locate package是两回事但它会间接导致后面的安装失败。因为apt为了保证软件包的安全性默认要求仓库的签名必须可信。如果公钥缺失apt会拒绝使用这个仓库的索引最终表现就是Unable to locate package。解决方式很简单重现添加公钥sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654或者是用上面提到的curl方式重新下载ros.key并安装。在实际操作中keyserver.ubuntu.com有时在国内访问不稳定如果超时可以换用hkp://pgp.mit.edu:80这样的备用服务器。这里有个经验之谈如果你是在早上七八点执行apt update遇到公钥失败大概率是网络问题而不是操作问题等一会儿再试往往就好了。4.2 国内镜像源配置提速避险两不误前文提到ROS官方源地址是http://packages.ros.org/ros/ubuntu。这个地址在国内的访问速度不稳定更新索引的时候经常卡在某个百分比不动或者下载一半直接断开。虽然并不一定会触发Unable to locate package但会让整个过程变得很漫长。针对这个问题国内有多个镜像站可以使用。常见的包括清华TUNA、阿里云、中科大等。以清华源为例ROS仓库的地址是deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu bionic main对应的源配置可以这样写echo deb [signed-by/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu bionic main | sudo tee /etc/apt/sources.list.d/ros-latest.list阿里云的地址是deb http://mirrors.aliyun.com/ros/ubuntu bionic main这两个我都实测过。清华源的同步频率比较及时阿里云的速度在国内大部分地区都很稳定。如果下载过程中断还可以考虑中科大的源deb https://mirrors.ustc.edu.cn/ros/ubuntu bionic main使用镜像源的时候有一点要注意公钥配置方式不变因为镜像站只是同步了软件包文件签名仍然基于ROS官方的密钥。4.3sudo apt update卡住、超时或部分失败的应对更新索引的时候最让人抓狂的倒不是报错而是卡住不动。行业里有个经典的“乌龟壳”问题更新首页列表时卡在[Connecting to packages.ros.org]十有八九是网络对官方域名的连接被卡住。解决思路很简单要么换镜像源要么在apt配置里增加超时和重试参数。后者可以这样设置echo Acquire::http::Timeout 10; | sudo tee /etc/apt/apt.conf.d/99timeout echo Acquire::http::Retries 5; | sudo tee -a /etc/apt/apt.conf.d/99timeout不过说实话这只是治标。如果网络环境不好最靠谱的方案还是直接用国内镜像源。上面说的清华源、阿里云源都可以在一个源更新失败的情况下可以尝试切换到另一个镜像源。此外还有一个扎心的细节某些网络环境下IPv6会导致apt连接异常。我遇到过一次执行update时一直卡在0% [Connecting to packages.ros.org (2001:...)]后来强制apt走IPv4就好了echo Acquire::ForceIPv4 true; | sudo tee /etc/apt/apt.conf.d/99force-ipv4这个不算常见但真遇到的时候能让你少浪费半小时。4.4 一键安装工具的看法搜索热词里出现了很多关于“鱼香ROS一键安装”的内容。这类工具的设计初衷是降低ROS的安装门槛把添加源、配置公钥、安装依赖、初始化环境这些步骤全部脚本化。在很多时候它确实能帮新手快速装好环境。但我的建议是如果你连《Unable to locate package》这个报错都还没见过你可以用一键安装但如果你想搞清楚ROS是怎么安装的、源和apt是怎么配合的那就别用。因为安装ROS本质上不是一个复杂的过程复杂的是理解里面每一步在干什么。手动装过一次之后后续换机器、换发行版、排查环境问题都会从容很多。如果你确实想了解一键安装到底做了什么可以查看脚本内容。本质上就是上面那些命令的集合外加一些系统检测和自动选择源的操作。并没有太多神奇的地方。5. 安装完成后的环境配置与验证5.1 环境变量配置如果安装顺利最后一步是配置ROS的环境变量。执行echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc这一步经常被新手跳过。如果不配置你执行roscore或者rosversion -d的时候会提示找不到命令。这个报错和Unable to locate package不同它是环境变量没有加载的问题但同样能让人卡在原地。5.2 用“小乌龟”验证环境是否正常ROS自带的小乌龟turtlesim是我认为最好的环境验证工具比任何理论讲解都直观。打开三个终端终端1roscore终端2rosrun turtlesim turtlesim_node终端3rosrun turtlesim turtle_teleop_key然后你就可以用方向键控制小乌龟移动了。如果你能看到海龟窗口并且按键能控制它动就说明ROS的核心通信机制已经正常工作了。这个验证方式不花哨但非常有效。我曾经在排查问题时光顾着看rosnode list和rostopic list反而忽略了最基础的图形验证走了不少弯路。5.3 工作空间的创建与编译测试环境验证通过后建议顺手创建一个工作空间检验catkin编译工具链是否正常mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make记得source一下工作空间的setup文件source devel/setup.bash如果catkin_make能顺利执行完成说明ROS编译链也没问题。这时候你的ROS环境才算真正可用。6. 疑难杂症与补充方案6.1 安装特定包时仍然找不到用通配符搜索有时候ros-melodic-desktop-full这个大包安装没问题但想单独装某个功能包时却提示找不到。比如输入sudo apt install ros-melodic-gazebo-ros结果报错找不到。这时候先别慌运行一下搜索命令apt search ros-melodic-gazebo看看输出里有没有相关的包只是名字和你记的不太一样。ROS的包名有时候和教程里显示的不完全一致比如可能是ros-melodic-gazebo-ros-pkgs而不是ros-melodic-gazebo-ros。用apt search加包名关键字通常能快速定位准确的名字。6.2 在WSL或Docker里装ROS时的差异很多人的开发环境不是原生Ubuntu而是WSL或者Docker。这两种环境装ROS的思路相同但有几个坑不一样。WSL特别是WSL 2里装ROS Melodic最大的问题是图形界面。如果你运行小乌龟或者rviz的时候黑屏或者报错大概率是显示服务器没配置好。WSL自带WSLg的版本可以直接跑图形程序但老版本需要额外的X Server配置。不过这只影响GUI程序roscore、rosnode list、rostopic echo这些命令行工具是不受影响的。Docker里装ROS则需要注意roscore和Node通信的默认端口。ROS Master默认使用11311端口如果容器之间跑多机通信需要把端口映射出来同时还要处理好ROS_MASTER_URI和ROS_IP环境变量。很多人第一次在Docker里跑ROS单机没问题但宿主机和容器之间通信老是失败基本都是环境变量没配对。6.3 从源码安装的备选方案如果你的系统版本特殊比如在Ubuntu 20.04上非要装Melodic官方没有预编译包那只能从源码编译。这个过程复杂得多不仅需要安装大量依赖库还可能遇到Boost版本冲突、OpenCV版本不兼容等等。我的建议是除非你有明确的理由否则不要走这条路。简单说20.04就用Noetic22.04就不要用ROS 1了直接上ROS 2 Humble。从源码编译ROS Melodic这种操作真的不划算。6.4 找不到Python相关包的问题在热词里看到了unable to locate package python3-colcon-common-extensions和unable to locate package python termux这其实和ROS源无关而是操作系统源的Python包没有覆盖到。对于Ubuntu 18.04安装colcon的正确方式是先启用universe软件源sudo add-apt-repository universe sudo apt update sudo apt install python3-colcon-common-extensions如果还是找不到也可以直接用pip装pip3 install -U colcon-common-extensions7. 常见问题速查表问题现象可能原因处理方式E: Unable to locate package ros-melodic-*未添加ROS源添加ROS仓库并执行sudo apt update同上Ubuntu版本不匹配确认系统版本换用对应ROS发行版同上ROS源公钥缺失重新添加ROS公钥apt update卡在连接网络无法访问官方源换用清华/阿里云等国内镜像源apt update报GPG错误公钥未验证或过期重新获取对应公钥安装后找不到roscore环境变量未配置source/opt/ros/melodic/setup.bash安装依赖时提示版本冲突源里有多个ROS版本检查源配置确保没混用不同发行版的源apt install下载缓慢官方源带宽有限替换为国内镜像源8. 从一次报错中学到的核心方法论回到一开始那个报错E: Unable to locate package。它的本质是apt在本地索引里找不到目标包而本地索引来自你配置的源和最后一次apt update的结果。所以排查这个问题的顺序永远是确认系统版本和ROS发行版的对应关系确认ROS源是否已添加且源里的系统代号是否正确确认公钥是否有效执行sudo apt update并注意看有没有报错用apt search验证包是否存在安装这套排查逻辑不仅适用于ROS也适用于任何基于apt的软件安装。你甚至可以把它推广到其他包管理器上比如pip的Unable to find a version that satisfies the requirement以及npm的ENOTFOUND它们本质上都是“找不到目标”的一类问题只是各自的源配置和索引机制略有差异。我在实际使用中的体会是ROS的安装问题往往不是某一单个步骤复杂而是叠加了好几个小问题。源没配好update就刷不出索引索引刷不出来安装就找不到包包找不到新手就开始怀疑人生然后乱试命令最后环境越来越乱。
返回列表