TF的深入学习与研究
需求
通过本篇文章实现对TF变换的深入研究。
最终目标
掌握坐标系之间的相互转换、掌握坐标点在不同坐标系下的转换。
TF的消息格式
在坐标转换实现中常用的 geometry_msgs/TransformStamped
(用于传输坐标系相关位置信息)和geometry_msgs/PointStamped
(用于传输某个坐标系内坐标点的信息)
具体如下:
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
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
静态坐标系之间的关系转换
静态坐标系是指两个坐标系之间关系的相对位姿关系不发生改变
实现流程:
-
发布方:通过静态广播器的形式发布相对坐标系的位姿关系
1、创建 静态坐标广播器
broadcaster = tf2_ros.StaticTransformBroadcaster()
2、组织坐标系的相关消息
tfs = TransformStamped()
3、广播器发送消息
broadcaster.sendTransform(tfs) -
订阅方:订阅广播发布的内容,并处理坐标点在不同坐标系下的转换
1、创建缓存对象,用来存放消息
buffer = tf2_ros.Buffer()
2、创建监听对象,监听发布的坐标相对关系
listener = tf2_ros.TransformListener(buffer)
3、将点坐标转换成相对于 world 的坐标
point_target = buffer.transform(point_source,“world”)
动态坐标系之间的关系转换
动态坐标系是指:两个坐标系之间的位姿关系在不断发生改变
实现流程:
- 发布方:将一个坐标系视为一个坐标点,获得其坐标点的位姿关系进行转换
1、订阅一个坐标系(视为坐标点)在另一个坐标系下的位置话题
2、创建回调函数,接收位置信息
3、在回调函数中,创建广播器
broadcaster = tf2_ros.TransformBroadcaster()
4、组织发布的数据
tfs = TransformStamped()
5、广播器发送数据
broadcaster.sendTransform(tfs) - 订阅方:订阅数据
1、创建缓存区域
buffer = tf2_ros.Buffer()
2、创建监听对象
listener = tf2_ros.TransformListener(buffer)
3、实现坐标点在不同坐标系下的转换
point_target = buffer.transform(point_source,“world”,rospy.Duration(1))
关键
1、将一个坐标系视为坐标点,找到关于这个坐标点在另一个坐标系下的位置话题,进行消息格式的转换
2、广播发送消息后,进行后续转换