戰(zhàn):從基礎(chǔ)原理到邊緣計(jì)算調(diào)試技巧)
1. 項(xiàng)目概述與學(xué)習(xí)路徑最近在Jetson Nano上折騰ROS環(huán)境是Ubuntu 18.04跟著趙虛左老師的《ROS理論與實(shí)踐》課程一步步走。剛啃完第五章講的是ROS的常用命令。說實(shí)話這一章內(nèi)容看著基礎(chǔ)但真是“地基不牢地動(dòng)山搖”。很多新手包括我自己剛開始都覺得命令嘛記記就行結(jié)果真到用的時(shí)候各種路徑找不到、話題發(fā)不出、服務(wù)調(diào)不通問題全出在這些基礎(chǔ)命令的理解和熟練度上。Jetson Nano作為邊緣計(jì)算設(shè)備跑ROS有其特殊性資源有限網(wǎng)絡(luò)環(huán)境也可能和x86主機(jī)不同命令的實(shí)操和結(jié)果反饋有時(shí)會(huì)有點(diǎn)“小脾氣”。這篇記錄我就結(jié)合在Nano上的實(shí)際踩坑經(jīng)驗(yàn)把ROS常用命令掰開揉碎了講不止是羅列命令更會(huì)重點(diǎn)說清楚每個(gè)命令在Nano這種ARM平臺(tái)上的行為特點(diǎn)、常見的使用場(chǎng)景以及那些教程里不會(huì)提但實(shí)際開發(fā)中天天遇到的“潛規(guī)則”和排查技巧。2. ROS命令體系核心思想與在Jetson Nano上的特殊性2.1 ROS命令的設(shè)計(jì)哲學(xué)節(jié)點(diǎn)、話題、服務(wù)、參數(shù)ROS的命令行工具不是憑空設(shè)計(jì)出來的它完全服務(wù)于ROS的核心計(jì)算圖概念。理解了這個(gè)你記命令就不是死記硬背而是有邏輯可循。ROS把整個(gè)系統(tǒng)抽象成一個(gè)由節(jié)點(diǎn)Node、話題Topic、服務(wù)Service、參數(shù)Parameter等構(gòu)成的圖。命令行工具就是用來探查和與這個(gè)圖交互的“眼睛”和“手”。在Jetson Nano上這個(gè)“圖”的交互有一些細(xì)微差別。首先Nano的算力有限當(dāng)你用rosnode或rostopic命令頻繁查詢時(shí)如果同時(shí)有節(jié)點(diǎn)在大量發(fā)布消息可能會(huì)感到明顯的延遲這不是命令問題是系統(tǒng)負(fù)載的直觀體現(xiàn)。其次Nano常用于多機(jī)協(xié)同你的ROS Master可能不在本機(jī)。這時(shí)所有命令都需要正確設(shè)置ROS_MASTER_URI環(huán)境變量否則你會(huì)發(fā)現(xiàn)自己像在對(duì)著空氣喊話什么節(jié)點(diǎn)都看不到。這是一個(gè)非常關(guān)鍵的預(yù)備動(dòng)作。注意在Jetson Nano上進(jìn)行任何ROS命令操作前第一件事是確認(rèn)終端里已經(jīng)執(zhí)行了source /opt/ros/melodic/setup.bash以Melodic為例以及正確設(shè)置了ROS_MASTER_URI和ROS_HOSTNAME。多機(jī)環(huán)境下ROS_HOSTNAME最好設(shè)置為Nano可被其他機(jī)器訪問的IP地址而不是localhost。2.2 基礎(chǔ)中的基礎(chǔ)roscore與環(huán)境檢查roscore是ROS系統(tǒng)的總開關(guān)它啟動(dòng)了Master、Parameter Server和rosout日志節(jié)點(diǎn)。在Nano上由于資源緊張通常一個(gè)終端運(yùn)行roscore其他終端進(jìn)行開發(fā)。這里有個(gè)小技巧你可以用screen或tmux會(huì)話工具來管理避免開太多終端窗口。啟動(dòng)后如何確認(rèn)一切正常光看輸出不夠。我會(huì)用一組組合拳來檢查ping一下ROS_MASTER_URI里的主機(jī)名或IP確保網(wǎng)絡(luò)連通。使用rostopic list即使還沒有其他節(jié)點(diǎn)你也應(yīng)該能看到/rosout和/rosout_agg這兩個(gè)由roscore創(chuàng)建的系統(tǒng)話題。如果看不到百分之九十九是環(huán)境變量設(shè)置有問題。用rosparam list看看參數(shù)服務(wù)器應(yīng)該能看到/rosdistro、/rosversion等基礎(chǔ)參數(shù)。在Nano上如果發(fā)現(xiàn)roscore啟動(dòng)特別慢或者rostopic list命令響應(yīng)遲緩可以htop一下看看CPU和內(nèi)存占用有時(shí)候是其他后臺(tái)進(jìn)程在搶資源。3. 節(jié)點(diǎn)Node管理命令深度解析節(jié)點(diǎn)是執(zhí)行具體計(jì)算的進(jìn)程。管理節(jié)點(diǎn)主要靠rosnode家族命令。3.1 探查節(jié)點(diǎn)狀態(tài)rosnode list與rosnode inforosnode list是最常用的命令列出所有已向Master注冊(cè)的節(jié)點(diǎn)。在Nano上開發(fā)經(jīng)常需要確認(rèn)自己寫的節(jié)點(diǎn)是否成功啟動(dòng)了。這里有個(gè)坑有時(shí)候節(jié)點(diǎn)啟動(dòng)腳本有錯(cuò)誤進(jìn)程雖然運(yùn)行了但并沒有成功連接到Master所以在list里就看不到。此時(shí)需要用ps aux | grep your_node_name檢查進(jìn)程是否存在再結(jié)合節(jié)點(diǎn)的日志輸出通常會(huì)在啟動(dòng)它的終端里來排查。查到節(jié)點(diǎn)名后rosnode info /node_name就是你的“體檢報(bào)告”。它會(huì)詳細(xì)列出Publications發(fā)布的話題這個(gè)節(jié)點(diǎn)向哪些話題發(fā)送數(shù)據(jù)。Subscriptions訂閱的話題這個(gè)節(jié)點(diǎn)從哪些話題接收數(shù)據(jù)。Services提供的服務(wù)這個(gè)節(jié)點(diǎn)能響應(yīng)哪些服務(wù)請(qǐng)求。Connections連接信息列出與它通信的其他節(jié)點(diǎn)和話題這是調(diào)試通信鏈路是否連通的關(guān)鍵。在資源受限的Nano上如果一個(gè)節(jié)點(diǎn)info信息特別多比如發(fā)布/訂閱了大量話題可能意味著設(shè)計(jì)上可以優(yōu)化比如合并一些消息類型。3.2 節(jié)點(diǎn)生命周期管理rosnode kill與rosnode cleanuprosnode kill /node_name用于終止節(jié)點(diǎn)。但要注意它發(fā)送的是軟件終止信號(hào)如果節(jié)點(diǎn)代碼沒有正確處理SIGINT可能會(huì)變成“僵尸進(jìn)程”占用端口。在Nano上更粗暴但有效的方法是找到進(jìn)程IDPID用kill -9 PID。不過優(yōu)先還是用rosnode kill。rosnode cleanup是個(gè)清理命令。當(dāng)節(jié)點(diǎn)異常退出比如直接CtrlC或者崩潰Master可能還殘留著它的注冊(cè)信息。這時(shí)你用rosnode list可能會(huì)看到“死節(jié)點(diǎn)”用cleanup可以清理這些無效注冊(cè)。在Nano頻繁調(diào)試、重啟節(jié)點(diǎn)的場(chǎng)景下這個(gè)命令很常用。3.3 實(shí)操心得節(jié)點(diǎn)命令的調(diào)試組合拳當(dāng)我寫的一個(gè)節(jié)點(diǎn)在Nano上運(yùn)行后在rosnode list里卻找不到時(shí)我的排查步驟是檢查環(huán)境確認(rèn)執(zhí)行節(jié)點(diǎn)的終端echo $ROS_MASTER_URI是否正確。檢查啟動(dòng)輸出看節(jié)點(diǎn)啟動(dòng)時(shí)的日志有沒有報(bào)連接Master失敗的錯(cuò)誤。檢查網(wǎng)絡(luò)如果是多機(jī)ping一下Master主機(jī)。檢查節(jié)點(diǎn)代碼確認(rèn)代碼中ros::init的參數(shù)是否正確特別是節(jié)點(diǎn)名是否唯一。使用rosnode ping這是一個(gè)不太常用但好用的命令rosnode ping /node_name可以測(cè)試到指定節(jié)點(diǎn)的網(wǎng)絡(luò)連通性。4. 話題Topic工具鏈實(shí)戰(zhàn)詳解話題是節(jié)點(diǎn)間異步通信的管道。rostopic命令是觀察和數(shù)據(jù)注入的主要工具。4.1 監(jiān)聽與觀察rostopic list、rostopic echo、rostopic hzrostopic list列出所有活躍話題。配合-v參數(shù)verbose可以列出每個(gè)話題的詳細(xì)類型這對(duì)于理解系統(tǒng)數(shù)據(jù)流非常有幫助。rostopic echo /topic_name是實(shí)時(shí)顯示話題上流動(dòng)的數(shù)據(jù)。這是調(diào)試的“眼睛”。在Nano上如果話題數(shù)據(jù)量很大比如圖像消息直接echo到終端會(huì)瞬間刷屏并可能拖慢系統(tǒng)。這時(shí)候有幾種策略使用rostopic echo /topic_name | head -n 20只看前幾行。在代碼里訂閱并選擇性打印或者用rqt_console、rqt_plot等圖形化工具。使用rostopic echo -n 1 /topic_name只顯示一條消息就退出用于檢查消息結(jié)構(gòu)。rostopic hz /topic_name測(cè)量話題的發(fā)布頻率。在機(jī)器人控制中頻率是否穩(wěn)定至關(guān)重要。在Nano上跑SLAM或視覺處理如果發(fā)現(xiàn)hz值遠(yuǎn)低于預(yù)期比如發(fā)布攝像頭圖像的節(jié)點(diǎn)標(biāo)稱30Hz實(shí)測(cè)只有10Hz那就要考慮是不是圖像處理算法太耗資源或者有其他的CPU瓶頸。4.2 數(shù)據(jù)發(fā)布與深入分析rostopic pub與rostopic type/inforostopic pub是一個(gè)強(qiáng)大的工具可以手動(dòng)向任何話題發(fā)布數(shù)據(jù)。格式是rostopic pub /topic_name msg_type data。單次發(fā)布可以加-r 10參數(shù)以10Hz頻率持續(xù)發(fā)布。這在測(cè)試其他節(jié)點(diǎn)的訂閱功能時(shí)極其有用。例如你可以手動(dòng)發(fā)布一個(gè)速度指令/cmd_vel來測(cè)試機(jī)器人的底盤是否正常響應(yīng)。但手動(dòng)構(gòu)造復(fù)雜的消息數(shù)據(jù)很麻煩。這里有個(gè)高級(jí)技巧結(jié)合rostopic echo和rostopic pub。先讓目標(biāo)節(jié)點(diǎn)發(fā)布一條標(biāo)準(zhǔn)消息到話題A用rostopic echo /topic_A看到完整的數(shù)據(jù)結(jié)構(gòu)。復(fù)制這條消息的輸出YAML格式。在rostopic pub命令中使用-f參數(shù)從文件讀取。你可以把復(fù)制的數(shù)據(jù)存成data.yaml然后rostopic pub /topic_B msg_type -f data.yaml。這樣就實(shí)現(xiàn)了消息的“錄制與重放”對(duì)于測(cè)試非常高效。rostopic type /topic_name可以查看話題的消息類型。知道了類型就可以用rosmsg show msg_type來查看這個(gè)消息類型的詳細(xì)結(jié)構(gòu)有哪些字段每個(gè)字段是什么類型。這是理解系統(tǒng)數(shù)據(jù)接口的必備步驟。4.3 帶寬與診斷rostopic bw與rqt_graphrostopic bw /topic_name顯示話題占用的網(wǎng)絡(luò)帶寬。在Nano這種邊緣設(shè)備上如果同時(shí)跑多個(gè)傳感器攝像頭、激光雷達(dá)帶寬可能成為瓶頸。用bw命令可以監(jiān)控關(guān)鍵數(shù)據(jù)流比如/camera/image_raw的帶寬如果發(fā)現(xiàn)異常高可能需要考慮降低圖像分辨率、啟用壓縮image_transport或檢查是否有節(jié)點(diǎn)在重復(fù)發(fā)布相同數(shù)據(jù)。最后所有rostopic命令看到的都是局部。要看清全局的數(shù)據(jù)流拓?fù)湟欢ㄒ胷qt_graph。這是一個(gè)圖形化工具能直觀展示所有節(jié)點(diǎn)、話題之間的訂閱發(fā)布關(guān)系。在復(fù)雜的項(xiàng)目中它幫你一眼看出數(shù)據(jù)是否按預(yù)期流動(dòng)有沒有哪個(gè)話題無人訂閱數(shù)據(jù)黑洞或者哪個(gè)節(jié)點(diǎn)訂閱了錯(cuò)誤的話題。5. 服務(wù)Service與參數(shù)Parameter操作指南5.1 服務(wù)調(diào)用與探查rosservice list、call、type、info服務(wù)是同步的請(qǐng)求-響應(yīng)通信機(jī)制。rosservice list列出所有可用服務(wù)。例如/gazebo/reset_world是Gazebo仿真器的重置服務(wù)。rosservice call /service_name args是調(diào)用服務(wù)。調(diào)用前你必須知道服務(wù)需要的參數(shù)格式。這就需要rosservice type /service_name先查類型再用rossrv show service_type查看具體的請(qǐng)求Request和響應(yīng)Response數(shù)據(jù)結(jié)構(gòu)。例如調(diào)用/spawn_model在Gazebo中生成一個(gè)模型其參數(shù)非常復(fù)雜通常需要先準(zhǔn)備好一個(gè)URDF或SDF文件的路徑以及模型初始位姿等參數(shù)。在Nano上調(diào)用一些計(jì)算密集型服務(wù)如路徑規(guī)劃時(shí)可能會(huì)遇到超時(shí)。這時(shí)可以嘗試在調(diào)用命令中增加超時(shí)時(shí)間如果服務(wù)客戶端支持或者檢查服務(wù)提供節(jié)點(diǎn)的CPU使用率。5.2 參數(shù)服務(wù)器操作rosparam家族命令參數(shù)服務(wù)器是一個(gè)全局字典用于存儲(chǔ)配置參數(shù)。rosparam命令用于操作它。rosparam list列出所有參數(shù)。rosparam get /parameter_name獲取參數(shù)值。rosparam set /parameter_name value設(shè)置參數(shù)值。這是一個(gè)需要謹(jǐn)慎的操作因?yàn)樗鼤?huì)立即影響所有使用該參數(shù)的節(jié)點(diǎn)。在Nano上調(diào)試時(shí)我經(jīng)常用它動(dòng)態(tài)調(diào)整PID參數(shù)、速度限制等比重新編譯啟動(dòng)節(jié)點(diǎn)快得多。rosparam dump file.yaml將全部參數(shù)保存到Y(jié)AML文件。rosparam load file.yaml從YAML文件加載參數(shù)。這是最佳實(shí)踐把你的機(jī)器人所有配置控制器參數(shù)、傳感器標(biāo)定參數(shù)、導(dǎo)航參數(shù)都通過一個(gè)YAML文件來管理版本清晰部署方便。啟動(dòng)節(jié)點(diǎn)時(shí)在launch文件中用rosparam commandload file$(find your_pkg)/config/params.yaml /加載。在Nano上如果參數(shù)很多很復(fù)雜直接rosparam get /會(huì)輸出一大堆。建議用rosparam dump導(dǎo)出到文件查看或者用rqt_reconfigure圖形化工具進(jìn)行動(dòng)態(tài)調(diào)整它更友好而且能顯示參數(shù)描述和取值范圍。6. 功能包Package與文件系統(tǒng)操作6.1 導(dǎo)航與查找roscd、rosls、rospack findROS功能包分散在ROS_PACKAGE_PATH指定的多個(gè)路徑中比如你的工作空間~/catkin_ws/src和系統(tǒng)路徑/opt/ros/melodic/share。roscd package_name可以直接跳轉(zhuǎn)到功能包的目錄這比手動(dòng)查找快無數(shù)倍。rosls package_name則列出包內(nèi)文件。rospack find package_name是roscd的基礎(chǔ)它返回包的完整路徑。當(dāng)你的自定義包和系統(tǒng)包重名時(shí)roscd可能會(huì)跳轉(zhuǎn)到系統(tǒng)包而rospack find可以幫你確認(rèn)到底找到了哪一個(gè)。在Jetson Nano上由于是ARM架構(gòu)有些x86上的預(yù)編譯包可能沒有。當(dāng)你rospack find一個(gè)包失敗時(shí)很可能需要自己從源碼編譯。這時(shí)就需要用到rosdep工具來安裝系統(tǒng)依賴。6.2 依賴管理與編譯rosdep與catkin_makerosdep是一個(gè)管理ROS包系統(tǒng)依賴的工具。在新環(huán)境比如剛刷好系統(tǒng)的Nano或克隆了一個(gè)新包后需要運(yùn)行rosdep install --from-paths src --ignore-src -r -y來安裝所有缺失的依賴。在Nano的ARM平臺(tái)上這個(gè)過程可能會(huì)遇到一些依賴包沒有ARM版本的情況需要尋找替代方案或從源碼編譯這些依賴這是Nano上玩ROS的一個(gè)主要挑戰(zhàn)。編譯命令catkin_make大家都很熟悉。在Nano上由于CPU核心少4核編譯大項(xiàng)目如帶有OpenCV、PCL的視覺SLAM包會(huì)非常慢。我的經(jīng)驗(yàn)是使用catkin_make -j2或-j3不要用-j4占滿所有核心否則系統(tǒng)會(huì)卡死無法操作。如果只是修改了其中一個(gè)包可以用catkin_make --pkg your_package_name只編譯特定的包節(jié)省大量時(shí)間。確保Nano散熱良好編譯時(shí)CPU溫度飆升會(huì)導(dǎo)致降頻反而更慢。7. 綜合實(shí)戰(zhàn)與高級(jí)調(diào)試技巧7.1 使用roslaunch啟動(dòng)復(fù)雜系統(tǒng)roslaunch不僅僅是啟動(dòng)一個(gè)節(jié)點(diǎn)它可以啟動(dòng)多個(gè)節(jié)點(diǎn)、設(shè)置參數(shù)、加載配置、配置命名空間。在Nano上部署機(jī)器人應(yīng)用最終一定會(huì)用到launch文件。一個(gè)常見的launch文件結(jié)構(gòu)包括啟動(dòng)底盤驅(qū)動(dòng)節(jié)點(diǎn)、激光雷達(dá)節(jié)點(diǎn)、攝像頭節(jié)點(diǎn)、以及SLAM或?qū)Ш焦?jié)點(diǎn)。在launch文件中你可以用param標(biāo)簽設(shè)置參數(shù)用rosparam加載YAML文件用arg定義可傳入的參數(shù)使得部署變得靈活。在Nano上運(yùn)行大型launch文件時(shí)建議通過top或htop監(jiān)控資源。如果內(nèi)存吃緊可以考慮將一些節(jié)點(diǎn)如點(diǎn)云處理的算法參數(shù)調(diào)低或者使用roslaunch的respawn和required屬性來管理節(jié)點(diǎn)崩潰后的行為。7.2 記錄與回放數(shù)據(jù)rosbag的使用rosbag是ROS的“黑匣子”可以錄制和回放話題數(shù)據(jù)。在Nano上進(jìn)行算法測(cè)試和調(diào)試時(shí)極其有用。錄制rosbag record -O my_bag.bag /topic1 /topic2 ...。在Nano上錄制數(shù)據(jù)尤其是圖像和點(diǎn)云會(huì)迅速產(chǎn)生巨大的bag文件可能撐滿SD卡。建議只錄制必要的話題并使用-b 1024單位MB等參數(shù)限制單個(gè)bag文件的大小自動(dòng)分卷?;胤舝osbag play my_bag.bag?;胤艜r(shí)可以-r 2以2倍速播放-l循環(huán)播放?;胤诺谋举|(zhì)是rosbag作為一個(gè)節(jié)點(diǎn)向指定話題重新發(fā)布錄制時(shí)的數(shù)據(jù)。這意味著你可以用真實(shí)傳感器錄制的數(shù)據(jù)在辦公室反復(fù)測(cè)試你的算法而不用每次都把機(jī)器人搬出來。信息查看rosbag info my_bag.bag可以查看bag文件里包含了哪些話題、消息數(shù)量、持續(xù)時(shí)間等信息。在Nano上回放高頻率、大數(shù)據(jù)量的bag文件時(shí)可能會(huì)因?yàn)榇疟P讀寫速度特別是使用低速SD卡時(shí)跟不上而導(dǎo)致消息發(fā)布延遲。如果發(fā)現(xiàn)回放時(shí)系統(tǒng)表現(xiàn)和實(shí)時(shí)錄制時(shí)有差異需要考慮將bag文件放在Nano的SSD硬盤如果有或高速TF卡上或者對(duì)bag文件進(jìn)行壓縮。7.3 圖形化工具rqt套件ROS的命令行強(qiáng)大但圖形化工具能讓很多任務(wù)更直觀。rqt是一個(gè)插件化的框架常用插件有rqt_graph可視化計(jì)算圖前面提過。rqt_console查看和過濾所有節(jié)點(diǎn)的日志消息比在終端里看rosout清晰得多。rqt_plot將話題數(shù)據(jù)數(shù)值類型實(shí)時(shí)繪制成曲線圖用于調(diào)試PID控制器、觀察傳感器數(shù)據(jù)變化。rqt_reconfigure動(dòng)態(tài)調(diào)整節(jié)點(diǎn)的參數(shù)必須是節(jié)點(diǎn)提供了動(dòng)態(tài)配置接口調(diào)參神器。rqt_image_view查看圖像話題在調(diào)試攝像頭時(shí)必不可少。在Jetson Nano上運(yùn)行rqt由于需要GUI必須確保你通過桌面環(huán)境或VNC等連接。如果只通過SSH連接則需要設(shè)置export DISPLAY:0假設(shè)桌面在本地顯示并且X11轉(zhuǎn)發(fā)可能比較慢。對(duì)于圖像查看如果網(wǎng)絡(luò)延遲高可以考慮在Nano本地啟動(dòng)rqt_image_view或者使用壓縮圖像話題/camera/image_raw/compressed來減少帶寬。8. 在Jetson Nano上的專屬問題排查清單以下是我在Nano上使用ROS命令時(shí)遇到的一些典型問題及解決方法整理成表方便查閱問題現(xiàn)象可能原因排查步驟與解決方案rosnode list或rostopic list返回空或只看到少量系統(tǒng)話題1.ROS_MASTER_URI設(shè)置錯(cuò)誤。2. 節(jié)點(diǎn)未成功連接Master。3. 防火墻阻止了ROS通信端口默認(rèn)11311。1.echo $ROS_MASTER_URI確認(rèn)指向正確的Master如果是本機(jī)應(yīng)為http://localhost:11311。2. 檢查節(jié)點(diǎn)啟動(dòng)日志是否有連接錯(cuò)誤。3. 多機(jī)環(huán)境下檢查Nano和Master主機(jī)間的網(wǎng)絡(luò)禁用防火墻或放行11311端口。rostopic echo或rosbag play時(shí)系統(tǒng)卡頓、延遲高1. Nano CPU/內(nèi)存資源不足。2. 話題數(shù)據(jù)量過大如圖像。3. 存儲(chǔ)IO速度慢bag文件在慢速SD卡上。1. 使用htop監(jiān)控資源關(guān)閉不必要的進(jìn)程。2. 考慮降低數(shù)據(jù)頻率、分辨率或使用壓縮話題。3. 將bag文件移至更快的存儲(chǔ)介質(zhì)或使用rosbag play --clock -r 0.5降低回放速率。roscore啟動(dòng)失敗提示端口被占用之前運(yùn)行的roscore未正常關(guān)閉。1.killall -9 roscore或killall -9 rosmaster。2. 查找占用11311端口的進(jìn)程lsof -i:11311然后終止它。rosdep install失敗提示某些依賴無法安裝1. 網(wǎng)絡(luò)問題無法訪問軟件源。2. 該依賴在ARM架構(gòu)aarch64的Ubuntu倉(cāng)庫(kù)中不存在。1. 更換為國(guó)內(nèi)鏡像源如清華、中科大源。2. 對(duì)于缺失的ARM包嘗試a. 搜索是否有名稱稍變或功能相同的替代包。b. 從源碼編譯該依賴。c. 使用--skip-keys跳過該依賴如果確定非必需。catkin_make編譯時(shí)內(nèi)存不足被系統(tǒng)殺死Nano內(nèi)存較小通常4GB編譯大型包如PCL、OpenCV時(shí)易爆內(nèi)存。1. 增加交換空間swapsudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile。2. 使用catkin_make -j1單線程編譯減少內(nèi)存峰值。3. 在編譯前關(guān)閉所有不必要的圖形界面和程序。多機(jī)通信時(shí)Nano上的節(jié)點(diǎn)無法與x86主機(jī)通信1. 各機(jī)器/etc/hosts文件未正確配置主機(jī)名解析。2. 防火墻設(shè)置。3.ROS_HOSTNAME設(shè)置成了localhost或不可路由的地址。1. 在所有機(jī)器的/etc/hosts中互相添加IP和主機(jī)名的映射或直接使用IP地址。2. 確保ROS_HOSTNAME設(shè)置為Nano在局域網(wǎng)內(nèi)的IP地址如192.168.1.100。3. 使用ping和rostopic echo /rosout在Master主機(jī)上測(cè)試雙向連通性。掌握這些命令和技巧尤其是在Jetson Nano這個(gè)特定平臺(tái)上的實(shí)踐經(jīng)驗(yàn)?zāi)茏屇阍赗OS開發(fā)中快速定位問題高效進(jìn)行調(diào)試。記住命令行工具是你的瑞士軍刀圖形化工具是你的放大鏡兩者結(jié)合才能對(duì)ROS系統(tǒng)了如指掌。多動(dòng)手試多遇到問題解決的次數(shù)多了這些命令就真正變成你自己的東西了。