Wiki
狀態廣播與機械人顯示
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
機械人在 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控制週期 · 下一篇:命令轉發與常用控制接口