跳到正文

Wiki

狀態廣播與機器人顯示

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

機器人在 RViz 中的位置由模型和 TF 共同決定。本節沿著真實反饋查詢顯示鏈路。

1.示例 1:檢視狀態資料從哪裡釋出

保持 mini 執行:

ros2 topic info /joint_states -v
ros2 topic echo /joint_states --once
ros2 topic info /robot_description -v
ros2 topic info /tf -v
ros2 topic info /tf_static -v

1.1.資料流

MiniSystem::read 更新 position_、velocity_
  → joint_state_broadcaster::update 读取状态接口
  → 发布 sensor_msgs/JointState
  → robot_state_publisher 按 URDF 计算关节变换
  → 发布 /tf 与 /tf_static
  → RViz 显示模型

joint_state_broadcaster 是控制器介面體系中的 broadcaster,但不佔用關節命令介面;它讀取狀態併發布資料。

2.示例 2:在 RViz 中觀察自己的機器人

在 Ubuntu 圖形桌面中開啟已 source 學習工作區的終端,執行:

source /opt/ros/humble/setup.bash
source ~/ros2_control_humble_ws/install/setup.bash
rviz2

設定 Fixed Frame 為 world,新增 RobotModel,選擇 /robot_description,再新增 TF。RobotModel 對描述話題的訂閱應使用 Transient Local durability,以便收到啟動時已釋出的模型。

傳送位置命令,觀察兩段連桿是否隨反饋運動。沒有圖形桌面時,可以先檢查 /joint_states、/tf 和控制器狀態;模型顯示步驟需要在可執行 RViz 的圖形桌面中進行。

3.示例 3:停止命令控制器以後為什麼仍有狀態

ros2 control set_controller_state forward_position_controller inactive
ros2 topic echo /joint_states --once
ros2 control list_controllers
ros2 control set_controller_state forward_position_controller active

3.1.預期現象

只停用命令控制器時,狀態廣播器仍可 active 併發布反饋。顯示、狀態釋出和命令執行是關聯但不同的職責。

4.JointState 的欄位說明

name 是名稱陣列;position、velocity、effort 是對應資料陣列,未提供的量可以為空。MiniSystem 提供 position 和 velocity,沒有真實測得的 effort,不能憑顯示工具替它“補出力矩反饋”。

本教程會按名稱匹配值。不要把陣列第 0 項永遠視為 joint1,因為其它機器人、廣播配置和版本可能改變順序。

5.常見問題

現象 先檢查
能看到模型但關節不動 JointState 是否更新、名稱是否匹配
TF 報缺少連線 Fixed Frame、模型根節點、狀態釋出時間
模型忽然來回跳 是否有多個狀態釋出者
Gazebo 正常,RViz 時間報錯 use_sim_time 與 /clock 是否一致
模型不出現 robot_description、QoS、模型解析日誌

原始碼:ros2_controllers/joint_state_broadcaster/src/joint_state_broadcaster.cpp。重點找狀態介面配置、釋出訊息初始化與 update,理解為什麼不該每輪重新分配完整訊息結構。


返回 Humble 總覽 · 上一篇:read-update-write控制週期 · 下一篇:命令轉發與常用控制介面