ROS的tf_tree中的节点含义详解
1. rqt_tf_tree中的节点
含义:rqt_tf_tree中的每个节点表示一个坐标系,通过frameid进行标识,例如:
map:全局地图坐标系。
odom:里程计坐标系(机器人局部位置)。
base_footprint:机器人基座坐标系。
laser:激光雷达坐标系。
节点详细介绍见:【机器人ROS系统各坐标系含义、关系与作用】
作用:这些节点通过边(TF变换)连接,表示坐标系之间的空间关系(如平移、旋转),构成整个系统的TF树,坐标系(节点)之间变换详细介绍见机器人坐标变换TF(ROS Transform)示例解释。
2. 与rosnode的关系
rosnode是TF变换的发布者:每个坐标系(TF节点)的变换数据由某个rosnode发布。
例如:
robot_state_publisher节点发布URDF模型中的静态TF(如传感器与基座的固定关系)。
gmapping节点发布SLAM生成的map→odom动态变换。
Gazebo插件发布odom→base_footprint的里程计动态变换。
命名空间与TF前缀:
如果rosnode设置了tf_prefix参数(如tb3_0),其发布的TF会带有前缀(如tb3_0/map),在TF树中表现为独立的子树。
3. 与rostopic的关系
TF数据通过话题传输:所有动态TF变换(如odom→base_footprint)通过/tf话题发布(rostopic echo /tf可查看)。
静态TF变换(如传感器与基座的固定关系)通过/tf_static话题发布。
订阅与发布:
rosnode通过订阅/tf和/tf_static获取其他节点的TF数据。
rqt_tf_tree本身不直接订阅话题,而是通过TF库(tf2_ros)监听所有TF数据并可视化。
4. 总结关系图
rosnode(如robot_state_publisher)
↓ 发布TF数据到
rostopic(如/tf, /tf_static)
↓ 通过TF库传输
rqt_tf_tree(可视化坐标系节点和变换边)
5. 验证方法
# 查看tf树结构
rosrun rqt_tf_tree rqt_tf_tree
# 查看TF发布者
rostopic echo /tf
6. 常见问题
-
为什么TF树中有重复坐标系?
多个rosnode可能发布同名TF(如两个机器人都发布map→odom),需通过命名空间(如robot1/map)区分。 -
如何禁用某个TF发布?
在对应的rosnode配置中设置参数(如Gazebo插件的publish_odom_tf=false)。