Wiki
狀態廣播與機械人顯示
約 3 分鐘閱讀
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
RViz 依據模型和 TF 顯示機械人,不能直接讀取硬件插件的 C++ 數組。
1.示例 1:查看發佈關係
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.數據流
硬件 read → 状态接口
→ joint_state_broadcaster::update
→ JointState
→ robot_state_publisher 计算关节变换
→ TF
→ RViz
broadcaster 使用控制器接口體系,但不寫關節命令。停用命令控制器後,廣播器仍可能 active。
2.示例 2:顯示自己的機械人
在 Ubuntu 圖形桌面中:
source /opt/ros/jazzy/setup.bash
source ~/ros2_control_jazzy_ws/install/setup.bash
rviz2
Fixed Frame 選 world,添加 RobotModel 和 TF;模型描述選擇 /robot_description。描述發佈早於 RViz 啓動時,訂閲 durability 使用 Transient Local 以取得保存的模型消息。
發送位置目標,觀察連桿和 JointState 是否一致。無圖形桌面時先檢查 Topic 與 TF,顯示步驟在可運行 RViz 的桌面中完成。
3.示例 3:不要按數組位置猜關節
name 數組決定 position、velocity 等數組的對應關係。某些狀態量未提供時,對應字段可以為空。教學硬件沒有測得 effort,就不能根據位置運動猜出力矩反饋。
3.1.排查順序
| 現象 | 先檢查 |
|---|---|
| 模型存在但不動 | JointState 數值和關節名稱 |
| 模型來回跳 | 是否有多個 /joint_states 發佈者 |
| TF 缺少連接 | Fixed Frame、根 link、時間戳 |
| 仿真報時間錯誤 | use_sim_time 與 /clock |
| 模型不出現 | 描述內容、訂閲 QoS、解析日誌 |
不要同時用 joint_state_publisher_gui 為同一控制機械人發佈狀態,這會干擾反饋來源。
源碼:ros2_controllers/joint_state_broadcaster/src/joint_state_broadcaster.cpp。觀察接口選擇、消息初始化與 update,理解廣播器怎樣組織狀態。
返回 Jazzy 總覽 · 上一篇:read-update-write控制週期 · 下一篇:命令轉發與控制模式