TF2中 监听者 对于 时间的控制

本文涉及的产品
资源编排,不限时长
简介: 这篇博客讲解 如何在使用lookupTransform() 函数时, 监听指定时间一定延时内的 可以用的坐标变换

这篇博客讲解 如何在使用lookupTransform() 函数时, 监听指定时间一定延时内的 可以用的坐标变换

1、TF2 和 时间

在之前的博客 TF2 监听者的例子中 , 可以 获取 坐标变换树中 最新的 信息。

坐标变换树随时间改变,TF2会存储1段时间,每个坐标系的变换信息(默认是10s)

当我们通过使用lookupTransform() 函数获得最新的有效坐标变换时,并不知道这个变化发生的具体时间。可能由于某种原因 得到了很久之前的 坐标变换,导致系统出现错误。

例如 在1s时产生了有效的坐标变换,后发生故障,在10s时,我们像以前一样获取坐标变换,此时依然可以成功获取,但是是1s时产生的,类似这种情况就不是我们想要的了。 下面 主要讲解避免这种情况的方法

获取一个坐标变换在指定的时间

2、初步尝试 在指定时间获得 坐标变换

打开 TF2 监听者的例子 就是这篇博客写的

把 src/turtle_tf2_listener.cpp 这个文件 的 lookupTransform() 函数 进行 修改

改成下面的形式

把坐标系设置为 乌龟2 和 乌龟1 , 时间 改 为 now

之前是这样

  try{
    transformStamped = tfBuffer.lookupTransform("turtle2", "turtle1", ros::Time(0));
  } catch (tf2::TransformException &ex) {
    ROS_WARN("Could NOT transform turtle2 to turtle1: %s", ex.what());
  }

改成这样

  try{
    transformStamped = tfBuffer.lookupTransform("turtle2", "turtle1", ros::Time::now());
  } catch (tf2::TransformException &ex) {
    ROS_WARN("Could NOT transform turtle2 to turtle1: %s", ex.what());
  }
  • ros::Time(0) 指的是 在buffer中最新可用的坐标变换
  • ros::Time::now() 指的是 当前的坐标变换

编译运行下

会发现乌龟2 不像 之前例子中会自动跑到乌龟1 处

坐标变换失败了,原因如下:

每一个监听者会用一个buffer取存储所有的坐标变换有广播者发布的。当广播者发布一个坐标变换,会花一点时间存在buffer中,通常时几毫秒(0.007s)。所有当请求一个坐标变换的时间为 ros::Time::now() 的时候,不会立马有,要等几毫秒。

所有上面直接写 ros::Time::now() 这个方式就失败了

3、等待坐标变换

TF2 提供了 一种方式 ,在指定的时间上,等待一段时间 有效的坐标变换到来。

lookupTransform()函数有第四个参数,就是做这个用的。

把该部分代码改成如下形式

  try{
    transformStamped = tfBuffer.lookupTransform("turtle2", "turtle1", ros::Time::now(), 
                                                ros::Duration(3.0));
  } catch (tf2::TransformException &ex) {
    ROS_WARN("Could NOT transform turtle2 to turtle1: %s", ex.what());
  }

ros::Duration(3.0) 这个 就是 说明 在请求当前时刻的坐标变换时 允许等待 3 s 的时间。

改成这种方式 再编译 运行

乌龟2 又会自动回到 乌龟1 上

在大部分的 TF2 使用的情况下 ros::Time(0) 使用的情况 更多些 。

ros::Time::now() 加 ros::Duration(3.0) 更加 严谨。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
6月前
|
自然语言处理
在ModelScope中,你可以通过设置模型的参数来控制输出的阈值
在ModelScope中,你可以通过设置模型的参数来控制输出的阈值
144 1
|
存储 运维 网络协议
如何实现 呼叫速率(caps) 值控制
首先,企业需要明确的是呼叫中心系统搭建的目的。搭建这个呼叫中心是想用来做什么呢? 是为了企业当做呼入型的客服使用? 还是用来当电话外呼使用? 是企业想做营销用呢还是政府单位办公使用? 是要做外包服务呢还是自己用? 是想挣钱用呢还是想做客户服务使用? 需求 呼叫中心的搭建肯定有需求,这就要把一份需求文档写出来。比如想要做什么,每一点写的清清楚楚: 需求包括现在有什么? 碰到了什么问题? 以后想整成什么样? 设置,扩容以及升级的快速,成本与灵活性 一个企业的业务、流程与规模有时候随着市场的快速成长会有很大的变化。这时候,企业的呼叫中心系统就要能够快速的适应市场,能让企业做出适当的调整。比如,呼叫中
|
3月前
|
JavaScript 前端开发 API
【Azure 应用服务】Azure Function HTTP 触发后, 230秒就超时。而其他方式触发的Function, 执行5分钟后也超时,如何调整超时时间?
【Azure 应用服务】Azure Function HTTP 触发后, 230秒就超时。而其他方式触发的Function, 执行5分钟后也超时,如何调整超时时间?
上下文本间隔自定义滚动时间的封装函数
上下文本间隔自定义滚动时间的封装函数
57 0
上下文本间隔自定义滚动时间的封装函数
|
机器学习/深度学习 5G
beamManagement(一)idle初始接入过程
NR中所有的上下行信道的发送和接收都是基于波束。基站通过对信道质量的测量来动态选择UE和基站之间波束的方向和频率,进而完成通信。NR使用的频率信号是高频信号,高频意味着波长越短,天线也就越短。当无线信号辐射变为波束形状后,就很难使用单个的天线传输同时覆盖多个UE,因而NR的天线数量大大增加,形成更多波束,提升覆盖;NR使用Massive MIMO技术时,就需要使用大规模天线阵列,进而实现多用户空分,提升频谱利用率; 提升能量利用率,满足覆盖需求(特别是高频)。beam forming 不是本篇的重点(其实我也不太会),可以百度看下具体内容。这里只关注3GPP spec中相关的波束管理的内容。
|
Serverless
在函数计算中实现定时触发自定义环境中的 HTTP 函数
在函数计算中实现定时触发自定义环境中的 HTTP 函数
95 0
Layer 开启与关闭加载层
Layer 开启与关闭加载层
65 0
|
算法
m基于wcdma的软切换性能matlab仿真,对比平均激活集数(MASN)激活集更新率(ASUR)以及呼叫中断概率(OP)三个性能指标
m基于wcdma的软切换性能matlab仿真,对比平均激活集数(MASN)激活集更新率(ASUR)以及呼叫中断概率(OP)三个性能指标
108 0
m基于wcdma的软切换性能matlab仿真,对比平均激活集数(MASN)激活集更新率(ASUR)以及呼叫中断概率(OP)三个性能指标
|
TensorFlow 算法框架/工具
TensorFlow自定义回调函数【全局回调、批次、epoch】
TensorFlow自定义回调函数【全局回调、批次、epoch】
180 0
|
缓存 C++
TF2 坐标变换 监听 实例
TF2 坐标变换 监听 实例
TF2 坐标变换 监听 实例