用ROS编写机器人的时候,不免会用到坐标变换,而tf是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具。
监听tf
通过监听tf,我们可以避免繁琐的旋转矩阵的计算,而直接获取我们需要的相关信息。 在监听中我最常用两个函数: (1)lookupTransform(); (2)transformPoint(); (一)lookupTransform();函数的使用 1.函数功能:可以过得两个坐标系之间转换的关系,包括旋转与平移。 2.使用例程:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28C++%29 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、添加头文件:
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是一个转换的模板
|