
在 Ubuntu 22.04 上裝 ROS十個有八個會卡在sudo apt update這一行紅字上E: The repository http://mirrors.ustc.edu.cn/ros/ubuntu jammy Release does not have a Release file。我?guī)腿伺挪檫@個問題已經(jīng)不止一二十次了群里隔三差五就有人把這段報錯原封不動貼出來然后配一句“怎么回事”。這篇就把這個報錯講透Release 文件到底是什么為什么中科大的ros/ubuntu源里沒有 jammy以及在一個干凈的 Ubuntu 22.04 上到底應(yīng)該怎么配源、怎么裝 ROS 才能真正跑起來。這篇適合兩類人一類是照著老教程裝 ROS1 沒裝成、卡在 update 這一步的新手另一類是已經(jīng)裝好 ROS、但想搞清楚 apt 軟件源工作機制的人。我不只給結(jié)論還會把判斷過程寫出來以后你再看到任何does not have a Release file之類的報錯都能自己定位。1. Release 文件是什么為什么缺了它 apt 直接罷工1.1 apt update 時系統(tǒng)到底在做什么很多人看到apt update就是把軟件列表更新一下但不知道它背后是一套“下載索引 → 校驗哈希 → 比對簽名”的流程。你寫進(jìn) sources.list 的每一行deb條目apt 都會做一次這樣的處理deb [archamd64 signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.ustc.edu.cn/ros/ubuntu jammy main這一行拆開分為倉庫根目錄http://mirrors.ustc.edu.cn/ros/ubuntu、發(fā)行版代號jammy、組件main。apt 執(zhí)行 update 時會把這個路徑拼成下面這個地址去請求http://mirrors.ustc.edu.cn/ros/ubuntu/dists/jammy/Release這個Release文件才是關(guān)鍵。它相當(dāng)于一本“帶防偽標(biāo)簽的菜單”里面寫明了當(dāng)前發(fā)行版的代號、支持的組件、架構(gòu)以及后面每個 Packages 索引文件的 SHA256 哈希值。apt 先拿到它校驗數(shù)字簽名再按里面的哈希值去下載Packages.gz、Packages.xz這類真正的軟件包索引。如果Release文件不存在apt 就既無法確認(rèn)這個倉庫的真實性也無法信任后面的索引內(nèi)容于是直接報錯拒絕把這個源納入系統(tǒng)。所以does not have a Release file不是網(wǎng)絡(luò)不通也不是權(quán)限不夠而是服務(wù)器上根本沒有這個文件。用一個生活化的類比你拿著菜單去餐廳點菜菜單上根本沒有這道菜服務(wù)員當(dāng)然沒法給你下單。1.2 把報錯逐段拆開看我們要養(yǎng)成拆報錯的能力。這一行報錯其實分四段E: The repository http://mirrors.ustc.edu.cn/ros/ubuntu jammy Release does not have a Release file.The repository指你配置的整條源條目。.../ros/ubuntu jammy Release倉庫地址是http://mirrors.ustc.edu.cn/ros/ubuntu你要的發(fā)行版是jammy缺失的文件是Release。does not have a Release file結(jié)論該倉庫對應(yīng)發(fā)行版目錄下的Release文件不存在。自己驗證一下最快。打開終端直接請求這個文件看返回狀態(tài)curl -I http://mirrors.ustc.edu.cn/ros/ubuntu/dists/jammy/Release如果返回404 Not Found就說明服務(wù)器上沒有這個路徑。然后你可以看看這個倉庫到底支持哪些版本curl http://mirrors.ustc.edu.cn/ros/ubuntu/dists/正常情況下你會看到一堆類似focal、bionic、xenial這樣的目錄但不會有jammy。到這里問題已經(jīng)很清楚不是你的源寫錯了格式而是這個倉庫壓根沒有為 Ubuntu 22.04 提供軟件包。至于為什么沒有就要聊到 ROS 版本和 Ubuntu 版本綁定的問題了。2. 為什么中科大的 ros/ubuntu 沒有 jammyROS 版本和 Ubuntu 版本是綁死的2.1 ROS1 止步于 Noetic官方?jīng)]有為 jammy 做過二進(jìn)制包很多初學(xué)者最大的誤解是覺得“ROS 是一個獨立的軟件裝到哪個 Ubuntu 上都應(yīng)該能裝”。實際上 ROS 官方發(fā)布二進(jìn)制包時會針對特定的 Ubuntu 發(fā)行版代號單獨打包。ROS1 這邊最要命的一點是它在新版本系統(tǒng)上的支持進(jìn)度早就停住了。ROS1 各版本對應(yīng)的系統(tǒng)大致是這樣的ROS1 版本對應(yīng) Ubuntu 版本代號Kinetic Kame16.04xenialMelodic Morenia18.04bionicNoetic Ninjemys20.04focalNoetic 是 ROS1 的最后一個正式發(fā)行版官方在 REP 2000 里明確寫過整個 ROS1 生命周期的安排。Noetic 發(fā)布之后官方就沒有繼續(xù)為 Ubuntu 22.04 做 ROS1 二進(jìn)制包的打算了。這意味著上游軟件源里壓根沒有dists/jammy/這個目錄鏡像站只是同步上游內(nèi)容你也不能指望中科大鏡像自己變出一個 jammy 目錄來。這就是最核心的原因你在 Ubuntu 22.04 上往一個 ROS1 的源里寫了 jammy而 ROS1 在 jammy 上沒有官方發(fā)布版本。所以無論換清華源、阿里云源還是官方源只要路徑還是ros/ubuntu結(jié)果都是一樣的不存在某個鏡像站“魔法般地有 jammy”。這一點想通了就不會再浪費時間反復(fù)換鏡像。2.2 ROS2 是另一條獨立的源ros/ubuntu 和 ros2/ubuntu 別混用那 Ubuntu 22.04 上是不是就不能裝 ROS 了當(dāng)然能只是要裝 ROS2。ROS2 的主流發(fā)行版和 Ubuntu 版本對應(yīng)關(guān)系如下ROS2 版本對應(yīng) Ubuntu 版本代號Foxy Fitzroy20.04focalHumble Hawksbill22.04jammyIron Irwini22.04jammyRolling跟隨最新開發(fā)版動態(tài)變化這里有個極其容易踩坑的細(xì)節(jié)ROS1 和 ROS2 在官方倉庫和鏡像站里用的是兩個完全不同的路徑。ROS1 倉庫http://packages.ros.org/ros/ubuntuROS2 倉庫http://packages.ros.org/ros2/ubuntu中科大鏡像對應(yīng)為ROS1 鏡像http://mirrors.ustc.edu.cn/ros/ubuntuROS2 鏡像http://mirrors.ustc.edu.cn/ros2/ubuntu所以你看到報錯里的mirrors.ustc.edu.cn/ros/ubuntu這是 ROS1 的源而 Ubuntu 22.04 對應(yīng)的是 ROS2。想要在 jammy 上裝 ROS就必須使用/ros2/ubuntu這條路徑版本名也只能選支持 jammy 的 Humble 或 Iron。很多人報錯之后一路排查最后發(fā)現(xiàn)只是把ros和ros2看漏了一個數(shù)字這種情況我見過太多次了。2.3 安裝前先花一分鐘確認(rèn)系統(tǒng)代號養(yǎng)成習(xí)慣配任何第三方源之前先確認(rèn)你自己的 Ubuntu 版本代號。不要憑印象寫jammy或者focal更不要用22.04這種數(shù)字去拼源apt 源里的 codename 必須是全小寫的代號。lsb_release -a cat /etc/os-release輸出里找Codename那一行。如果是jammy說明這是 Ubuntu 22.04直接對號入座去查 ROS 版本表如果是focal可以裝 ROS1 Noetic 或者 ROS2 Foxy如果是noble恭喜你你用的是 Ubuntu 24.04目前需要確認(rèn)最新版 ROS2 的支持情況不要拿著年前的教程硬套。這一分鐘能幫你省下后面一整晚的折騰。3. 三套修法換源、換版本、一鍵腳本3.1 方案 AUbuntu 22.04 上裝 ROS2 Humble走官方流程這是我最推薦的標(biāo)準(zhǔn)做法。它沒有繞開問題而是正面解決系統(tǒng)是 22.04ROS 就選 Humble源就指向 ROS2 的鏡像倉庫。整個流程如下。先準(zhǔn)備基礎(chǔ)工具sudo apt update sudo apt install -y curl gnupg2 software-properties-common然后下載 ROS 倉庫的簽名公鑰放到 keyring 里sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg寫入 ROS2 源注意這里我直接用$(lsb_release -cs)動態(tài)獲取你的系統(tǒng)代號讓你不會拼錯echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.ustc.edu.cn/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list再更新索引sudo apt update這次你會發(fā)現(xiàn)報錯消失了。因為http://mirrors.ustc.edu.cn/ros2/ubuntu/dists/jammy/Release是真實存在的。接下來安裝完整桌面版sudo apt install -y ros-humble-desktop裝完記得把環(huán)境變量寫進(jìn) shell 配置不然每次開終端都要手動 sourceecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc驗證裝沒裝好可以啟動小烏龜ros2 run turtlesim turtlesim_node再開一個終端ros2 run turtlesim turtle_teleop_key用方向鍵控制烏龜移動這個背后就是 ROS2 的節(jié)點通信關(guān)系一個是發(fā)布者一個是訂閱者通過 topic 傳遞消息。裝一次能把 ROS2 的核心通信模型體驗一遍對小白的性價比很高。3.2 方案 B用魚香ROS一鍵安裝腳本快速省心如果你不想手動敲命令或者之前已經(jīng)折騰到系統(tǒng)源一團糟也可以用國內(nèi)社區(qū)常用的魚香ROS一鍵安裝腳本。它的原理就是幫你檢測系統(tǒng)版本、自動選好合適的源、處理好公鑰和 rosdep 依賴最后把 ROS 裝在正確的位置上。常見用法是wget http://fishros.com/install -O fishros . fishros執(zhí)行后會出現(xiàn)一個交互菜單通常會有“一鍵安裝 ROS/ROS2”、“安裝 rosdepc”、“配置環(huán)境”等選項。你選擇安裝 ROS2 桌面版腳本會繼續(xù)問版本選擇 Humble 即可。它會自動完成換源、安裝、初始化 rosdep 等步驟。注意如果機器上之前已經(jīng)手動加了錯誤的 ROS1 源建議先用sudo rm /etc/apt/sources.list.d/ros2.list之類的命令把錯誤條目清掉再運行腳本避免出現(xiàn)“兩個源打架”的情況。一鍵腳本的定位是“幫你把活干完”不是“讓你永遠(yuǎn)不用看文檔”。我建議你跑完腳本后自己打開/etc/apt/sources.list.d/和/etc/os-release看一眼搞清楚它能成功是因為什么。理解了原理以后出問題就不會慌。3.3 方案 C如果課程只教 ROS1老老實實退回 Ubuntu 20.04可能有人會問我就是學(xué)校教材用 ROS1必須裝 Noetic能不能在 22.04 上湊合答案是二進(jìn)制安裝不行你能走的路都很難走。官方?jīng)]有為 jammy 提供 ROS1 的二進(jìn)制包這不是換個鏡像就能解決的。雖然有人通過源碼編譯 ROS1 在 22.04 上跑起來但對初學(xué)者來說那會引入一整套編譯工具鏈和依賴地獄半天都不一定搞得定。最省事的方案其實是如果你的核心目標(biāo)是把 ROS1 Noetic 跑起來做作業(yè)、跑仿真直接安裝 Ubuntu 20.04focal然后安裝ros-noetic-desktop-full。這個方案看似是在“重裝系統(tǒng)”實際上避開了所有版本不匹配的坑。機器人方向的大多數(shù) ROS1 教程、參考資料、Gazebo 仿真案例都是在 Noetic Ubuntu 20.04 的組合下驗證過的。為一個過時的 ROS1 版本在自己的主力系統(tǒng)上折騰各種編譯兼容問題投入產(chǎn)出比很低。我把三條路放在一起對比一下方案適用場景ROS 版本源路徑適合人群A官方流程裝 Humble新項目、新學(xué)習(xí)路線ROS2 Humble/ros2/ubuntu愿意按標(biāo)準(zhǔn)文檔走B魚香ROS一鍵腳本快速驗證、國內(nèi)網(wǎng)絡(luò)環(huán)境自動匹配自動選擇追求省心快速C退回 20.04 裝 Noetic學(xué)校課程、ROS1 老項目ROS1 Noetic/ros/ubuntu必須用 ROS1 的人3.4 方案對比之外的判斷邏輯三個方案沒有絕對的好壞關(guān)鍵是先問自己一個問題我要跑的東西是 ROS1 的包還是 ROS2 的包如果是一臺真實機器人或者教學(xué)平臺廠家給你的驅(qū)動和示例通常只支持其中一種查清楚再動手。我之前見過有人花了一晚上裝好 Humble第二天發(fā)現(xiàn)某個底盤驅(qū)動只有 Noetic 版本最后乖乖換 20.04 重來。先花十分鐘做決策比什么技巧都重要。4. 現(xiàn)場實錄從報錯到 ROS 跑起來4.1 第一步把錯誤源清干凈拿到一臺報錯的機器我一般先看一遍源文件里到底寫了什么。很多人的錯誤源其實分布在兩個地方/etc/apt/sources.list和/etc/apt/sources.list.d/目錄下。有些教程讓用戶直接把 ROS 源追加到系統(tǒng)源文件末尾有的則單獨建一個ros.list。先備份再檢查這是處理系統(tǒng)文件的基本原則。sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak ls /etc/apt/sources.list.d/ grep -rn ros /etc/apt/sources.list /etc/apt/sources.list.d/grep的結(jié)果里凡是包含mirrors.ustc.edu.cn/ros/ubuntu或者packages.ros.org/ros/ubuntu的整行基本都是這次報錯的源頭。確認(rèn)不是系統(tǒng)源之后用編輯器把這幾行注釋掉或者直接刪除對應(yīng)的.list文件。還有一個很容易忽略的地方如果之前配置了ros.list里面可能既有舊 ROS1 源又有新 ROS2 源兩條同時存在。apt update的時候只要其中一條失敗整體就會顯示錯誤所以清理時不要留情保證最終只剩一組正確的 ROS 源。4.2 第二步核對系統(tǒng)代號和架構(gòu)清理之后先做一次硬件和系統(tǒng)的信息確認(rèn)。這一步的目的是保證后面寫入的路徑全對lsb_release -a dpkg --print-architecture uname -m正常的一臺 Ubuntu 22.04 x86_64 機器會輸出類似這樣的信息Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy而dpkg --print-architecture輸出通常是amd64。這兩個信息決定了源里$(lsb_release -cs)和$(dpkg --print-architecture)應(yīng)該被替換成什么值。如果你用的是樹莓派或 ARM 開發(fā)板架構(gòu)是arm64寫源時也要確保用了對應(yīng)架構(gòu)的 keyring 和倉庫支持。這一步做扎實后面的命令就只是復(fù)制粘貼。4.3 第三步完整執(zhí)行一遍正確流程下面是一個完整的、我實測過的流程。它基于中科大 ROS2 鏡像適合 Ubuntu 22.04 jammy 裝 Humble# 1. 安裝基礎(chǔ)工具 sudo apt update sudo apt install -y curl gnupg2 # 2. 下載 ROS 公鑰 sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg # 3. 寫入 ROS2 源 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://mirrors.ustc.edu.cn/ros2/ubuntu $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list # 4. 更新并安裝 sudo apt update sudo apt install -y ros-humble-desktop # 5. 配置環(huán)境 echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc整個過程做下來最花時間的通常是第 4 步的sudo apt install -y ros-humble-desktop因為要下載的包很多幾千個依賴文件很正常。我建議在安裝之前先把系統(tǒng)的其他軟件源也切到國內(nèi)鏡像不然 ROS 本體從中科大下系統(tǒng)依賴卻從官方源慢慢下速度不一樣會很難受。如果安裝過程出現(xiàn)依賴沖突不要急著sudo apt --fix-broken install一頓亂修。先看報錯里沖突的包是什么自己是不是之前手動裝過某個版本的庫。很多依賴問題都是同學(xué)以前裝 OpenCV 或者 CUDA 時留下的這種問題在博客評論區(qū)里三言兩語說不清需要看具體報錯但原則是盡量在干凈的 Ubuntu 環(huán)境里先裝 ROS再裝其他重型庫。4.4 第四步rosdep 卡住時別傻等裝完 ROS 后很多教程會帶著執(zhí)行sudo rosdep init rosdep update這一步的作用是給后續(xù)catkin_make或colcon build編譯工作空間時自動下載依賴用的。它默認(rèn)要從raw.githubusercontent.com這個地址拉取配置文件。說實話國內(nèi)很多網(wǎng)絡(luò)環(huán)境下訪問這個域名非常不穩(wěn)定卡住是常態(tài)。你會看到類似這樣的錯誤ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list遇到這種情況我的建議是如果只是為了跑預(yù)編譯好的 ROS 包可以先把 rosdep 跳過它不影響ros2 run turtlesim這類命令運行。等日后真的需要自己建工作空間、編譯功能包時再來處理依賴初始化。如果現(xiàn)在就急著用社區(qū)里常用的替代工具是rosdepc魚香ROS一鍵腳本里也會集成它。常規(guī)安裝方式sudo apt install -y python3-pip sudo pip3 install rosdepc sudo rosdepc init rosdepc update之后在編譯工作空間時把原來的rosdep install換成rosdepc install即可。它的核心價值就是把默認(rèn)源換成了國內(nèi)更穩(wěn)定的通道其他邏輯和 rosdep 一致。4.5 驗證階段跑通一次通信鏈路裝完之后驗證環(huán)節(jié)我習(xí)慣分兩步走。第一步啟動一個最基礎(chǔ)的節(jié)點確認(rèn)環(huán)境沒問題ros2 run demo_nodes_cpp talker終端會每隔一段時間打印一條消息比如Publishing: Hello World: 0。再開一個終端ros2 run demo_nodes_cpp listener如果能看到對方不斷收到消息說明 ROS2 節(jié)點通信關(guān)系已經(jīng)正常建立了發(fā)布訂閱、DDS 發(fā)現(xiàn)機制都活著。第二步才跑小烏龜因為它有圖形界面能直觀看到鍵盤控制回傳。這兩步跑通ROS 環(huán)境就算真正可用了。很多同學(xué)裝完不驗證直接去編譯工作空間報錯了又分不清是環(huán)境問題還是代碼問題那是給自己挖坑。5. 常見問題與排查實錄報錯速查表與隱蔽的坑5.1 高頻報錯速查表做一個能直接存下來的速查表。以下這些錯誤我都實際見過不是想象的場景。報錯信息原因處理方法... does not have a Release file倉庫路徑和系統(tǒng)代號不匹配換成 ROS2 源或換系統(tǒng)版本... is not signed公鑰沒配好或簽名校驗失敗重新下載 ros.key 并用signed-by指向 keyringN: Updating from such a repository cant be done securely系統(tǒng)拒絕了無簽名的源添加 keyring 或刪除該源Err:6 ... jammy InRelease 404 Not Found路徑不存在多為 ros1/ros2 路徑寫錯檢查/ros/ubuntu與/ros2/ubuntu的區(qū)別rosdep init ERROR: cannot download default sources list訪問 raw.githubusercontent.com 受限使用 rosdepc 或手動放置配置文件bash: ros2: command not found沒有 source ROS2 環(huán)境執(zhí)行source /opt/ros/humble/setup.bashPackage ros-humble-desktop is not available源里沒有對應(yīng)軟件包確認(rèn)源是 ROS2 倉庫且 update 成功Err: http://... ros2.key Connection timed out下載公鑰時網(wǎng)絡(luò)不穩(wěn)定多試幾次或從鏡像站幫助頁獲取 key這里的核心思想只有一個報錯信息沒有一句廢話每個字段都在告訴你線索。不要看到紅字就慌先提取倉庫地址、發(fā)行版代號、具體文件路徑這三個要素問題基本能定位一半。5.2 三個特別隱蔽的坑第一個坑把 ROS1 和 ROS2 的命令混著用。有人在裝了 ROS2 之后還習(xí)慣性敲roscore、catkin_make得到command not found后又以為裝壞了。其實 ROS1 和 ROS2 是完全不同的體系命令、構(gòu)建工具、工作空間布局都不一樣。ROS1 用roscore catkin_makeROS2 用ros2 colcon。混著用會把自己搞亂。如果必須同時使用兩套要學(xué)會用source /opt/ros/noetic/setup.bash和source /opt/ros/humble/setup.bash在不同終端里切換但新手不建議這么玩。第二個坑源條目里寫了數(shù)字版本號。apt 源里的發(fā)行版標(biāo)識永遠(yuǎn)是代號不是版本號。寫deb ... http://mirrors.ustc.edu.cn/ros2/ubuntu 22.04 main是錯的必須是jammy。一個蘿卜一個坑系統(tǒng)的lsb_release -cs輸出什么源里就寫什么。手動敲的時候圖省事結(jié)果往往就是這里扣一分。第三個坑下載公鑰失敗之后硬著頭皮繼續(xù)。很多同學(xué)在curl ros.key那一步就失敗了然后忽略了錯誤直接寫源文件、update最后報簽名錯誤。記住signed-by指定的 keyring 文件必須真實存在且內(nèi)容正確。如果你執(zhí)行完 curl 之后不確定是否成功就檢查文件ls -l /usr/share/keyrings/ros-archive-keyring.gpg file /usr/share/keyrings/ros-archive-keyring.gpg如果文件不存在或者內(nèi)容不對就先把這一步解決很多后續(xù)問題自然消失。5.3 我處理這類問題的經(jīng)驗值說實話這類報錯本身并不可怕可怕的是在錯誤的源上反復(fù)折騰。我見過有人連續(xù)換了四五個鏡像站最后發(fā)現(xiàn)每個站的ros/ubuntu都沒有 jammy這才意識到是版本選錯了。所以我處理這類問題的第一反應(yīng)永遠(yuǎn)是問一句你是要 ROS1 還是 ROS2你的 Ubuntu 版本是多少這兩個答案一對問題就解決了一半。另外一點經(jīng)驗配置源的時候盡量讓命令自己替你填參數(shù)。用$(lsb_release -cs)代替手寫jammy用$(dpkg --print-architecture)代替手寫amd64。這樣就算以后系統(tǒng)換版本命令也不會拼錯。腳本比人更可靠尤其是深夜犯困的時候。還有如果在國內(nèi)環(huán)境下用中科大源報錯頻繁可以在 USTC、清華 TUNA、阿里云三個鏡像源之間切換。切換的方法是改源文件里的域名其他內(nèi)容保持不變。每次切換完記得執(zhí)行一次sudo apt update確認(rèn)沒問題再繼續(xù)。這不是什么高深技巧只是多一個備用選擇。最后再說一句關(guān)于魚香ROS腳本的看法。它確實能幫你省事尤其在 rosdep 這一環(huán)rosdepc 是我見過最順手的替代工具。但比工具更重要的是理解它幫你做了什么。我見過很多同學(xué)用一鍵腳本裝完 ROS 后連自己的系統(tǒng)是什么版本、源文件放在哪里都不知道。如果這篇文章你能記住一句話我希望是遇到Release file報錯先看倉庫路徑對不對再看系統(tǒng)代號匹配不匹配最后才考慮換鏡像和加公鑰。按這個順序排查ROS 環(huán)境不會裝不起來。