
先交代一下背景我最近在一臺剛裝好 Ubuntu 24.04 LTS 的機器上折騰 ROS2目標(biāo)很明確就是要裝當(dāng)前官方同步支持的 Jazzy 版本。整個過程其實不算復(fù)雜但網(wǎng)上資料東一塊西一塊有的寫 22.04 的 Humble有的直接貼命令不解釋理由跟著抄很容易踩坑。這篇記錄我打算按自己的實際操作順序來寫把每一步為什么要這么做、命令在干什么、遇到問題怎么排查都講清楚希望能幫你少走點彎路。不管你是在物理機、虛擬機還是 WSL 里裝只要系統(tǒng)是 Ubuntu 24.04這套流程基本通吃。1. 安裝前的準(zhǔn)備工作別急著敲命令1.1 為什么要選 Ubuntu 24.04 ROS2 Jazzy很多人其實沒搞明白 ROS2 版本和 Ubuntu 版本之間是有嚴(yán)格對應(yīng)關(guān)系的。ROS2 Jazzy Jalisco 是 2024 年 5 月隨 Ubuntu 24.04 LTS 一起發(fā)布的 LTS 版本官方支持周期到 2029 年。這個“LTS 對 LTS”意味著什么意味著你不需要像以前用 ROS1 那樣系統(tǒng)一升級整個 ROS 環(huán)境就廢掉也不會有操作系統(tǒng)還在維護但 ROS 版本已經(jīng)停止更新的尷尬情況。如果你去 ROS 官方文檔看發(fā)行列表會發(fā)現(xiàn)每個 ROS2 版本都有明確的平臺支持矩陣。比如 Humble 對應(yīng) Ubuntu 22.04Iron 對應(yīng) 24.04 但它是非 LTS 版本而 Jazzy 是第一個長期支持的 24.04 ROS2 版本。所以對于要跑長期項目、做畢設(shè)、或者部署機器人實機的朋友來說Ubuntu 24.04 ROS2 Jazzy 是目前最穩(wěn)妥的組合之一。選這個組合本質(zhì)上是在選擇一個“未來幾年都不用再大動干戈”的開發(fā)底座。1.2 環(huán)境選型物理機、虛擬機還是 WSL我在這次安裝前專門對比了三種常見環(huán)境因為選錯環(huán)境會在后續(xù)使用中帶來完全不同的體驗這里直接給結(jié)論。環(huán)境優(yōu)點缺點推薦場景物理機原生 Ubuntu性能最好GPU 直通ROS2 底層通信無額外延遲可能需要放棄 Windows 環(huán)境驅(qū)動有時要折騰長期開發(fā)、實機部署、跑仿真和視覺VMware/VirtualBox 虛擬機不影響宿主機系統(tǒng)可隨時快照回滾3D 加速弱Gazebo 重負(fù)載場景可能卡頓初學(xué)者練手、臨時測試、課程作業(yè)WSL2啟動快和 Windows 文件系統(tǒng)互通適合寫代碼網(wǎng)絡(luò)模式特殊部分 GUI 和外接 USB 設(shè)備要額外處理輕量開發(fā)、純代碼調(diào)試、不想完全脫離 Windows如果你像我一樣用虛擬機做演示建議至少分配 4 核 CPU、8GB 內(nèi)存和 40GB 磁盤這樣跑起來不至于太憋屈。如果只是練手驗證虛擬機完全夠用但如果你后面要跑 Gazebo Harmonic 做機械臂仿真、或者接激光雷達跑導(dǎo)航我建議直接上物理機或者 WSL2別在虛擬機里跟自己過不去。1.3 系統(tǒng)初始化更新、磁盤與源安裝之前先做兩件事。第一確保持久系統(tǒng)是最新狀態(tài)打開終端執(zhí)行sudo apt update sudo apt upgrade -y這一步很多人會跳過去我建議別跳。ROS2 依賴的底層庫非常多如果系統(tǒng)本身的包索引都是舊的后面裝 ROS 依賴時很容易遇到版本沖突或者找不到包。第二確認(rèn)磁盤空間。完整桌面版的 ROS2 Jazzy 安裝完大概要占 3~5GB加上編譯緩存和依賴建議系統(tǒng)盤至少留出 15GB 空閑。我見過有人裝到一半就卡住就是因為/usr分區(qū)滿了那種狀況處理起來特別麻煩。另外提醒一句如果你在虛擬機里安裝建議先把 VMware Tools 或 VirtualBox Guest Additions 裝好再開始裝 ROS。因為后續(xù)所有操作都要靠復(fù)制粘貼命令沒有增強工具的話鼠標(biāo)切入切出和粘貼板共享會非常折磨人。2. 核心安裝步驟逐條拆解2.1 添加 ROS2 軟件源官方源安裝ROS2 不像普通軟件那樣可以直接用 Ubuntu 自帶的 apt 源安裝你需要把 ROS2 的官方軟件倉庫添加到系統(tǒng)里。這個做法的本質(zhì)和你在 Ubuntu 里添加 Docker、VS Code 等第三方源是一樣的沒有什么黑魔法。先安裝依賴的工具包sudo apt install software-properties-common curl sudo add-apt-repository universe第一條命令裝的是后面添加源需要的curl等工具第二條是啟用 Ubuntu 的 universe 軟件倉庫。ROS2 在 Ubuntu 上依賴了很多這個倉庫里的包不啟用的話后面會不斷報依賴缺失。然后添加 ROS2 官方的 GPG 密鑰sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg接著把 ROS2 的 apt 源寫入系統(tǒng)配置文件echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null這里我解釋一下arch$(dpkg --print-architecture)和$(. /etc/os-release echo $UBUNTU_CODENAME)這兩個自動替換的含義。前者會自動識別你的 CPU 架構(gòu)在 24.04 上通常是 amd64少數(shù) ARM 設(shè)備上會變成 arm64這樣就不用針對不同平臺手寫不同的源后者會從/etc/os-release文件里讀取當(dāng)前系統(tǒng)的版本代號Ubuntu 24.04 對應(yīng)的代號是noble所以最終寫入的源路徑會解析成http://packages.ros.org/ros2/ubuntu noble main。這也是為什么這篇文章的流程對所有基于 24.04 的衍生系統(tǒng)同樣有效的原因只要系統(tǒng)代號是 noble這條命令就能正確工作。配置完成后執(zhí)行sudo apt update如果源配置正確你會看到輸出里出現(xiàn)Packages.ros.org的倉庫更新信息。如果沒有出現(xiàn)或者提示找不到 Release 文件那你就要回頭檢查系統(tǒng)版本代號和網(wǎng)絡(luò)連通性了。這一步是后續(xù)所有安裝能夠成功的分水嶺。2.2 安裝 ros-jazzy-desktop 完整桌面版ROS2 Jazzy 的 apt 包按功能拆成了很多層級最核心的三種安裝方式如下# 方式一只裝基礎(chǔ)通信框架沒有 GUI 工具 sudo apt install ros-jazzy-ros-base # 方式二完整桌面版包含所有常用工具和庫推薦 sudo apt install ros-jazzy-desktop # 方式三指定某個功能包按需安裝 sudo apt install ros-jazzy-rviz2我這次裝的是ros-jazzy-desktop因為我對 rviz2、demo 節(jié)點、tf2 這些工具都有需求一次裝齊省得后面再補。完整安裝大概會拉取兩百多個依賴包下載體積在 1GB 左右安裝完占用磁盤約 3~4GB。安裝時間取決于你的網(wǎng)絡(luò)速度和磁盤性能我在虛擬機里大概花了十分鐘左右物理機上會快很多。這里有個經(jīng)驗分享如果你只是需要某個特定功能包不要偷懶裝 desktop也不建議裝 ros-base 之后再一個個補。用ros-jazzy-ros-base打底然后按需apt install ros-jazzy-具體包名這樣對系統(tǒng)的侵入最小以后排查問題也更容易定位。我見過很多新手把ros-jazzy-desktop裝完之后又另外裝了一堆五花八門的包結(jié)果系統(tǒng)里出現(xiàn)兩套不同版本的依賴輕則報環(huán)境變量沖突重則直接把系統(tǒng)搞掛。2.3 配置環(huán)境變量并驗證安裝完成之后ROS2 的命令還不會被自動識別因為它的可執(zhí)行文件放在/opt/ros/jazzy/目錄下需要手動激活環(huán)境。每次打開新終端執(zhí)行source /opt/ros/jazzy/setup.bash手動敲太麻煩所以直接把這一行加到 shell 配置文件的末尾echo source /opt/ros/jazzy/setup.bash ~/.bashrc source ~/.bashrc之后每次打開終端就自動加載 ROS2 環(huán)境了。注意如果你用的是 zsh要改成~/.zshrc我當(dāng)時差點在這個細(xì)節(jié)上翻車。配置完成后用下面幾條命令做個快速體檢printenv | grep ROS ros2 --help ros2 daemon stop ros2 daemon start第一條命令會輸出ROS_DISTROjazzy這樣的環(huán)境變量如果輸出為空說明 source 沒生效第二條命令能跑起來說明主程序沒問題第三條是重啟 ROS2 的守護進程很多時候剛裝完環(huán)境ros2命令會卡在Unable to contact my own daemon執(zhí)行一下這個命令能解決大部分服務(wù)端通信問題。3. 安裝成功后的基礎(chǔ)驗證跑通第一個 ROS2 程序3.1 用 talker/listener 驗證節(jié)點通信裝完之后很多人不知道下一步該干嘛這里我推薦一條完整的驗證鏈路先跑內(nèi)置的 talker/listener 示例確認(rèn) ROS2 最基本的發(fā)布訂閱通信是否正常。打開兩個終端都確保 ROS2 環(huán)境已經(jīng)激活。第一個終端運行ros2 run demo_nodes_cpp talker第二個終端運行ros2 run demo_nodes_cpp listener如果一切正常第一個終端會持續(xù)輸出[INFO] [1700000000.123456789] [talker]: Publishing: Hello, world! 1 [INFO] [1700000000.623456789] [talker]: Publishing: Hello, world! 2第二個終端會同步打印收到的消息??吹竭@種輸出說明你的 ROS2 安裝已經(jīng)完全可用了。這里順便教大家一個排查思路如果 talker 正常但 listener 收不到消息先別急著懷疑安裝重啟一下 ROS2 守護進程試試很多時候是這個后臺服務(wù)在系統(tǒng)休眠或網(wǎng)絡(luò)切換后抽風(fēng)了ros2 daemon stop ros2 daemon start3.2 小烏龜測試turtlesim 的完整玩法talker/listener 驗證的是純通信機制但對大多數(shù)人來說太抽象了跑起來沒什么成就感。接下來我們上一只烏龜這是 ROS2 教程里最經(jīng)典的可視化驗證程序。安裝小烏龜包sudo apt install ros-jazzy-turtlesim然后運行ros2 run turtlesim turtlesim_node這時會彈出一個藍色背景的窗口里面有一只烏龜。新開一個終端運行ros2 run turtlesim turtle_teleop_key在這個終端里用鍵盤方向鍵控制烏龜移動。這個測試看起來簡單但它驗證了幾個關(guān)鍵東西ROS2 的節(jié)點發(fā)現(xiàn)機制、話題通信、GUI 程序的顯示環(huán)境。如果在虛擬機里測試烏龜窗口沒彈出來優(yōu)先檢查虛擬機圖形環(huán)境配置不要直接懷疑 ROS2 裝錯了。小烏龜還可以順帶驗證 ROS2 的話題系統(tǒng)。在第三個終端執(zhí)行ros2 topic list ros2 topic echo /turtle1/cmd_velros2 topic list會顯示當(dāng)前所有話題你按方向鍵時/turtle1/cmd_vel話題上會有實時數(shù)據(jù)流ros2 topic echo能看到以幾何消息格式發(fā)布的線速度和角速度數(shù)據(jù)。這一套跑通你對 ROS2 的“節(jié)點-話題-消息”三大核心概念就有了直觀認(rèn)知。3.3 Rviz2 可視化驗證如果小烏龜沒問題再來驗證一下 ROS2 的 3D 可視化工具 Rviz2ros2 run rviz2 rviz2看到圖形界面成功啟動就說明 ROS2 的圖形工具鏈也沒問題。Rviz2 是 ROS2 生態(tài)里最基礎(chǔ)也是最常用的可視化工具后續(xù)做 SLAM、視覺識別、路徑規(guī)劃都離不開它所以這一步驗證很有必要。如果你打算做機械臂相關(guān)項目后面還可以裝ros-jazzy-urdf-tutorial之類的包加載官方 URDF 模型直接在 Rviz2 里拖動關(guān)節(jié)看效果這算是 Rviz2 最直觀的上手方式了。4. 常見問題與排查技巧實錄4.1 找不到安裝候選包執(zhí)行sudo apt install ros-jazzy-desktop時如果提示Package ros-jazzy-desktop has no installation candidate大多數(shù)情況有兩種原因。第一系統(tǒng)版本代號不對你的系統(tǒng)不是 Ubuntu 24.04 或者基于 24.04 的發(fā)行版導(dǎo)致源路徑解析錯誤第二你添加源的命令執(zhí)行時有語法錯誤配置文件內(nèi)容有問題。排查方法是先看源文件cat /etc/apt/sources.list.d/ros2.list正常的話你應(yīng)該看到包含noble main字樣的記錄。如果沒有或者顯示的是其他版本代號就要重新執(zhí)行 2.1 節(jié)的添加源命令。另外也可以執(zhí)行apt-cache search ros-jazzy | head如果能搜到包說明源是通的只是包名拼寫問題搜不到就回過頭檢查源配置。4.2 source 之后 ros2 命令仍然找不到這個問題最常見的原因是你當(dāng)前終端不是登錄 shell或者~/.bashrc沒有被正確加載。對應(yīng)的解決辦法是手動執(zhí)行source /opt/ros/jazzy/setup.bash然后再試ros2 --help。還有一個隱藏很深的坑就是終端模擬器可能默認(rèn)沒有讀取.bashrc這種情況下即使你寫入了配置也不會自動生效。解決方法是直接在終端里執(zhí)行bash進入子 shell或者干脆重啟終端。如果source之后ros2還是找不到那就檢查/opt/ros/jazzy/目錄是否存在ls /opt/ros/jazzy/如果目錄里只有setup.sh但缺少setup.bash說明你可能之前用過 zsh 交互流程安裝過程中某些環(huán)境變量被污染了。最簡單的恢復(fù)辦法是重新安裝一遍ros-jazzy-ros-base它會補齊所有基礎(chǔ)文件。4.3 虛擬機里運行卡頓和窗口崩潰如果你和我一樣在 VMware 里安裝可能會遇到兩個典型問題。一是小烏龜和 Rviz2 的 3D 渲染幀率極低這是因為默認(rèn)的虛擬顯卡性能太弱。VMware 里可以開啟 3D 加速并把顯存調(diào)到 128MB 以上VirtualBox 的話在“設(shè)置-顯示-顯存”里同樣可以調(diào)高。二是窗口偶發(fā)崩潰這通常是 Wayland 和 X11 兼容性的問題可以在登錄界面的齒輪菜單里選擇Ubuntu on Xorg會話登錄ROS2 的 GUI 工具在 Xorg 環(huán)境下要穩(wěn)定得多。4.4 與 Python 3.12 和 pip 相關(guān)的問題Ubuntu 24.04 自帶的是 Python 3.12這比 22.04 的 3.10 新了不少ROS2 Jazzy 雖然同步支持 3.12但 apt 安裝的 ROS2 包默認(rèn)是用系統(tǒng) Python 環(huán)境的。如果你后面想用 pip 裝一些 ROS2 相關(guān)的輔助庫比如numpy、scipy、transformations千萬不要直接pip install到系統(tǒng)環(huán)境里很容易和 ROS2 自身的依賴產(chǎn)生沖突。我建議使用虛擬環(huán)境或者至少加上--user參數(shù)pip install --user numpy另外如果系統(tǒng)里同時裝了unset PYTHONPATH之后才能正常使用某些工具這說明了 Python 路徑系統(tǒng)混亂??梢杂胑cho $PYTHONPATH檢查是否有異常路徑如果輸出了一堆不知道哪來的路徑建議先清理掉再測試 ROS2 功能。4.5 網(wǎng)絡(luò)問題導(dǎo)致下載緩慢或失敗ROS2 的包主要托管在packages.ros.org國內(nèi)訪問速度有時不太理想。這里提供幾個穩(wěn)妥的應(yīng)對思路一是使用帶斷點續(xù)傳功能的下載工具比如apt本身支持?jǐn)帱c續(xù)傳但如果你用curl手動下載東西建議加上-C -參數(shù)讓它支持續(xù)傳二是如果某次apt update失敗是偶發(fā)性的直接重試幾次很多時候是網(wǎng)絡(luò)抖動三是在 apt 配置里設(shè)置超時時間echo Acquire::http::Timeout 5; | sudo tee /etc/apt/apt.conf.d/99timeout把超時時間改短這樣網(wǎng)絡(luò)卡住時會快速報錯而不是傻等然后重新執(zhí)行sudo apt update即可。這一步在真實使用中非常管用。5. 進一步探索搭建第一個 colcon 工作區(qū)和節(jié)點5.1 安裝 colcon 構(gòu)建工具ROS2 的項目工程標(biāo)準(zhǔn)工具是 colcon它取代了 ROS1 時代的 catkin。雖然在 ROS2 官方倉庫里它已經(jīng)自帶了一部分構(gòu)建工具但要自己創(chuàng)建功能包還是建議安裝完整的 colconsudo apt install python3-colcon-common-extensions然后創(chuàng)建一個工作區(qū)目錄mkdir -p ~/ros2_ws/src cd ~/ros2_ws colcon build第一次在工作區(qū)根目錄執(zhí)行colcon build時即使沒有源碼也會生成本地的install、build、log三個目錄。install目錄里會有和你這個工作區(qū)對應(yīng)的setup.bash運行你自己的節(jié)點之前需要先激活它。5.2 用 Python 寫一個最簡單的發(fā)布-訂閱節(jié)點工作區(qū)建好之后我們來創(chuàng)建一個最簡單的 Python 功能包。在src目錄下cd ~/ros2_ws/src ros2 pkg create my_first_pkg --build-type ament_python --node-name talker_node這會生成一個名為my_first_pkg的功能包同時創(chuàng)建一個空的talker_node.py節(jié)點文件。然后編輯talker_node.py寫入以下內(nèi)容import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__(talker_node) self.publisher self.create_publisher(String, my_topic, 10) self.timer self.create_timer(1.0, self.timer_callback) self.count 0 def timer_callback(self): msg String() msg.data fHello from my_first_pkg: {self.count} self.publisher.publish(msg) self.get_logger().info(fPublishing: {msg.data}) self.count 1 def main(argsNone): rclpy.init(argsargs) node Talker() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()這段代碼做的事情很簡單Timer每秒鐘觸發(fā)一次回調(diào)函數(shù)回調(diào)里構(gòu)造一個String類型消息發(fā)布到名為my_topic的話題上。寫完之后回到工作區(qū)根目錄執(zhí)行cd ~/ros2_ws colcon build --packages-select my_first_pkg source install/setup.bash ros2 run my_first_pkg talker_node你會看到節(jié)點每秒打印一條發(fā)布日志。這時候你再開一個終端執(zhí)行ros2 topic echo /my_topic就能看到自己發(fā)布的消息了。到這一步你就真正完成了從“安裝 ROS2 環(huán)境”到“運行自己的第一個 ROS2 程序”的完整閉環(huán)。如果你對這些內(nèi)容感興趣下一步可以嘗試做幾件事用ros2 node list和ros2 node info /talker_node查看節(jié)點信息寫一個訂閱端節(jié)點接收自己的消息或者直接用rviz2加載一個 URDF 機器人模型感受一下 ROS2 在機器人建模方面的能力。我個人在實際操作中的體會是ROS2 的安裝其實只是萬里長征第一步真正有價值的是安裝完成之后怎么把環(huán)境用起來。建議你裝好之后立刻創(chuàng)建自己的工作區(qū)哪怕是抄最簡單的官方示例也要親手在終端里敲一遍這個流程走通之后你對 ROS2 的整個架構(gòu)和操作習(xí)慣會有一個質(zhì)的提升。最后再分享一個維護技巧每次關(guān)閉系統(tǒng)前記得看一眼/var/log/目錄有沒有異常大的日志文件ROS2 在頻繁運行節(jié)點時產(chǎn)生的日志量比想象中大隔段時間清理一次能避免磁盤被無聲無息地占滿。裝好環(huán)境只是開始祝你后續(xù)的機器人開發(fā)之路順順利利。