ROS学习六、TF坐标系转换(2)

ROS学习六、TF坐标系转换(2)

  • tf消息
  • tf转换
  • 总结

tf消息

tf树通过Topic进行建立与维护。tf树的建立是从第一个父坐标系开始,根据父子frame之间的位姿消息,逐渐添加子叶(子frame),然后再根据消息进行父子frame间位姿的维护更新。tf树中每一对父子frame都依靠话题来传递位姿信息,这个话题就是 /tf

/tf话题包含了tf tree中所有父子坐标系之间的位姿变换关系消息,而父子坐标系之间的位姿又是通过一个Broadcaster节点发布的,典型的Broadcaster节点例如/robot_state_publisher,/joint_state_publisher等。

ROS提供了geometry_msg/Transformgeometry_msg/TransformStamped消息类型来表示frame之间的相对位姿关系:

# geometry_msg/TransformStamped
std_msgs/Header header
string child_frame_id
geometry_msgs/Transform transform
# ---------------------------------
# geometry_msg/Transform
geometry_msgs/Vector3 translation
geometry_msgs/Quaternion rotation

而/tf话题上的消息类型则是tf2_msgs/TFMessage

# tf2_msgs/TFMessage
geometry_msgs/TransformStamped[] transforms

可以看出,/tf上发布的消息是frame间位姿变换消息的数组,实际上就是由各父子frame间的位姿变换关系组成。

tf转换

在tf树中,如果两个frame之间是连通的,那么就可以通过数学运算(矩阵乘法)获得frame之间的位姿变换关系。

ROS中给出了通过代码进行tf转换的消息发布与接收方法,可以通过roscpp或rospy通过tf2_ros类来实现:

#  Broadcasting Transforms
tf2_ros::TransformBroadcaster
tf2_ros::TransformBroadcaster::sendTransform()

tf2_ros::StaticTransformBroadcaster
tf2_ros::StaticTransformBroadcaster::sendTransform()

# Using published Transforms
tf2_ros::Buffer
tf2_ros::TransformListener
tf2_ros::Buffer::canTransform()
tf2_ros::Buffer::lookupTransform()

# Using eigen to transform
tf2::eigenToTransform()
tf2::transformToEigen()
tf2::fromMsg()
tf2::toMsg()
tf2::doTransform()

总结

ROS中,可以采用TF(实际上是TF2)来实现各坐标系(frame)之间的位姿变换。

tf2中,BufferCore类作为坐标系位姿变换的底层实现,而tf2_ros::BufferInterface封装了tf2::BufferCore作为接口,然后再使用tf2_ros::Buffer、tf2_ros::BufferClient与tf2_ros::BufferServer进一步实现了该接口。

tf2_ros中,类TransformBroadcaster作为/tf话题的publisher,类TransformListener作为/tf话题的subscriber,/tf话题下的消息包含了所有父子frame之间的位姿变换。

tf2_ros还提供了canTransform和lookupTransform,可以通过这两个函数从/tf话题中得知任意两个frame间能否转换以及获得位姿转换矩阵。

你可能感兴趣的:(ROS,机器人操作系统,自动驾驶)