图 19-6 · 工程全景:一条 launch、两个话题、五步验证
本图回答的问题:display.launch.py 动了哪些文件、谁发 /tf 与 /tf_static、五步各验证链路的哪一段?
ros2 launch car1_description
display.launch.py · 终端 A 一次拉起 3 节点
启动
launch 进程 · car1_description(gui · rsp · rviz2 同拉)
car1.urdf + display.launch.py
所有边写在 URDF;launch 读入为 robot_description
解析 · 分发边
robot_state_publisher
fixed→/tf_static 一次 · 活动(+/joint_states)→/tf 持续
static_transform_publisher(免代码)
--frame-id 父 --child-frame-id 子 · 案例外临时加边用
等价效果
/tf_static 话题
fixed 边 · 一次性发布
Transient Local · 后到者补收
/tf 话题
活动边 · 持续刷新
KeepLast · 只取最新值
tf2_echo
第⑤步 · Translation 对账
view_frames
第④步 · frames.pdf 树形
rviz2 · TF Display
第④步 · 轴向与帧名
订阅两条话题
launch 要活着 · 名字/顺序任一处写错 → 查不到
未 source · Ctrl+C 关掉 launch · laser_Frame 大小写 · 父子互换
对不上
URDF 写边 → robot_state_publisher 发进两条话题 → 五步各查一段——谁都不用维护全树
✅ 结论:URDF 写边、robot_state_publisher 发边,两条话题供五步复读
⚠️ 风险:launch 未起 / 关掉 · frame 名大小写 · 父子顺序三类高频错
🔍 验证:02 节 3 步现象 · 04 节五步实测
EXP-19 · TF2 坐标系变换