TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系的坐标.
使用:
链接
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
#include <string.h>
std::string turtle_name;
void posecallback(const turtlesim::PoseConstPtr &msg)
{
static tf::TransformBroadcaster br; // 创建一个tf发布对象
tf::Transform transform; // 创建一个tf对象
transform.setOrigin(tf::Vector3(msg->x,msg->y,0)); //设置turtle_name在world下的坐标原点
tf::Quaternion q; //创建一个4元数类
q.setRPY(0,0,msg->theta); //turtle_name相对于world的旋转;进行RPY旋转,更新四元组
transform.setRotation(q); //旋转
br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));}
//发送旋转信息
int main(int argc,char ** argv)
{
ros::init(argc,argv,"tf_broadcaster");
if(argc !=2)
{
ROS_ERROR("need turtle name");
return -1;
}
turtle_name=argv[1];
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe(turtle_name+"/pose",10,&posecallback);
ros::spin();
return 0;
}
使用rosrun tf tf_echo /world /turtle1
查看
监听:
tf::TransformListener listener ;//监听器
tf::StampedTransform transform; //定义存放变换关系的变量
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
添加其他坐标系
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );//相对距离
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );//相对角度
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "base_link", "carrot1"));//新建了carrot1
//参数:存储两个坐标系的转换矩阵transform;
//时间戳;
//父坐标系;
//新的坐标系
.waitForTransform函数
listener.waitForTransform("/turtle2", "/turtle1",
now, ros::Duration(3.0))
//监听从"turtle2"到"/turtle1"的转换(到座标系到子坐标系)
//"/turtle2":父坐标系
// "/turtle1":子坐标系
//now 时间戳,一般用做数据的=时间戳
//ros::Duration(3.0) 最长等待时间
listener.lookupTransform("/turtle2",now, "/turtle1", past, transform);
//now 可省略,当前时间
//past 写入"/turtle1"的时间戳