Skip to content

Wiki

状态广播与机器人显示

About 3 min read

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控制周期 · 下一篇:命令转发与常用控制接口