使用tf库:编写tf监听器

C++ tf::TransformListener ROS编写机器人的时候,不免会用到坐标变换,而TF是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具。 TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系下的坐标。 使用TF功能包主要有以下两种方式: A:监听tf变换,接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。 B:广播tf变换,向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以 阅读详情

本文主要内容参考自ROS wiki:Writing a tf listener (C++),在加入了自己的一些理解的同时,我也对原文进行了适当的修改。原文使用Creative Commons Attribution 3.0,本文使用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议协议,若使用本文,请自觉遵守相关协议。

上一个教程中,我们创建了一个tf广播器来发布乌龟的位姿信息,这篇文章我们来学习下如何创建tf监听器。该节点的主要任务是监听tf中turtle2到turtle1转换,然后将转换信息转化为速度信息发送给turtle2。

使用到的库

ros基础库(ros/ros.h)就不用提了,必须要添加进来;其次就是tf中的transform_listener.h,这里也不多做说明。由于我们需要将监听到的消息转换为速度消息,因此我们需要geometry_msgs/Twist消息的头文件;另外,我们需要在同一窗口中再生成一个乌龟turtle2,而turtlesim功能包中spawn服务提供了此项功能,因此我们需要spawn服务的头文件。

note:和消息类似,关于服务的创建过程也可以在ROS基础教程中找到:Creating a ROS msg and srv。另外,在ROS初级教程中,我们也曾使用过spawn服务,只不过是使用相应的命令和参数,具体可以参考:Understanding ROS Services and Parameters当然,如果你希望了解spawn(再生)服务的详细信息的话,你可以参考这里:Spawn.h。

调用spawn服务

ros中的基础工作(如初始化、创建节点句柄等),我们就不介绍了。下面介绍下如何调用spawn服务,建议如果有不懂的地方可以查看ros的基础教程:Writing a Simple Service and Client (C++)。

首先等待spawn服务,直到它启动起来;然后创建spawn服务的客户端,以及spawn服务。

ros::service::waitForService("spawn");
ros::ServiceClient add_turtle =
    node.serviceClient<turtlesim::Spawn>("spawn");
turtlesim::Spawn srv;

然后使用客户端调用服务即可:

add_turtle.call(srv);

创建消息发布器

使用下面的命令即可创建消息发布器,这里我们设置消息的类型为geometry_msgs::Twist,发布主题为"turtle2/cmd_vel",缓冲区的大小设置为10;

ros::Publisher turtle_vel =
    node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel", 10);

监听tf

首先,我们需要创建一个监听器用于监听是否存在需要的tf:

tf::TransformListener listener;

然后,我们使用一个循环,在循环中,我们主要完成以下工作:

  • 监听器查找特定的tf
  • 根据查找的tf信息计算相应的速度信息
  • 将速度信息发布给turtle2
// 发布频率为10Hz
ros::Rate rate(10.0);
  while (node.ok()){
    tf::StampedTransform transform;
    try{
      // 查找特定的tf
      listener.lookupTransform("/turtle2", "/turtle1",
                               ros::Time(0), transform);
    }
    catch (tf::TransformException &ex) {
      ROS_ERROR("%s",ex.what());
      ros::Duration(1.0).sleep();
      continue;
    }
    // 根据tf计算速度信息
    geometry_msgs::Twist vel_msg;
    vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
                                    transform.getOrigin().x());
    vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
                                  pow(transform.getOrigin().y(), 2));
    // 发布速度信息给turtle2                             
    turtle_vel.publish(vel_msg);

    rate.sleep();
  }

其中,lookupTransform函数,我们需要详细说明一下。前两个参数是指定从arg1到arg2的tf的,我们这里查找的是从turtle2到turtle1的转换;第三个参数是指定tf的时间的,我们这里使用的是ros::Time(0),这样的话,我们可以获取到最近存在的tf;最后一个参数用来保存查找到的tf。

编译

打开learning_tf功能包下的CMakeList.txt文件,然后在其中添加一下代码:

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

然后,进入你的工作空间编译即可:

cd %YOUR_CATKIN_WORKSPACE_HOME%/
catkin_make

运行

我们仅仅需要在上一篇文章中的launch文件中添加两行代码即可:

  <launch>
    ...
    <node pkg="learning_tf" type="turtle_tf_broadcaster"
          args="/turtle2" name="turtle2_tf_broadcaster" />
    <node pkg="learning_tf" type="turtle_tf_listener" 
          name="listener" />
  </launch>

这里我们利用了上一篇博客中的发布转换信息的节点——turtle_tf_broadcaster,用它我们可以将turtle2的转换也发布出来。只有这样,本文中的节点才能顺利找到turtle1到turtle2的转换。

t12t2

然后启动launch文件即可:

roslaunch learning_tf start_demo.launch

查看结果

使用方向键控制第一个乌龟,你会发现后面的乌龟始终跟着前一个乌龟。

还是和上一篇文章类似,我们使用同样的工具来查看tf转换,首先是tf_echo:

rosrun tf tf_echo /turtle2 /turtle1

当然,为了力求直观,我们可以使用rviz来查看tf转换的信息,具体步骤请查看前面的文章。

到这里,我们已经基本实现了前面介绍的Demo,不过这个Demo还不完善,后面我们会继续完善这个Demo。

参考资料

  1. ROS wiki:Writing a tf listener (C++)
  2. ROS机器人程序设计,机械工业出版社

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

ROS进二阶学习笔记(1) TF 学习笔记3 -- TF Listener 编写 (Python)and Adding frame(Python) ROS TF 学习笔记(3) -- TF Listener 编写 (Python) Ref: http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28Python%29 In the previous tutorials we created a tf broadcaster to publish the po 阅读详情

相关推荐

ROS学习【5】-----ROS TF编程:小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动

ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动 为了探索TF编程中的坐标变换,我们需要了解小乌龟(机器人)头部坐标系相对于全局坐标系的关系是什么样的?机器人夹取的物体相对于机器人中心坐标系的位置?机器人中心坐标系相对于全局坐标系的位置? 这些是我们在进行嵌入式需要探索的坐标变换,只有明确机器人的相对位置,我们才能更好的进行更深入的学习! TF坐标变换实现 广播TF变...

qq_42451251的博客 5569

ROS与Python入门教程-TF-编写tf的listener(监听器)

说明 介绍创建TF监听器使用TF 创建TF监听器 创建节点nodes/turtle_tf_listener.py $ roscd learning_tf $ touch nodes/turtle_tf_listener.py $ chmod +x nodes/turtle_tf_listener.py $ rosed nodes/turtle_tf_listener.py 手工输入代码: #!/usr/bin/env python import roslib roslib.load_manif

BAIFOL的博客 2023

【ROS学习笔记】14.tf坐标系广播与监听的编程实现

文章目录1 创建功能包2 创建代码并编译运行(C++)创建代码编译运行2 创建代码并编译运行(Python)创建代码编译运行 上节学习了坐标管理系统tf的简介和理论,这节讲解TF坐标变换的实现机制广播与监听的编程实现。 (部分图摘自:b站【古月居】古月·ROS入门21讲) 1 创建功能包 创建的 learning_tf 包来进行代码存放和编译。 cd ~/catkin_ws/src catkin_create_pkg learning_tf roscpp rospy tf turtlesim 2 创建代码

takedachia的博客 3938

tf_listener(tf监听)获取yaw值

tf tf::StampedTransform listenTransform; listener.lookupTransform("map", "base", ros::Time(0), listenTransform); /**省略中间一部分代码,直接进入正题**/ theta = tf::getYaw(listenTransform.getRotation()); /** **/

baidu_39489456的博客 1793

相机通用类之海康相机,软触发硬触发(飞拍),并输出halcon格式对象

如何显示图像:可以访问我文章开头的博客,通过编写相机通用类即可,程序中是有继承通用类,通过访问相机通用的获取图像数据,从而传输图像数据。具体可以查看相机通用类。整体过程其实比较简单,由于海康相机没有像一些品牌相机一样可以直接使用序列号开启相机,所以我们需要通过对相机信息进行索引,根据索引到的相机序列号来开启相机。

m0_51559565的博客 7619

泛微Ecology9单点登录实战指南:从Token获取到页面跳转

本文提供了一份详尽的泛微Ecology9单点登录实战指南,重点解析了Token跳转式SSO的核心流程。内容涵盖从理解关键参数(如appid、loginid)与一次性Token机制,到通过代码示例演示如何正确调用接口获取Token,并详细说明了拼接不同场景跳转地址的完整规则与安全实践,旨在帮助开发者高效、稳定地实现业务系统与OA门户的无缝集成。

ol789012345的博客 1061

ROS学习--轻松使用tf

tf是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具,对于非导航专业的同学,常常苦恼与各种旋转矩阵的变换,自己经常被搞的头大,最近由于课题实验的需要,尝试使用tf,对此有了一个初步的了解。很多已经接触ROS有一段时间的朋友,可能都没有真正使用过tf,因为从官方给的例程看起来好像非常繁琐,所以也就不想使用,但是最近一段时间的学习发现,其实真正有用程序的就仅仅几句,所以其实非常简单。

Start_From_Scratch的博客 4万+

基于Pixi.js的Live2D看板娘离线加载实战指南

本文详细介绍了基于Pixi.js实现Live2D看板娘离线加载的完整方案,涵盖环境搭建、模型加载、交互功能实现及常见问题解决。通过Pixi.js的硬件加速优势,开发者可在Web和Electron项目中无缝集成离线运行的Live2D模型,提升用户体验并避免网络依赖问题。

weixin_29001423的博客 343

【ROS2】中级:tf2-编写监听器 (C++)

目标:学习如何使用 tf2 获取帧变换。教程级别:中级时间:10 分钟目录背景先决条件任务1.编写监听节点2.更新启动文件3.构建4.运行摘要背景在之前的教程中,我们创建了一个 tf2 广播器来发布乌龟的姿态到 tf2。在本教程中,我们将创建一个 tf2 监听器以开始使用 tf2。先决条件本教程假设您已经完成了 tf2 静态广播器教程(C++)https://docs.ros....

cxyhjl的博客 1440

正点原子lwIP实战指南——从FreeRTOS移植到网络应用开发

本文详细介绍了如何将轻量级TCP/IP协议栈lwIP移植到FreeRTOS实时操作系统上,并基于正点原子STM32开发板进行网络应用开发。内容涵盖从使用STM32CubeMX快速搭建工程、核心概念解析(RAW/NETCONN/Socket API),到关键的系统适配、驱动实现,并通过TCP Echo服务器和云台控制两个实战案例,手把手指导读者完成从移植到应用开发的全过程,帮助嵌入式开发者快速掌握lwIP在FreeRTOS环境下的稳定部署与开发技巧。

s4t5u6v的博客 1000

视觉辅助RIS波束追踪:用摄像头“看见”用户,实现毫秒级波束对准

在无线通信领域,波束成形技术是提升高频段信号覆盖与质量的核心手段,其原理是通过调整天线阵列的相位,使信号能量在特定方向相干叠加,形成高增益定向波束。这项技术的价值在于能有效克服高频信号路径损耗大、穿透性差的瓶颈,广泛应用于5G/6G、毫米波通信及室内定位等场景。然而,传统波束追踪依赖信道估计或波束扫描,存在训练开销大、实时性差的问题。本文聚焦于一种创新解决方案:将计算机视觉与可重构智能表面(RIS)相结合。通过摄像头直接感知用户位置,并利用RIS快速重构反射波束方向,实现了近乎零开销、毫秒级延迟的波束追踪,

weixin_33552698的博客 620

详解ROS中的TF使用

个人博客:http://www.chenjianqu.com/ 原文链接:http://www.chenjianqu.com/show-107.html 之前写过一篇博文<ROS-坐标转换>介绍了ROS中坐标转换的概念,并给出实例。在次基础上,本文总结了部分常用的TF的API,以供使用的时候查询。 TF 数据类型 tf::Transform 参考:http://do...

陈建驱的博客 6616

【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

这篇文章我们将继续实现曲线射击与两种不需要实体子弹的射击方式 源码在文章末尾。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5058

python监听器_ROS与Python入门教程-TF-编写tf的listener(监听器)

ROS与Python入门教程-TF-编写tf的listener(监听器)说明介绍创建TF监听器使用TF创建TF监听器创建节点nodes/turtle_tf_listener.py$ roscd learning_tf$ touch nodes/turtle_tf_listener.py$ chmod +x nodes/turtle_tf_listener.py$ rosed nodes/turtl...

weixin_39534149的博客 699

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3572

万字长文解密:SAP Fiori 首屏加载缓慢背后的真相

什么是一个健康理想的 Fiori 首次加载状态?FLP 首页不臃肿,用户默认看见的内容不多但足够用缓存作业按规则运行,冷启动不至于每次都从零开始应用首屏只读必要数据,UI5 资源经过 preload,视图异步加载OData 服务字段克制、分页合理、缓存分层清楚后台 CDS 与 HANA 只为当前屏幕做最必要的工作。只要这些标准同时满足,用户第一次打开 Fiori 页面的体感通常会从明显卡顿变成可接受甚至顺滑。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 556

ROS学习笔记:TF坐标变换及编程详解

ROS学习笔记:TF坐标变换及编程详解1. 前言及TF简介2. TF编程实例详解2.1 常用数据类型2.2 TF使用流程2.3 TF广播器2.4 TF监听器3 TF编程练习参考 1. 前言及TF简介 2. TF编程实例详解 这边以ROS Wiki上给出的TF编程实例作为降解对象 2.1 常用数据类型 参考ROS Wiki上面给出的TF数据类型,主要有以下几种基本类型,分别对应四元数,向量,点坐标,...

moumde的博客 8194

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

ROS——一文读懂:tf变换

https://www.guyuehome.com/355

xiaohu的博客 8333

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ROS-TF库-写一个TransformListener监听器

1.TransformListener监听器类 TransformListener监听,即tf数据接收 tf包提供了TransformListener的实现,以帮助简化接收tf变换数据的任务。 要使用TransformListener,我们需要包含tf/transform_Listener.h头文件。 如下是监听接收一个turtle1到turtle2的一个坐标变换,计算tf关系,并发布控制tur...

明夷TEC的博客 8415

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【ROS2】中级:tf2-编写监听器(Python)

目标:学习如何使用 tf2 获取帧变换。教程级别:中级时间:10 分钟目录背景先决条件任务1. 编写监听节点2. 更新启动文件3. 构建4. 运行摘要背景在之前的教程中,我们创建了一个 tf2 广播器来发布乌龟的姿态到 tf2。在本教程中,我们将创建一个 tf2 监听器以开始使用 tf2。先决条件本教程假设您已经完成了 tf2 静态广播器教程(Python)和 tf2 广播器教程(...

cxyhjl的博客 1393

ROS小白学习历程(tf)--实现tf监听器

相关功能包配置请见上篇博客: https://blog.youkuaiyun.com/qq_43481884/article/details/102768426 核心实现过程 1、创建tf监听器 tf::TransformListener listener; 2、调用两个接口实现tf监听 listener.waitForTransform("/turtle2", "/turtle1", ros::Time...

qq_43481884的博客 2313

ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)

ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版)我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LTS ROS 版本:ROS Indigo 1. 这一节要做的事情:上一节我们已经编写了一个广播员的程序,下面我们编写一个监听器程序来监听广播员发布的小海龟的坐标系信息:监听器程序:利用

AoboSir.com 1万+

TF坐标变换

TF坐标变换 坐标变换是机器人学中一个非常基础,同时也是非常重要的概念。机器人本体和机器人的工作环境中往往存在大量的组件元素,在机器人设计和机器人应用中都会涉及不同组件的位置和姿态,这就需要引入坐标系和坐标变换的概念。 对于A,B两个坐标系,A坐标系下的位姿可以通过平移和旋转变换成B坐标系下的位姿,这里的平移和旋转可以通过4×4的变换矩阵来描述。 坐标变换是机器人系统中常用的基础功能,ROS中的坐...

W_Tortoise的博客 3830

ROS学习笔记6 —— TF的使用

1. tf数据类型 在tf/transform_datatypes.h中定义,基本数据类型有:Quaternion, Vector, Point, Pose, Transform tf::Stamped 对上述数据类型做模板化(除了tf::Transform),并附带元素frame_id_和stamp_ tf::StampedTransform 是tf::Transforms的特例,它要求fr...

罗伯特祥的博客 5527

ROS tf功能的使用

ROS tf功能的使用 参考:古月居21讲 注:仅作为我个人备忘,不作为读者教程 tf广播功能的介绍 #include<ros/ros.h> #include<turtlesim/Twist.h> #include<turtlesim/Pose.h> #include<tf/transform_broadcaster.h> std::string turtle_name; void poseCallback(const turtlesim::PoseC

qq_43569735的博客 1099

ROS-TF库-TF和ros::Time(0)

1 tf和时间 在前面的教程中,我们学习了tf如何跟踪坐标系树。此树随时间变化,tf为每个转换存储一个时间快照(默认为最多10秒)。到目前为止,我们使用lookupTransform()函数访问该tf树中最新的可用转换,而不知道该转换是在什么时候记录的。 2 ros::Time(0)和ros::Time::now() 前面的listener中如下: try{ listen...

明夷TEC的博客 5032
上一篇: 关于TF转换信息(Transforms)的理解
下一篇: 虚拟机安装ubuntu花屏问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值