Wiki
状态广播与机器人显示
Existing English translations were reused. 19 current source blocks remain in Simplified Chinese, without triggering paid translation.
机器人在 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.Frequently Asked Questions
| 现象 | 先检查 |
|---|---|
| 能看到模型但关节不动 | 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控制周期 · 下一篇:命令转发与常用控制接口