使用tf时 “body“ passed to lookupTransform argument target_frame does not exist

这个问题可能有几个原因:

  1. tf树没有正确更新:你可能需要确保你的tf树已经正确更新,并且"body"帧已经被发布。你可以使用rosrun tf view_frames来查看你的tf树。

  2. 帧名称错误:确保你在调用lookupTransform时使用的帧名称与发布的名称完全匹配,包括大小写和任何下划线。

  3. tf消息延迟:可能是因为tf消息还没有到达,你可以尝试增加等待tf消息的时间。

  4. tf消息没有连续:如果你的tf消息没有连续发布,可能会出现这个问题。你需要确保你的tf消息是连续发布的。

  5. tf树的问题:如果你的tf树有问题,例如有循环依赖或者断开的链,也可能会出现这个问题。你需要检查你的tf树是否有这些问题。

在Rviz中我的body已经可以看到了,然后可以排除第二、四、五的情况,所以我猜测可能是tf消息延迟,所以我增加了睡眠时间

Eigen::Matrix4d getTransform(const string target_frame, const string source_frame){
    static tf2_ros::Buffer buffer;
    static tf2_ros::TransformListener listener(buffer);

    // std::chrono::milliseconds dur(200);
    std::chrono::milliseconds dur(300);
    std::this_thread::sleep_for(dur);
    geometry_msgs::TransformStamped tfs;

    try
    {
        /* code */
        tfs = buffer.lookupTransform(target_frame, source_frame, ros::Time(0));
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
    

    Eigen::Matrix4d T = Eigen::Matrix4d::Identity();


    Eigen::Quaterniond q(tfs.transform.rotation.w, tfs.transform.rotation.x,
                         tfs.transform.rotation.y, tfs.transform.rotation.z);

    T.block<3,3>(0,0) = q.toRotationMatrix();
    T.block<3,1>(0,3) = Eigen::Vector3d(tfs.transform.translation.x,
                                        tfs.transform.translation.y,
                                        tfs.transform.translation.z);
    
    return T;
}

sleep的时间由原来的200增加到了300,发现body就可以找到了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值