RViz2 基礎:機器人的視覺化除錯工具

2026-07-18
  • ros2
  • rviz2
  • visualization
  • debugging

問題定義

前面三節寫的 URDF、xacro、TF2,全部都是「資料」跟「邏輯」,沒有畫面。開發過程中,光憑印出來的數字很難判斷「機器人的手臂角度對不對」「雷射掃描資料有沒有正確對齊到機身」——RViz2 就是把這些抽象資料畫成看得見的 3D 場景,讓你用眼睛而不是用腦補去確認系統狀態,是機器人開發裡幾乎每天都會開著的工具。

核心概念說明

Fixed Frame:整個畫面的參考基準

RViz2 打開後第一個要設定的東西是 Fixed Frame(在左側 Global Options 裡),它決定了整個 3D 畫面用哪個座標系當作「世界不動的參考點」。這個選擇會直接影響畫面呈現的方式:如果選 base_link,機器人本體永遠固定在畫面中央,即使它實際上在移動,你看到的是「以機器人自己為中心」的視角;如果選 mapodom,機器人本體會在畫面中真實地移動位置,適合觀察導航軌跡。

如果 Fixed Frame 設定的座標系在 TF 樹裡不存在,畫面標題列會顯示紅字警告,這也是第 4.3 節提過的排查起點——RViz2 打不開東西,很多時候問題根本不在 RViz2 本身,而是 TF 或資料來源。

Display:每一種資料類型對應一種顯示外掛

RViz2 用 Display 機制呈現不同類型的資料,每種 Display 訂閱特定型別的主題,用特定方式視覺化。跟第 3.1 節介紹的 rqt 外掛概念類似,RViz2 本身是個容器,你依需求疊加多個 Display:

Display 類型訂閱的資料型別用途
RobotModel讀取 robot_description 參數(URDF)+ TF顯示完整機器人模型
TFTF 樹畫出所有座標系與彼此的軸線
LaserScansensor_msgs/msg/LaserScan顯示雷射雷達掃描點
PointCloud2sensor_msgs/msg/PointCloud2顯示深度相機或光達點雲
Imagesensor_msgs/msg/Image顯示相機畫面
Pathnav_msgs/msg/Path顯示規劃路徑
Markervisualization_msgs/msg/Marker顯示自訂形狀,常用來畫抓取目標點、除錯用的輔助線

實作範例:載入第 4.1 節的手臂模型 + 即時觀察 TF

延續前面幾節的素材,這裡示範把 URDF 模型、TF 座標軸、以及一個模擬的雷射掃描資料同時疊加在 RViz2 裡觀察。

1. 啟動模型發布與關節控制

bash
ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:="$(cat ~/ros2_ws/src/my_package/urdf/simple_arm.urdf)"
bash
ros2 run joint_state_publisher_gui joint_state_publisher_gui

2. 啟動 RViz2

bash
rviz2

3. 手動設定畫面(後續章節會用 launch 檔案自動化這個步驟)

  1. 左側 Global Options → Fixed Frame 填入 base_link
  2. 點左下角 Add 按鈕 → 選擇 RobotModel → 確認
  3. 再次 Add → 選擇 TF → 確認

預期畫面

畫面中央會出現第 4.1 節寫的灰色底座+藍色上臂+橘色前臂模型,疊加上 TF Display 之後,每個 link 的座標系原點會多出一組紅綠藍三色軸線(分別代表該座標系的 X/Y/Z 方向)。拖動 joint_state_publisher_gui 的滑桿時,模型會即時跟著轉動,TF 軸線也會同步跟著轉——這正是驗證第 4.3 節提到「TF 樹會隨關節角度即時更新」最直觀的方式。

4. 疊加一個模擬的雷射掃描資料

另開終端機,手動發布一則假的 LaserScan 資料觀察 Display 疊加效果:

bash
ros2 topic pub /scan sensor_msgs/msg/LaserScan "{header: {frame_id: 'base_link'}, angle_min: -1.57, angle_max: 1.57, angle_increment: 0.05, range_min: 0.1, range_max: 5.0, ranges: [1.0, 1.2, 0.8, 1.5, 2.0]}" --rate 2

在 RViz2 裡 Add → 選擇 LaserScan → Topic 選 /scan,畫面上會在 base_link 座標系附近出現幾個代表掃描點的小點。

常見錯誤與除錯技巧

錯誤一:加入 RobotModel 之後,畫面上什麼都沒有,左側顯示紅色驚嘆號

現象:點開 RobotModel 項目左側箭頭,Status 顯示:

text
No transform from [upper_arm] to frame [base_link]

原因:這個訊息代表 URDF 本身有被讀到(不然連 link 名稱都不會出現在錯誤訊息裡),但 TF 樹裡缺少對應的座標轉換——最常見的原因是 robot_state_publisher 沒有正確啟動,或啟動了但沒有任何節點在發布 /joint_statesrobot_state_publisher 需要靠 /joint_states 主題才知道目前每個 joint 的角度,進而計算並廣播完整的 TF)。

排除方式:確認 joint_state_publisher(或 joint_state_publisher_gui)有在執行,並用 ros2 topic echo /joint_states 確認確實有資料在發布:

bash
ros2 topic echo /joint_states --once
text
name: ['shoulder_joint', 'elbow_joint']
position: [0.0, 0.0]

如果這裡完全沒有輸出,問題出在關節狀態發布端,跟 RViz2 本身無關。

錯誤二:LaserScan 的點雲位置明顯偏移,跟預期的方向對不上

原因LaserScan 訊息裡的 header.frame_id 決定了這些掃描點要被畫在哪個座標系底下,如果填錯(例如寫成一個不存在或方向不對的座標系名稱),RViz2 會把資料畫在錯誤的位置與方向,但不會報錯——因為就技術上而言查詢與繪製都成功了,只是查詢到的座標系跟你以為的不是同一個。

排除方式:確認 frame_id 填的座標系名稱,跟實際感測器安裝的座標系一致,並透過 TF Display 疊加檢視該座標系的實際方向是否符合預期,而不是假設資料本身一定沒問題。

小結

RViz2 用 Fixed Frame 決定畫面的參考基準,用一系列 Display 外掛疊加呈現不同型別的資料,模型顯示異常時,Status 欄位裡的錯誤文字,加上手動用 ros2 topic echo 確認資料源頭是否正常,是最快的排查順序。到這裡,第 4 章介紹的機器人建模與座標系統(URDF、xacro、TF2、RViz2)已經是後面每一章都會持續用到的共同基礎——下一章我們會進入 Gazebo,把這些模型放進一個真正有物理引擎的模擬環境。

延伸閱讀

常見問題

faq_01.log
RViz2 顯示的東西都是即時的嗎,還是可以看歷史資料?
RViz2 本身訂閱的是即時發布中的主題資料,本質上是一個即時可視化工具,不能直接回放歷史資料。如果要檢視過去錄製的資料,做法是用第 3.3 節介紹的 rosbag2 重播,重播出來的資料本質上就是正常發布中的主題,RViz2 訂閱起來跟即時資料沒有差別。
faq_02.log
Fixed Frame 應該選哪一個座標系?
選一個在你關心的時間範圍內相對穩定、不會漂移的座標系。單純看機器人本體的姿態變化,選 base_link 通常就夠;如果要看機器人在環境中的移動軌跡、或疊加地圖資料,通常會選 map 或 odom,讓機器人本體隨著移動而在畫面中真的位移,而不是固定在畫面中央。
faq_03.log
加了 Display 之後,左側面板顯示紅色的驚嘆號是什麼意思?
代表這個 Display 目前有問題,通常是訂閱的主題不存在、QoS 不相容、或是需要的座標轉換查詢失敗。點開該 Display 項目左側的展開箭頭,Status 欄位會有更具體的文字說明,是排查的第一站。