TF坐标变换
TF:TransForm Frame,坐标变换。
坐标系:ROS 中是通过坐标系统开标定物体的,确切的将是通过右手坐标系来标定的。
注:在ROS中坐标变换最初对应的是tf,不过在 hydro 版本开始, tf 被弃用,迁移到 tf2,后者更为简洁高效,tf2对应的常用功能包有:
- tf2_geometry_msgs:可以将ROS消息转换成tf2消息。
- tf2: 封装了坐标变换的常用消息。
- tf2_ros:为tf2提供了roscpp和rospy绑定,封装了坐标变换常用的API。
官方攻略如下:
坐标msg消息
1. geometry_msgs/TransformStamped
传输坐标系相关位置信息。
std_msgs/Header header #头信息
uint32 seq #|-- 序列号
time stamp #|-- 时间戳
string frame_id #|-- 坐标 ID
string child_frame_id #子坐标系的 id
geometry_msgs/Transform transform #坐标信息
geometry_msgs/Vector3 translation #偏移量
float64 x #|-- X 方向的偏移量
float64 y #|-- Y 方向的偏移量
float64 z #|-- Z 方向上的偏移量
geometry_msgs/Quaternion rotation #四元数
float64 x
float64 y
float64 z
float64 w
translation 位移
rotation 转角
四元数的设置要由欧拉角转换而来,利用 tf_conversions 包。
2. geometry_msgs/PointStamped
传输某个坐标系内坐标点的信息。
std_msgs/Header header #头
uint32 seq #|-- 序号
time stamp #|-- 时间戳
string frame_id #|-- 所属坐标系的 id
geometry_msgs/Point point #点坐标
float64 x #|-- x y z 坐标
float64 y
float64 z
详细参见:rosmsg info
静态坐标变换
所谓静态坐标变换,是指两个坐标系之间的相对位置是固定的。
当坐标系之间的相对位置固定时,那么所需参数也是固定的: 父系坐标名称、子级坐标系名称、x偏移量、y偏移量、z偏移量、x 翻滚角度、y俯仰角度、z偏航角度,实现逻辑相同,参数不同,那么 ROS 系统就已经封装好了专门的节点,使用方式如下:
rosrun tf2_ros static_transform_publisher x偏移量 y偏移量 z偏移量 z偏航角度 y俯仰角度 x翻滚角度 父级坐标系 子级坐标系
示例:
rosrun tf2_ros static_transform_publisher 0.2 0 0.5 0 0 0 /baselink /laser
也建议使用该种方式直接实现静态坐标系相对信息发布。
详见:
动态坐标变换
所谓动态坐标变换,是指两个坐标系之间的相对位置是变化的。
详见:
多坐标变换
多个父子坐标系。
详见:
坐标系关系查看
在机器人系统中,涉及的坐标系有多个,为了方便查看,ros 提供了专门的工具,可以用于生成显示坐标系关系的 pdf 文件,该文件包含树形结构的坐标系图谱。
详见:
TF2与TF
- TF2已经替换了TF,TF2是TF的超集,建议学习 TF2 而非 TF。
- TF2 功能包的增强了内聚性,TF 与 TF2 所依赖的功能包是不同的,TF 对应的是
tf
包,TF2 对应的是tf2
和tf2_ros
包,在 TF2 中不同类型的 API 实现做了分包处理。 - TF2 实现效率更高,比如在:TF2 的静态坐标实现、TF2 坐标变换监听器中的 Buffer 实现等。