rqt 與 rqt_graph

2026-07-18
  • ros2
  • rqt
  • rqt_graph
  • debugging

問題定義

前面幾節寫的節點、主題、服務、動作,多半是自己心裡有數「應該長什麼樣子」。但當系統變複雜——十幾個節點、幾十個主題互相連接——光靠 ros2 node listros2 topic list 這種一次列一種資訊的指令,很難在腦中拼出整體架構。這一節要介紹的 rqt 工具集,核心價值就是把這些關係「畫」出來,讓除錯從「純靠猜」變成「看圖說話」。

核心概念說明

rqt 是一個外掛容器,不是單一工具

rqt 本身是一個基於 Qt 的圖形介面框架,你平常聽到的「rqt_graph」「rqt_console」「rqt_plot」都是掛載在這個框架裡的外掛(plugin),可以各自獨立開啟,也可以同時開在同一個視窗裡組成一組「工作版面」(perspective)。理解這個架構之後,會發現學 rqt 不是學一個工具,而是認識一組外掛,依需求挑著用。

日常開發最常用到的幾個:

外掛用途
rqt_graph畫出節點與主題的連接關係圖
rqt_console集中檢視所有節點的 log 訊息,可依等級與內容過濾
rqt_topic即時檢視主題的發布頻率、頻寬、訊息內容
rqt_plot把數值型主題資料畫成即時折線圖(適合看感測器數值、控制器輸出)
rqt_reconfigure用 GUI 滑桿即時調整節點參數,不用手動打 ros2 param set
rqt_service_caller用 GUI 表單呼叫 Service,不用手動組 CLI 指令

怎麼讀懂 rqt_graph 畫出的圖

rqt_graph 用兩種形狀表示系統元件:橢圓形代表節點矩形代表主題,箭頭方向代表資料流向(從 Publisher 節點指向主題,再從主題指向 Subscriber 節點)。

假設你同時執行了第 2.2 節的 talkerlistener,以及第 2.3 節的 add_serverrqt_graph 的節點圖會呈現:

text
(talker) ──chatter──> (listener)

(add_server)   ← 沒有連到任何主題的箭頭,
               因為 Service 不會出現在預設的節點圖裡

這裡有一個新手很容易誤解的地方:rqt_graph 預設只畫「主題」的連接關係,Service 與 Action 不會出現在圖上(Action 底層雖然用了 Topic,但那些內部主題預設會被過濾掉)。如果你在圖上找不到你的 Service Server 節點跟誰有連線,不代表系統有問題,只是這個視圖本來就不呈現這類資訊。

另外,rqt_graph 左側有幾個過濾選項:

  • Hide Debug:預設勾選,會隱藏 /rosout/parameter_events 這類系統內部主題,讓圖表更乾淨。如果你想確認參數變更事件有沒有正確發出,需要取消這個勾選才看得到。
  • Namespaces:可以把圖表依命名空間分組收合,在多機器人(每個機器人一個 namespace)的場景下能大幅簡化畫面。

實作範例:用 rqt_graph 確認第 2 章寫的系統

不需要額外寫程式碼,直接啟動前面章節已經寫好的節點,透過 rqt 觀察:

bash
# 終端機 1
ros2 run my_package talker

# 終端機 2
ros2 run my_package listener

# 終端機 3
ros2 run my_package add_server

# 終端機 4
rqt_graph

預期畫面

rqt_graph 視窗裡會看到:

  • 一個橢圓形節點 /talker,有一條箭頭指向矩形 /chatter
  • 矩形 /chatter 有另一條箭頭指向橢圓形節點 /listener
  • 橢圓形節點 /add_server 單獨存在,沒有連到任何主題(因為它提供的是 Service,不是 Topic)

取消勾選 Hide Debug 之後,畫面上會多出 /rosout 這個矩形,並且 /talker/listener/add_server 三個節點都會有箭頭連到它——這是因為每個節點的 get_logger().info(...) 呼叫,底層其實都是發布到 /rosout 這個主題,rqt_console 就是訂閱這個主題來集中顯示所有 log。

打開 rqt_console 觀察同一組系統的 log:

bash
rqt_console

畫面上會即時列出三個節點各自的 log 訊息,每一行前面標示節點名稱、時間戳記、log 等級。這時候故意在 add_client 傳入不合法的參數(例如非數字字串),可以在 rqt_console 裡直接用 Error 等級過濾,快速定位是哪個節點、哪一行訊息在抱怨。

常見錯誤與除錯技巧

錯誤一:rqt_graph 畫面完全是空的

text
(rqt_graph 視窗開啟,但圖表區塊什麼都沒有)

原因:最常見的情況是這台機器上目前沒有任何 ROS2 節點在執行,或是節點確實在跑,但 rqt_graph 開啟時所在的終端機沒有正確 source 到同一個 ROS_DOMAIN_ID

排除方式:先在另一個終端機用 ros2 node list 確認節點確實存在,再確認開啟 rqt_graph 的終端機環境變數一致:

bash
echo $ROS_DOMAIN_ID
ros2 node list

如果 ros2 node list 都能看到節點,但 rqt_graph 還是空的,嘗試點擊視窗左上角的重新整理(refresh)按鈕——rqt_graph 有時不會自動偵測到執行中途才啟動的新節點。

錯誤二:rqt 啟動後外掛版面跟教學截圖完全不一樣

原因:rqt 的版面配置(perspective)是持久化儲存的,如果你或其他人之前手動調整過外掛的排列、開關了某些外掛面板,下次開啟 rqt 會沿用上次的配置,而不是乾淨的預設狀態。

排除方式:從選單列 Perspectives → Delete Perspective 清除目前配置後重新啟動 rqt,會回到內建預設版面。如果你已經花時間排好一組適合自己專案的版面(例如同時開 rqt_graph + rqt_console + rqt_topic),可以用 Perspectives → Export 存成檔案,之後用 Import 快速還原,不用每次重新排列。

小結

rqt 不是一個工具,而是一組可以自由組合的除錯外掛,rqt_graph 讓你看懂節點與主題的連接關係(但記得 Service/Action 預設不會出現在圖上),rqt_console 把所有節點分散的 log 集中起來方便過濾查找。下一節會介紹另一組更直接、更常在腳本裡用到的除錯工具:ROS2 CLI 指令。

延伸閱讀

常見問題

faq_01.log
rqt_graph 打開是空的,只看到自己的節點,其他節點呢?
先確認其他節點是不是在不同的 ROS_DOMAIN_ID 底下(參考第 1.1 節提到的網路隔離問題)。如果 domain 一致,檢查 rqt_graph 左上角的過濾條件,預設可能勾選了只顯示特定命名空間或隱藏了非作用中的節點。
faq_02.log
rqt 界面配置亂掉了,怎麼恢復預設?
rqt 選單列的 Perspectives → Delete Perspective,刪除目前的配置後重新開啟 rqt,會回到內建的預設版面。日常開發中把常用外掛組合成一個 perspective 並存檔,是比較實務的做法。
faq_03.log
rqt_console 可以像 grep 一樣過濾特定關鍵字的 log 嗎?
可以,rqt_console 上方有訊息內容的文字過濾欄位,也能依照 log 等級(Debug/Info/Warn/Error/Fatal)與節點名稱過濾,比在終端機裡用 grep 更方便的地方是可以同時疊加多個條件、且能回溯捲動歷史紀錄。