發(fā)板安裝ROS2 Humble指南:換源、配置與避坑全記錄)
這段時(shí)間幫朋友在一臺(tái)ARM開(kāi)發(fā)板上從零折騰ROS2 Humble整個(gè)過(guò)程可以說(shuō)是把能踩的坑基本都踩了一遍。板子用的是RK3588方案的國(guó)產(chǎn)開(kāi)發(fā)板系統(tǒng)是Ubuntu 22.04arm64目標(biāo)就是裝一個(gè)能跑起來(lái)、能建圖導(dǎo)航、能正常通信的ROS2 Humble環(huán)境。中間經(jīng)歷了換源失敗、公鑰報(bào)錯(cuò)、rosdep超時(shí)、節(jié)點(diǎn)起不來(lái)、rviz2卡成PPT等一系列問(wèn)題。這篇文章就把完整的安裝流程和避坑記錄整理出來(lái)給準(zhǔn)備在ARM開(kāi)發(fā)板上入坑ROS2的同學(xué)當(dāng)個(gè)參考手冊(cè)。先說(shuō)清楚這文章不是把ROS2官方文檔翻譯一遍而是結(jié)合ARM板這些資源受限設(shè)備的真實(shí)情況把軟件源怎么換、ROS2怎么裝、環(huán)境怎么配、遇到報(bào)錯(cuò)怎么排查這些事講透。內(nèi)容同樣適用于香橙派、樹(shù)莓派、Jetson系列只要是arm64架構(gòu)的Ubuntu 22.04思路基本一致只有個(gè)別細(xì)節(jié)差異。1. 動(dòng)手之前先搞懂這套組合的脾氣1.1 ARM板上的Ubuntu 22.04到底特殊在哪很多人剛開(kāi)始用ARM開(kāi)發(fā)板裝東西最容易忽略的一件事就是ARM版的Ubuntu和x86版的Ubuntu雖然界面長(zhǎng)得一樣、命令用起來(lái)一樣但底層的軟件源是完全不同的。x86用的是archive.ubuntu.com那一套源ARM架構(gòu)用的是ports.ubuntu.com。如果你在ARM板上直接抄x86電腦上的換源教程把源地址換成mirrors.aliyun.com/ubuntu/系統(tǒng)在apt update的時(shí)候就會(huì)報(bào)一堆404錯(cuò)提示找不到Release文件最后什么包都裝不了。另外ARM架構(gòu)還要分清楚arm64和armhf。像RK3588、樹(shù)莓派4B以上、Jetson系列這些都是64位的arm64架構(gòu)這也是ROS2 Humble官方支持的架構(gòu)。armhf屬于32位Ubuntu 22.04對(duì)armhf的支持已經(jīng)縮水了ROS2也基本不理會(huì)這種平臺(tái)。所以開(kāi)始操作之前先確認(rèn)一下自己的板子架構(gòu)uname -m dpkg --print-architecture如果輸出是aarch64和arm64就是標(biāo)準(zhǔn)的arm64環(huán)境后面所有步驟可以放心照著做。還有一個(gè)很實(shí)際的問(wèn)題ARM開(kāi)發(fā)板的存儲(chǔ)空間普遍吃緊。很多板子用的是16GB、32GB的eMMC或者TF卡裝完系統(tǒng)桌面版之后可用空間可能只剩幾個(gè)GB這在安裝ROS2 Humble的時(shí)候會(huì)非常被動(dòng)。因?yàn)閞os-humble-desktop完整版安裝完之后光/opt/ros目錄就要吃掉將近2GB加上編譯依賴和緩存整體空間需求大概在4GB到6GB。所以動(dòng)手之前我強(qiáng)烈建議先看看磁盤(pán)余量不夠的話先擴(kuò)容或者把不用的包清理一遍或者給ROS2加上--no-install-recommends參數(shù)減少依賴體積后面安裝環(huán)節(jié)會(huì)詳細(xì)講。1.2 ROS2 Humble為什么值得在ARM上折騰ROS2 Humble Hawksbill是ROS2的LTS版本官方支持周期到2027年對(duì)應(yīng)的Ubuntu版本就是22.04Jammy。對(duì)于要在嵌入式設(shè)備上做長(zhǎng)期項(xiàng)目的人來(lái)說(shuō)LTS意味著不會(huì)用著用著就被版本更新割裂社區(qū)支持和軟件包兼容性都更穩(wěn)。和ROS1的Kinetic、Noetic相比ROS2從架構(gòu)上就不依賴roscore中心節(jié)點(diǎn)采用了基于DDS的分布式通信每個(gè)節(jié)點(diǎn)獨(dú)立運(yùn)行單點(diǎn)故障不會(huì)拖垮整個(gè)網(wǎng)絡(luò)這對(duì)多機(jī)協(xié)作、機(jī)器人集群控制來(lái)說(shuō)是剛需。在ARM開(kāi)發(fā)板上使用ROS2還有一個(gè)特別合拍的原因ROS2對(duì)資源占用是可控的。跟ROS1那種必須開(kāi)一個(gè)roscore常駐進(jìn)程的架構(gòu)不同ROS2節(jié)點(diǎn)是去中心化的如果你把內(nèi)置的DDS后端換掉比如用Cyclone DDS替代默認(rèn)的Fast DDS內(nèi)存占用能下降一半以上。這就讓資源本來(lái)就不多的ARM板子有了更多余量去跑感知、導(dǎo)航這些重負(fù)載節(jié)點(diǎn)。我之前也見(jiàn)過(guò)不少人在樹(shù)莓派上折騰ROS1 Noetic費(fèi)了半天勁把環(huán)境搭好了結(jié)果發(fā)現(xiàn)很多新出的功能包、算法包已經(jīng)不給ROS1開(kāi)發(fā)版本了生態(tài)遷移已經(jīng)是大勢(shì)所趨。既然2023年之后社區(qū)的主流資源都涌向ROS2那在ARM板上直接一步到位裝Humble反而是省時(shí)間的選擇。這篇文章后面的所有步驟也都是基于ROS2 Humble在arm64 Ubuntu 22.04上的環(huán)境來(lái)展開(kāi)的。2. 阿里云換源ARM板的第一步也是第一道坎2.1 新版Ubuntu的源寫(xiě)法變了很多換源教程講的是Ubuntu 20.04或者更早版本的做法直接編輯/etc/apt/sources.list文件就行了。但Ubuntu 22.04改用了DEB822格式的源配置默認(rèn)的軟件源配置移到了/etc/apt/sources.list.d/ubuntu.sources這個(gè)文件里/etc/apt/sources.list反而變成了一個(gè)空文件或者不存在。當(dāng)時(shí)有個(gè)朋友拿著舊教程去改/etc/apt/sources.list寫(xiě)進(jìn)去之后發(fā)現(xiàn)apt update一點(diǎn)反應(yīng)都沒(méi)有白白浪費(fèi)了半小時(shí)。所以ARM板上換源的第一步是先看清楚系統(tǒng)默認(rèn)的源配置放在哪個(gè)文件。22.04系統(tǒng)里正確的操作對(duì)象是/etc/apt/sources.list.d/ubuntu.sources它的內(nèi)容結(jié)構(gòu)大概是這樣Types: deb URIs: http://ports.ubuntu.com/ubuntu-ports/ Suites: jammy jammy-updates jammy-backports Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg注意這個(gè)URIs字段默認(rèn)就是ports.ubuntu.com因?yàn)檫@是給非x86架構(gòu)用的端口。換源的核心就是把ports.ubuntu.com替換成阿里云的鏡像地址其他字段保留。2.2 阿里云源配置實(shí)操阿里云鏡像站對(duì)Ubuntu ARM架構(gòu)提供了專(zhuān)門(mén)的鏡像路徑地址是https://mirrors.aliyun.com/ubuntu-ports/。注意后面這個(gè)ubuntu-ports很多人寫(xiě)成了/ubuntu/結(jié)果又是一堆404。我個(gè)人的操作建議是不要直接用sed替換源文件而是一次性重寫(xiě)整個(gè)ubuntu.sources這樣最干凈不會(huì)殘留舊源導(dǎo)致校驗(yàn)出問(wèn)題。操作步驟sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak sudo tee /etc/apt/sources.list.d/ubuntu.sources EOF Types: deb URIs: https://mirrors.aliyun.com/ubuntu-ports/ Suites: jammy jammy-updates jammy-backbones Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg EOF這里有個(gè)需要注意的細(xì)節(jié)寫(xiě)完之后Components這幾個(gè)參數(shù)建議保留main universe restricted multiverse四個(gè)組件不要圖省事只寫(xiě)main否則后面裝ROS2依賴的時(shí)候會(huì)提示找不到一些軟件包比如python3-vcstool、python3-colcon-common-extensions這些工具在universe組件里才有。編輯完源之后執(zhí)行sudo apt update這一步如果看到正常滾動(dòng)出軟件包索引信息沒(méi)有404和無(wú)法連接的錯(cuò)誤說(shuō)明阿里云源已經(jīng)生效。順手再執(zhí)行一次sudo apt full-upgrade -yARM開(kāi)發(fā)板很多出廠系統(tǒng)是舊版本的內(nèi)核和固件升級(jí)一遍能避免后面不少奇奇怪怪的編譯問(wèn)題。不過(guò)升級(jí)時(shí)間可能在幾分鐘到十幾分鐘不等取決于板子和網(wǎng)絡(luò)速度耐心等即可。2.3 換源后必做的完整性檢查換完源別急著就開(kāi)始裝ROS2先用幾條命令確認(rèn)一下系統(tǒng)狀態(tài)不然裝到一半出了問(wèn)題排查起來(lái)特別費(fèi)勁。# 檢查系統(tǒng)版本和架構(gòu) lsb_release -a dpkg --print-architecture # 檢查關(guān)鍵工具是否存在 which curl which gnupg which lsb_release如果curl或者gnupg沒(méi)裝先補(bǔ)上sudo apt install -y curl gnupg lsb-release這兩個(gè)工具后面添加ROS2公鑰的時(shí)候必須用到。另外如果板子還沒(méi)有裝software-properties-common建議也一起裝掉它提供了一些apt擴(kuò)展功能后續(xù)裝第三方源和開(kāi)發(fā)工具能省不少事。磁盤(pán)空間這塊也再?gòu)?qiáng)調(diào)一次。查看空間df -h如果/分區(qū)的可用空間少于5GB建議先處理。我見(jiàn)過(guò)有人硬著頭皮裝到最后系統(tǒng)提示/opt/ros寫(xiě)入失敗然后整個(gè)apt狀態(tài)鎖住清理起來(lái)很麻煩??臻g不夠的話有幾個(gè)辦法清理/var/cache/apt/archives下的緩存包、刪除不用的桌面軟件、掛載外置U盤(pán)或NVMe硬盤(pán)把/opt/ros軟鏈過(guò)去。不過(guò)最省心的還是在開(kāi)始之前就把空間準(zhǔn)備出來(lái)。3. ROS2 Humble安裝全流程記錄3.1 基礎(chǔ)環(huán)境準(zhǔn)備locale和開(kāi)發(fā)工具ROS2對(duì)系統(tǒng)的locale有要求需要支持UTF-8編碼。如果當(dāng)前系統(tǒng)locale設(shè)置不對(duì)編譯和運(yùn)行階段會(huì)報(bào)一些Perl警告或者編碼錯(cuò)誤。檢查現(xiàn)在的localelocale如果顯示的語(yǔ)言不是en_US.UTF-8或者zh_CN.UTF-8這種帶UTF-8后綴的建議統(tǒng)一改成UTF-8環(huán)境。sudo apt update sudo apt install -y locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8很多人在這一步圖省事想保留中文locale實(shí)測(cè)下來(lái)也能用但后續(xù)在編譯一些英文注釋比較多的包時(shí)偶爾會(huì)遇到編碼相關(guān)的警告所以還是推薦切到UTF-8的英文環(huán)境純粹是為了減少麻煩。接下來(lái)安裝一些基礎(chǔ)編譯工具和版本管理工具ROS2工作空間編譯時(shí)會(huì)用到sudo apt install -y git cmake build-essential python3-pip python3-venv3.2 添加ROS2軟件源和公鑰ROS2官方apt源地址是packages.ros.org這個(gè)源對(duì)國(guó)內(nèi)的網(wǎng)絡(luò)并不總是友好但因?yàn)樵谲浖馕鲭A段ROS2源里的包本體數(shù)據(jù)量不算大所以只要公鑰能順利添加后面下載安裝包的速度還是可以接受的。如果覺(jué)得官方源下載慢后續(xù)可以去阿里云鏡像站找有沒(méi)有對(duì)應(yīng)的ROS2源鏡像不過(guò)官方源穩(wěn)定性優(yōu)先建議先按官方路徑來(lái)。添加ROS2 apt倉(cāng)庫(kù)的公鑰sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg這里有一個(gè)高頻報(bào)錯(cuò)點(diǎn)raw.githubusercontent.com在國(guó)內(nèi)訪問(wèn)不穩(wěn)定經(jīng)常超時(shí)或者斷流導(dǎo)致下載下來(lái)的ros.key文件是空的或者不完整后面執(zhí)行apt update的時(shí)候就會(huì)報(bào)公鑰錯(cuò)誤。如果出現(xiàn)這種情況多試幾次或者換一個(gè)能正常訪問(wèn)該文件的網(wǎng)絡(luò)環(huán)境。我當(dāng)時(shí)就遇到了三次超時(shí)第四次才成功文件大小正常是幾千字節(jié)如果下載下來(lái)只有幾百字節(jié)甚至0字節(jié)刪掉重新下載。公鑰下載好之后添加源列表。注意archarm64這個(gè)參數(shù)保證apt只搜索arm64架構(gòu)的包echo deb [archarm64 signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu jammy main | sudo tee /etc/apt/sources.list.d/ros2.list執(zhí)行完成后刷新源sudo apt update如果看到packages.ros.org的源正常加載說(shuō)明ROS2源已經(jīng)就位。3.3 選對(duì)安裝包desktop版還是base版ROS2 Humble官方提供兩種安裝方式ros-humble-desktop和ros-humble-ros-base。前者包含機(jī)器人開(kāi)發(fā)常用的GUI工具、仿真相關(guān)組件、可視化工具rviz2、demo例程等體積大、依賴多后者只包含通信、消息、基礎(chǔ)庫(kù)這些核心模塊體積小很多。在ARM開(kāi)發(fā)板上怎么選我的建議是分兩種情況。如果板子是樹(shù)莓派4B或者更低配置內(nèi)存4GB以下、沒(méi)有獨(dú)立GPU硬上desktop版純屬折磨自己rviz2都帶不動(dòng)老老實(shí)實(shí)裝ros-base然后在需要的時(shí)候再單獨(dú)安裝個(gè)別工具包。如果板子是RK3588、Jetson Orin這類(lèi)性能不錯(cuò)的平臺(tái)內(nèi)存8GB以上可以裝desktop版但也要有心理準(zhǔn)備rviz2能跑但別指望太流暢。我這次在RK3588板子上選擇的是ros-base加按需安裝的方式。用ros-base打底加裝rviz2、demo_nodes_cpp、turtlesim這些必要的演示和調(diào)試工具比全量desktop版省了將近1GB的磁盤(pán)空間。執(zhí)行安裝sudo apt install -y ros-humble-ros-base如果確定要完整版sudo apt install -y ros-humble-desktop安裝過(guò)程長(zhǎng)不長(zhǎng)取決于板子和網(wǎng)絡(luò)。我實(shí)測(cè)在RK3588上裝ros-base大約需要10分鐘desktop版大約需要20到30分鐘。如果中途出現(xiàn)斷網(wǎng)導(dǎo)致apt安裝中斷執(zhí)行sudo apt --fix-broken install修復(fù)一下再重新裝。3.4 初始化rosdep和環(huán)境變量rosdep是ROS2用來(lái)解析和管理依賴包的工具很多從源碼編譯的功能包在編譯前都會(huì)調(diào)用rosdep install來(lái)檢查依賴。所以這一步雖然不會(huì)影響ROS2本身跑demo但后續(xù)要編譯自己的功能包時(shí)必須用到。安裝rosdepsudo apt install -y python3-rosdep sudo rosdep init rosdep update這里踩坑率極高。sudo rosdep init需要訪問(wèn)raw.githubusercontent.com上的rosdistro文件網(wǎng)絡(luò)不通的情況下會(huì)直接卡住或者報(bào)錯(cuò)。我碰到的錯(cuò)誤信息大致是ERROR: cannot download from ...。如果遇到這種情況有幾個(gè)思路可以嘗試但總體原則是確保能夠訪問(wèn)到這個(gè)文件。當(dāng)時(shí)我是在網(wǎng)絡(luò)狀態(tài)比較好的環(huán)境里先把整個(gè)rosdistro倉(cāng)庫(kù)的關(guān)鍵文件下載到本地再用本地文件路徑來(lái)初始化rosdep。官方文檔也有類(lèi)似的操作說(shuō)明但流程比較繁瑣。對(duì)多數(shù)人來(lái)說(shuō)更實(shí)際的辦法是直接調(diào)整hosts文件把相關(guān)域名的解析指到可訪問(wèn)的IP。不過(guò)這個(gè)做法需要你自己確認(rèn)IP有效性不同網(wǎng)絡(luò)環(huán)境下結(jié)果可能不一樣??紤]到ROS2官方文檔的安裝指引可能會(huì)更新如果rosdep init一直失敗最省事的方案是暫時(shí)跳過(guò)rosdep初始化先把ROS2環(huán)境跑起來(lái)。因?yàn)閞os-base和desktop包安裝完核心功能已經(jīng)完全可用了rosdep只是在源碼編譯時(shí)才必須后續(xù)等網(wǎng)絡(luò)條件好了再回來(lái)補(bǔ)。環(huán)境變量這一步很關(guān)鍵每次打開(kāi)新的終端都執(zhí)行一遍會(huì)覺(jué)得煩所以直接寫(xiě)入.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc echo export ROS_DOMAIN_ID1 ~/.bashrc source ~/.bashrcROS_DOMAIN_ID的取值范圍是0到101它是用來(lái)隔離同一網(wǎng)絡(luò)里多組ROS2設(shè)備的通信域。如果你在做多機(jī)通信不同機(jī)器人要設(shè)置不同的domain ID否則發(fā)出來(lái)的話題會(huì)互相干擾。單機(jī)調(diào)試用默認(rèn)的0就行但為了以后擴(kuò)展方便我習(xí)慣顯式設(shè)置。再安裝兩個(gè)常用工具編譯工作空間和命令行自動(dòng)補(bǔ)全sudo apt install -y python3-colcon-common-extensions python3-argcomplete安裝argcomplete之后記得執(zhí)行sudo activate-global-python-argcomplete這樣按Tab鍵自動(dòng)補(bǔ)全就能生效操作效率會(huì)高很多。驗(yàn)證基礎(chǔ)環(huán)境是否正常開(kāi)兩個(gè)終端一個(gè)跑talker一個(gè)跑listener# 終端1 ros2 run demo_nodes_cpp talker # 終端2 ros2 run demo_nodes_cpp listener如果listener終端不斷打印I heard: [Hello World: ...]說(shuō)明ROS2的核心通信鏈路已經(jīng)打通整個(gè)環(huán)境基本可用了。4. 讓ROS2跑得穩(wěn)的環(huán)境細(xì)節(jié)4.1 補(bǔ)充開(kāi)發(fā)工具colcon和VCS編譯ROS2工作空間用的主要工具就是colcon。在ARM板子上用colcon編譯功能包時(shí)如果包比較多建議限制并行編譯任務(wù)數(shù)不然內(nèi)存不夠會(huì)導(dǎo)致編譯器被系統(tǒng)殺死。比如編譯時(shí)用colcon build --parallel-workers 2這是平時(shí)不太會(huì)注意但很實(shí)用的參數(shù)。在8GB內(nèi)存的板子上開(kāi)默認(rèn)的并行任務(wù)編譯一些大包時(shí)內(nèi)存輕松沖到6GB以上隨時(shí)可能卡死。限制成兩個(gè)worker之后編譯時(shí)間稍微長(zhǎng)一點(diǎn)但穩(wěn)定性提升很明顯。除了colconvcs工具也建議裝它用來(lái)管理多個(gè)Git倉(cāng)庫(kù)的代碼版本很多從GitHub上拉取的ROS2功能包都通過(guò).repos文件來(lái)批量下載sudo apt install -y python3-vcstool有了vcs后續(xù)想把Navigation2、Cartographer這些功能包源碼拉到工作空間一條命令就能搞定不用一個(gè)個(gè)Git clone。4.2 DDS選型與多機(jī)通信的坑ROS2架構(gòu)中DDS負(fù)責(zé)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸。Humble默認(rèn)使用Fast DDS在x86桌面環(huán)境下跑沒(méi)有問(wèn)題但在ARM板上Fast DDS的內(nèi)存占用偏高。如果板子內(nèi)存只有4GB跑個(gè)導(dǎo)航加視覺(jué)識(shí)別Fast DDS很容易把內(nèi)存吃滿然后節(jié)點(diǎn)莫名僵死。一個(gè)很有效的優(yōu)化方案是把RMW實(shí)現(xiàn)切換為Cyclone DDS。Cyclone DDS在嵌入式設(shè)備上的內(nèi)存占用明顯低于Fast DDS而且對(duì)多機(jī)通信的兼容性也不錯(cuò)。切換方式sudo apt install -y ros-humble-rmw-cyclonedds-cpp echo export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp ~/.bashrc source ~/.bashrc切換之后再跑ros2 run demo_nodes_cpp talker用htop看一下進(jìn)程內(nèi)存實(shí)測(cè)從Fast DDS的100MB多降到Cyclone DDS的40MB左右。對(duì)于運(yùn)行多個(gè)節(jié)點(diǎn)的ARM板來(lái)說(shuō)這個(gè)優(yōu)化效果非常明顯強(qiáng)烈推薦。多機(jī)通信方面不同ROS2設(shè)備要能互相發(fā)現(xiàn)和通信需要滿足三個(gè)條件同一個(gè)網(wǎng)段、同一個(gè)ROS_DOMAIN_ID、防火墻開(kāi)放DDS組播端口。很多人在多機(jī)模式下發(fā)現(xiàn)節(jié)點(diǎn)互相發(fā)現(xiàn)不了先檢查這三項(xiàng)大概率就是某一項(xiàng)沒(méi)滿足。尤其注意板子的防火墻UFW默認(rèn)開(kāi)啟的情況下需要用sudo ufw allow 7401/udp之類(lèi)的命令放行DDS使用的端口段才能正常組網(wǎng)通信。4.3 rviz2和可視化工具在ARM板上的取舍ROS生態(tài)里最常用的可視化工具是rviz2但桌面版在ARM開(kāi)發(fā)板上的渲染性能確實(shí)一般。RK3588有GPU結(jié)合硬件加速勉強(qiáng)能跑樹(shù)莓派4B上開(kāi)rviz2基本就是PPT效果旋轉(zhuǎn)視角一卡一卡的。如果不是必須在板子上直接看可視化界面我推薦的方案是把可視化放到電腦端。板子上只跑ROS2的節(jié)點(diǎn)通過(guò)局域網(wǎng)把話題數(shù)據(jù)共享給電腦電腦上用rviz2連接查看。這樣板子性能全用在節(jié)點(diǎn)計(jì)算上可視化交給電腦體驗(yàn)好很多。具體操作很簡(jiǎn)單板子上正常設(shè)置ROS_DOMAIN_ID和DDS類(lèi)型電腦端安裝相同版本的ROS2設(shè)置相同的domain ID然后在電腦上直接運(yùn)行rviz2選擇要顯示的topic即可。如果跨網(wǎng)段就需要配置DDS的發(fā)現(xiàn)服務(wù)不過(guò)家用路由器場(chǎng)景下同一網(wǎng)段就夠了不需要額外配置。如果板子上確實(shí)需要輕量化可視化可以試試Foxglove Studioweb版或者Webviz這兩個(gè)工具通過(guò)瀏覽器展示板子上跑一個(gè)輕量服務(wù)電腦瀏覽器訪問(wèn)也能看話題數(shù)據(jù)和服務(wù)狀態(tài)。我在調(diào)導(dǎo)航時(shí)用過(guò)Foxglove流暢度比板載rviz2好很多適合資源緊張的場(chǎng)景。5. 高頻報(bào)錯(cuò)排查速查表5.1 apt源相關(guān)的報(bào)錯(cuò)和處理ARM板上換源后最容易遇到的報(bào)錯(cuò)是404 Not Found [IP: ...]。這個(gè)報(bào)錯(cuò)基本可以判定是源地址寫(xiě)錯(cuò)了。對(duì)照一下aaarch64架構(gòu)一定要用ubuntu-ports路徑千萬(wàn)不要用/ubuntu/另外確認(rèn)系統(tǒng)版本號(hào)是jammy如果你用的是Ubuntu 22.04但源里寫(xiě)成focal同樣會(huì)404。還常見(jiàn)一個(gè)問(wèn)題更新源時(shí)提示The following signatures couldnt be verified because the public key is not available。這是公鑰問(wèn)題一般來(lái)說(shuō)重新獲取ROS2的ros.key文件可以解決注意獲取后確認(rèn)文件大小正常然后執(zhí)行sudo apt update。如果還是報(bào)錯(cuò)手動(dòng)檢查/etc/apt/sources.list.d/ros2.list文件里的signed-by路徑是否和實(shí)際存放公鑰的位置一致。另一個(gè)坑是apt源更新后沒(méi)生效檢查有沒(méi)有多個(gè)源文件沖突。如果你之前手動(dòng)創(chuàng)建過(guò)/etc/apt/sources.list的文件并且里面寫(xiě)了舊源同時(shí)/etc/apt/sources.list.d/ubuntu.sources又是新寫(xiě)的apt會(huì)混著兩個(gè)文件一起用容易出問(wèn)題。建議只保留一個(gè)活躍的源配置文件。5.2 安裝ROS2過(guò)程中的常見(jiàn)障礙安裝ros2包時(shí)提示Unable to locate package ros-humble-ros-base先確認(rèn)是否執(zhí)行過(guò)sudo apt update然后確認(rèn)源列表里是否已經(jīng)有packages.ros.org的源記錄??梢栽?etc/apt/sources.list.d/下用ls看有沒(méi)有ros2.list文件沒(méi)有的話回到前文添加源的步驟。安裝時(shí)提示某個(gè)依賴包version not found可能是阿里云源和ROS2源的更新不同步導(dǎo)致的一般執(zhí)行sudo apt full-upgrade把系統(tǒng)包全部升級(jí)到最新再重試可以解決。還有一種情況是安裝到一半中斷apt鎖被占用。解決方法是殺掉apt進(jìn)程然后執(zhí)行sudo rm /var/lib/dpkg/lock-frontend sudo dpkg --configure -a sudo apt --fix-broken install強(qiáng)制解鎖之后重新執(zhí)行安裝命令。5.3 rosdep初始化和運(yùn)行時(shí)問(wèn)題排查rosdep初始化失敗基本集中在網(wǎng)絡(luò)訪問(wèn)問(wèn)題上。查詢r(jià)osdep狀態(tài)rosdep check --include-eol-distros如果卡在update階段可以先跳過(guò)。真正需要rosdep的時(shí)候是編譯功能包之前到時(shí)網(wǎng)絡(luò)條件允許再執(zhí)行也一樣。另外rosdep安裝python包時(shí)如果提示pip源慢可以臨時(shí)切換pip源pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/節(jié)點(diǎn)運(yùn)行不起來(lái)ros2 run之后一直卡住或者報(bào)段錯(cuò)誤排查思路先分三步第一步確認(rèn)兩個(gè)終端的ROS_DOMAIN_ID一致第二步確認(rèn)RMW類(lèi)型一致板子和電腦通信時(shí)必須用同一個(gè)DDS后端比如都切到Cyclone DDS第三步檢查共享內(nèi)存某些DDS需要在/dev/shm下有足夠空間ARM板上默認(rèn)共享內(nèi)存只有系統(tǒng)內(nèi)存的一半如果內(nèi)存吃緊可以嘗試重啟板子清理這些臨時(shí)文件。我在實(shí)際調(diào)試中還遇到過(guò)一次很隱蔽的問(wèn)題板子的TF卡使用時(shí)間長(zhǎng)了導(dǎo)致I/O性能?chē)?yán)重下降同一塊板子同樣的安裝流程TF卡上跑ros2 run明顯卡頓換到NVMe硬盤(pán)或者新卡之后流暢了很多。所以如果板子突然變卡可以先查iostat和dmesg看I/O有沒(méi)有異常。ARM開(kāi)發(fā)板的外部存儲(chǔ)性能和穩(wěn)定性確實(shí)會(huì)影響ROS2這種實(shí)時(shí)性要求較高的系統(tǒng)。5.4 性能不夠時(shí)還能做什么如果你在ARM板上跑ROS2感覺(jué)內(nèi)存和CPU都不夠用優(yōu)先切換Cyclone DDS然后盡量減少不必要的節(jié)點(diǎn)數(shù)量盡量合并節(jié)點(diǎn)功能減少大量小消息的發(fā)布頻率。編譯優(yōu)化上使用colcon build時(shí)加--cmake-args -DCMAKE_BUILD_TYPERelease可以提升編譯后程序的運(yùn)行效率。另外對(duì)于導(dǎo)航和建圖這類(lèi)計(jì)算密集的任務(wù)可以考慮使用板子上的NPU或者GPU做一些感知加速但這就超出安裝范疇了后續(xù)如果有精力可以單獨(dú)寫(xiě)一篇在RK3588上做ROS2感知加速的實(shí)踐。還有一個(gè)小技巧是給系統(tǒng)增加swap空間。ARM板物理內(nèi)存不夠時(shí)swap能兜底防止OOM殺進(jìn)程。創(chuàng)建一個(gè)4GB的swap文件sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile注意swap文件不要放在TF卡這種閃存介質(zhì)上磨損嚴(yán)重而且讀寫(xiě)性能不夠。有條件的情況下優(yōu)先放在NVMe或者SSD上。如果板子只有TF卡swap只做兜底用不要把它當(dāng)成常規(guī)擴(kuò)容方案。這個(gè)環(huán)境我在實(shí)際跑Navigation2和Cartographer的時(shí)候已經(jīng)驗(yàn)證過(guò)穩(wěn)定性板子上掛了四個(gè)節(jié)點(diǎn)加一個(gè)底盤(pán)驅(qū)動(dòng)CPU占用在60%左右內(nèi)存占用控制在2GB以內(nèi)切換Cyclone DDS之后。后續(xù)準(zhǔn)備繼續(xù)在這塊板子上做激光雷達(dá)建圖和自主導(dǎo)航的適配測(cè)試到時(shí)候有新的坑再來(lái)繼續(xù)更新。ARM開(kāi)發(fā)板玩ROS2雖然起步階段折騰但只要能熬過(guò)換源、裝環(huán)境、調(diào)DDS這幾道坎后面會(huì)越來(lái)越順。