在使用ROS下的TF工具包进行坐标变换,我们需要对各个坐标系进行广播和监听。网上有很多的例程,这里使用的也是常用的例程,不过一般书籍和网上没有对程序中的内容进行详细地解释,这里对其进行详细地解释说明。
TF广播器:
我们创建一个发布小乌龟坐标与世界坐标系TF变换的节点,其代码具体内容如下(记得在CMakeList文件加上依赖项):
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
//TF广播器
static tf::TransformBroadcaster br;
//根据乌龟当前的位姿。设置相对于世界坐标系的坐标变换
tf::Transform transform;
transform.setOrigin(tf::Vector3(msg->x,msg->y,0.0));//设置平移变换
tf::Quaternion q;
q.setRPY(0,0,msg->theta);
transform.setRotation(q);//设置角度变换
//发布坐标变换
br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));
}
int main(int argc,char** argv)
{
ros::init(argc, argv, "my_tf_broadcaster");
if(argc!=2)
{
ROS_ERROR("need turtle name as argument");
return -1;
}
turtle_name=argv[1];
ros::NodeHandle node;
ros::Subscriber sub=node.subscribe(turtle_name+"/pose",10,&poseCallback);
ros::spin();
return 0;
}
先从主函数分析,首先常规操作,初始化节点,判断命令行中是否有出现坐标系的输入,若没有,报错,生成节点句柄,定义一个subscriber,订阅的是小乌龟的pose消息,循环等待启动回调函数。
回调函数:先定义一个tf广播器,定义一个TF中坐标变换的类型,将订阅到的pose中的相对于世界坐标系下的位置和旋转角度对transform进行设置,最后将坐标变换,当前时间,源坐标系和目标坐标系等信息进行广播、插入TF树中。
我们可以看出该广播函数只需知道小乌龟的pose,就能够将世界坐标系相对于小乌龟坐标系的坐标变换进行广播。