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