tf是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具。虽然官网的资料很复杂,但在
一、广播tf
就是发布你建立的坐标系,步骤如下
1. 定义一个广播,相当于发布话题时定义一个发布器。
tf::TransformBroadcaster br;
2. 定义存放转换信息(平动,转动)的变量 transform
tf::Transform transform;//这里transform为一个类
3.通过调用类transform的成员函数设置坐标原点
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
需要注意:
(1)setOrigin()函数的参数类型需要为tf::Vector3类型
(2) 假设是需要发布一个子坐标系为小车base_link,父坐标系为 map,那么其中(msg->x, msg->y, 0.0)是指子坐标系base_link的坐标原点在父坐标系map坐标下的坐标
4.定义旋转
tf::Quaternion q;//Quaternion是一个类
q.setRPY(0.0, 0.0, laser_scan->angle_min);//setRPY是类Quaternion的一个成员函数
transform.setRotation(q);
需要注意:
(1)setRPY()函数的参数为小车base_link在map坐标系下的roll(绕x轴),pitch(绕y轴),yaw(绕z轴),
问题,我们一般用的是2d坐标系,为什么还会有一个绕z轴旋转的角呢?
5. 将变换广播出去
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "map", ”base_link“));
其中,
(1)transform:存储变换关系的变量
(2)ros::Time::now():广播tf使用的时间戳
(3)map, 父坐标系的名称
(4) base_link:子坐标系的名称。
备注:sendTransform函数有很多重载
namespa