ROS中使用TF的广播与监听

本文详细介绍了在ROS中如何使用TF进行坐标变换,包括TF广播器的实现,通过监听TF消息获取坐标系变换并控制小海龟运动的原理。通过创建TF广播器广播小乌龟与世界坐标系的变换,然后通过TF监听器获取两个小海龟间的坐标变换,以此实现小海龟的跟随运动。ROS的TF工具包简化了多坐标系转换的过程,通过TF树自动处理坐标系之间的转换。
摘要由CSDN通过智能技术生成

         在使用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,就能够将世界坐标系相对于小乌龟坐标系的坐标变换进行广播。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值