系列文章目录
TF系统简介
前面的章节实现了SLAM节点的建图功能:
激光雷达节点—> /scan话题 —>hector_mapping节点—> 地图数据话题/map
本期来实现SLAM节点的定位功能:
TF(TransForm)主要描述的是两个坐标系的空间关系,可以理解为坐标系变换;
TF发布节点—> /tf话题
其它节点订阅上述/tf话题即可查询当前运行的节点网络中的坐标系、坐标系间的空间关系;
rviz的显示原理:rviz订阅了/tf话题,此外在rviz中可以直接显示TF的坐标系;
输出机器人的坐标在地图中的位置关系
运行slam仿真
roslaunch wpr_simulation wpb_hector.launch
在rviz窗口中添加TF;
可以适当调节标签大小(Marker Scale,例如调成5);
展开Frames,只保留base_footprint和map选项;
这样可以方便观察两个坐标系的位置和空间关系;
rostopic list
查看其中/tf话题的类型
rostopic type /tf
查询结果为tf2_msgs/TFMessage
在index.ros.org中查看对应的tf2_msgs消息类型的具体介绍信息
描述为geometry_msgs/TransformStamped[]transforms
这是一个TransformStamped类型的数组,点击查看其结构:
geometry_msgs/TransformStamped Message
std_msgs/Header header
string child_frame_id (子坐标系的名称)
geometry_msgs/Transform transform (两个坐标系的空间关系)
std_msgs/Header Message
uint32 seq
time stamp
string frame_id (父坐标系的名称)
重点介绍一下geometry_msgs/Transform transform
geometry_msgs/Transform Message
geometry_msgs/vector3 translation
geometry_msgs/Quaternion rotation
其中geometry_msgs/vector3 translation,是float64 x、y、z,代表的是子坐标系相对于父坐标系在空间位置偏移量;
geometry_msgs/Quaternion rotation,是四元数,float64 x、y、z、w,表示的是子坐标系相对于父坐标系的角度偏差;
四元数计算欧拉角参照:文章
这里只需要知道四元数和欧拉角可以相互转换即可,感兴趣的话可以去深入了解其中的数学原理;
TF树
查看/tf消息中的消息包rostopic echo /tf
translation部分表示子坐标系与父坐标系的距离偏差;
rotation是一个四元数,表示了子坐标系与父坐标系的角度偏差,可以用公式将其转换为欧拉角(roll pitch yaw);
transforms:
-
header:
seq: 0
stamp:
secs: 421
nsecs: 394000000
frame_id: "map"
child_frame_id: "odom"
transform:
translation:
x: -0.01747243289675815
y: 0.03656238974946313
z: 0.0
rotation:
x: 0.0
y: 0.0
z: -0.010764158207004907
w: 0.9999420647708018
为了理清消息包中的关系,执行
rosrun rqt_tf_tree rqt_tf_tree
当一个ROS程序运行起来的时候,所有的空间坐标关系都可以从如下tf树里获得;
其中每个椭圆代表一个坐标系,位于上方的椭圆是连线下方椭圆的父级坐标系;
整个tf系统由父级、子级坐标系这样的多级的分支结构组成;
在ROS系统运行过程中,所有的空间坐标关系都可以从tf树中获得;
前面的例子只用到了输出机器人的坐标在地图中的位置关系这一功能,tf系统还有更多其它功能;
总结
简单介绍了ROS中的TF系统、TF消息包部分内容、TF树。