用ROS在编写机器人时,不可避免地会使用坐标变换,tf是ROS建立坐标系,并使用各坐标间转换关系的好工具。
监听tf
通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息。 我最常用中最常用两个函数: (1)lookupTransform(); (2)transformPoint(); (一)lookupTransform();函数的使用 1.函数功能:两个坐标系之间的转换关系,包括旋转和平移。 2.使用例程:http://wiki.ros.org/tf/Tutorials/Writing a tf listener (C ) 3.主要步骤: (1)监听器的定义;
tf::TransformListener listener
(2)定义存储变换关系的变量
tf::StampedTransform transform;
(3)监控两个坐标系之间的变化
try{
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform); } catch (tf::TransformException &ex) {
ROS_ERROR("%s",ex.what()); ros::Duration(1.0).sleep(); continue; }
注意: A.由于tf将监控内容存储在缓存中,然后读取相关内容,这个过程可能会延迟几毫秒,即,tf监听器不能监控现在的变化,所以如果不使用try,catch函数会导致报错:
“world” passed to lookupTransform argument target_frame does not exist. ”
它会导致程序挂断和使用try,catch之后就OK了。
程序中使用tf只需要以下步骤: 1、添加头文件:
#include <tf/transform_listener.h>
2、定义一个listener
tf::TransformListener tf_listener;
这个可以写public中
3.定义存储变换关系的变量
tf::StampedTransform transform;
4.监控两个坐标系之间的变化
try{
listener.lookupTransform("/map", "/base_link", ros::Time(0), transform); } catch (tf::TransformException &ex) {
ROS_ERROR("%s",ex.what()); ros::Duration(1.0).sleep(); continue; }
这里监听了base_link到map变换坐标,存储参数transform中。
(二)transformPoint() 这种数据广泛应用于传感器数据的坐标转换,用于将传感器数据从一个坐标系转换为另一个坐标系。
listener_.transformPoint(“map”,laser_pose,map_pose);
(1)其中laser_pose,world_pose各种数据类型 geometry_msgs::PointStamped, 需要定义laser_pose.header.frame.id即该点所属的坐标系(如激光坐标系) (2)”map是指,我要将就aser_pose转换到map坐标系下,map_pose是转换的果。 使用例程
geometry_msgs::PointStamped turtle1;
turtle1.header.stamp=ros::Time();
turtle1.header.frame_id="turtle1";
turtle1.point.x=1;
turtle1.point.y=2;
turtle1.point.z=3;
geometry_msgs::PointStamped turtle1_world;
try{
listener_.transformPoint("PTAM_world",turtle1,turtle1_world);
}
catch (tf::TransformException &ex) {
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
}
这里将turtle1从turtle1坐标系转换到PTAM_world坐标系下,数据存储在turtle1_world下。
TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系下的坐标。
使用tf功能包:
A:监听tf变换,接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。
B:广播tf变换,向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要进行同步。
数据结构,基本的数据类型有:Quaternion, vector, point, pose, transform
其中,quaternion表示四元数,vector3是一个3*1的向量,point表示一个点的坐标,Pose是位姿(包括坐标及方向),transform是一个转换的模板