tf是坐标系变换中常用到的工具,今天为几个关键的函数来解释一下用法:
一.广播tf
往tf中发布你建立的坐标系以及坐标系之间的变化。步骤如下:
1.定义一个广播,相当于发布话题时定义一个发布器,还是以官方的小乌龟例程为例:
static tf::TransformBroadcaster br;
2.定义存放转换信息(平动,转动)的变量
tf::Transform transform;
3.求得变换矩阵中的t
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
需要注意:
(1)setOrigin()函数的参数类型需要为tf::Vector3类型
(2)假设是要发布一个子坐标系为”turtle1”父坐标系为“world”,那么其中(msg->x,msg->y,0.0)是指“turtle1”的坐标原点在“world”坐标系下的坐标。
4.求得旋转矩阵R
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation(q);
需要注意:
(1)setRPY()函数的参数为”turtle1”在“world”坐标系下的roll(绕X轴),pitch(绕Y轴),yaw(绕Z轴)
(2)为了确保转换正确强烈建议,在转换完后,运行下程序,打开rviz下使用确认下转换是否正确,我在实验中有一次,明明依次填入了三个角度,但是在rviz下发现并不正确,pitch,yaw还存在一个负号的关系(楼主对旋转角的正负号向来头晕,所以都是直接打开rviz,直接试,直观而且准确)。
5.将变换广播出去
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
其中,
(1)transform:存储变换关系的变量;
(2)ros::Time::now():广播tf使的时间戳;
(3)“world”:父坐标系的名字;
(4)turtle_name:子坐标系的名字,这里因为子坐标系有两个,所以它定义了字符串用于存放名字,方便切换,通常我们把名字填到引号里就可以了。
总结一下,假设你在机器人上应用,如果你知道机器人的位置x,y,z,与三个旋转角roll,pitch,yaw就可