ROS 2边学边练(37)-- 使用时间参数(C++)

embedded/2024/10/11 13:23:58/

前言

        在前几篇内容中,我们已经了解过了tf2广播、tf2监听,并且还了解了如何添加一个坐标系到tf2树图中,以及如何查看坐标系间的转换情况。实际上,是通过lookupTransform函数来查找的,这个函数允许我们查找所有的转换数据(我们并不需要了解这些数据是在何时被记录下来的),这节我们将学习如何获取一个特定时间的转换数据。

动动手

tf2和时间

        我们打开learing_tf2_cpp包下的turtle_tf2_listener.cpp,重点关注下面这块代码:

try {t = tf_buffer_->lookupTransform(toFrameRel,fromFrameRel,tf2::TimePointZero);
} catch (const tf2::TransformException & ex) {

        lookupTransform函数一共传入了3个参数,前两个分别是目标帧和源帧,最后一个是tf2::TimePointZero,其值为0,数据类型是tf2中关于时间的数据类型tf2::TimePoint(许多API都会自动处理rclcpp::time和tf2::TimePoint之间的转换),在tf2包中,这个值为0代表的是缓存中最新的可用的转换数据,我们现在来改变下这个参数(用rclcpp里面的形式),修改如下:

rclcpp::Time now = this->get_clock()->now();
try {t = tf_buffer_->lookupTransform(toFrameRel, fromFrameRel,now);
} catch (const tf2::TransformException & ex) {

        定义一个now变量(rclcpp::Time类型),其值为系统当前时间,重新构建下learning_tf2_cpp包,并启动launch文件:

$ros2 launch learning_tf2_cpp turtle_tf2_demo_launch.py

        但是我们会得到如下的反馈信息,当前时间查找不到转换数据:

        首先每一个tf2监听者节点都会保存所有tf2广播者发出的坐标转换数据到一个缓存中,其次,当一个tf2广播者发出数据到一个tf2监听者保存数据到缓存,这个过程需要毫秒级的时间消耗。所以上面的现象就很好理解了,我们要查找当前这个点的数据,但它还在路上,若干毫秒后才会被保存到缓存区,那个时候才能查找到。

等待转换数据 

        那么我们是不是可以设置个等待时间呢(超时时间),等待时间内数据到达则返回转换数据,如无,则一直阻塞在这里直到有数据或者到达超时时间。

        修改如下:

rclcpp::Time now = this->get_clock()->now();
try {t = tf_buffer_->lookupTransform(toFrameRel,fromFrameRel,now,50ms);
} catch (const tf2::TransformException & ex) {

        添加了第四个参数为50ms,我们再重新构建包试试看。

检查结果

        没有报错了,如果超时了还没数据,程序就会根据代码里面写的那样抛出一个异常(比如我们可以将超时时间改成2ms,此时就会抛出异常)。 

本篇完。 


http://www.ppmy.cn/embedded/25757.html

相关文章

UE5蓝图 函数勾选线程安全的意义,我在动画蓝图状态机中调用了函数(gpt答复分享)

在Unreal Engine中,蓝图函数的“线程安全”选项通常用于确定该函数是否可以安全地在多线程环境下调用。线程安全意味着函数在执行时不会导致数据竞争,状态错误,或其他并发问题。如果一个函数是线程安全的,它就可以在不同的线程中同…

GET 和 POST 请求方式的区别

GET 和 POST 请求方式的区别 GET请求和POST请求在HTTP通信中有着不同的用途和限制。以下是两者之间的一些主要区别: URL可见性 GET请求的参数直接附加在URL后面,因此可以被用户看到POST请求的参数位于请求体中,对URL参数是不可见的 数据传输方…

kubernetes 之 一键安装prometheus

kubernetes上安装prometheus prometheus官网: https://github.com/prometheus-operator/kube-prometheus 按照官网下载对应版本 相对稳定一些 这里我们k8s 是1.28 版本的 相对应的下载 0.13 版本 rootmaster2:~# git clone https://github.com/prometheus-operato…

第三方登录以及微信小程序一键登录的实现方案

文章目录 场景解决 场景 第三方登录以及微信小程序一键登录的实现方案, 作下记录 解决 第三方登录 JustAuth微信小程序一件登录 wxjava

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

309. 买卖股票的最佳时机含冷冻期

309. 买卖股票的最佳时机含冷冻期 题目链接:309. 买卖股票的最佳时机含冷冻期 代码如下: /* 转移方程:dp[i][0] max(dp[i - 1][0], max(dp[i - 1][3], dp[i - 1][1]) - prices[i]);dp[i][1] max(dp[i - 1][1], dp[i - 1][3]);dp[i][2] d…

Python urllib 爬虫入门(2)

本文为Python urllib类库爬虫更入门的一些操作和爬虫实例及源码。 目录 模拟浏览器请求 简单模拟 设置随机user-agent 请求超时 HTTP请求类型 Get请求 Post请求 抓取网页动态请求 封装ajax请求 调用 循环调用 抓取小说 封装请求函数 把html写入本地分析 调用 正…

深度学习系列66:试穿模型IDM-VTON上手

1. 模型概述 如图,总体流程为: 输入为:衣服的编码xg;人物noise的编码xt;人物身上衣物的mask和人体pose分割(densepose);衣服部分经过两部分网络:1)高级语义网络IP-Adapter&#xff…