机器人系统ros2-开发实践08-了解如何使用 tf2 来访问坐标帧转换(Python)

tf2 库允许你在 ROS 节点中查询两个帧之间的转换。这个查询可以是阻塞的,也可以是非阻塞的,取决于你的需求。下面是一个基本的 Python 示例,展示如何在 ROS 节点中使用 tf2 查询帧转换。

本教程假设您已完成tf2 静态广播器教程 (Python)和tf2 广播器教程 (Python)。在上一个教程中,我们创建了一个learning_tf2_py包。机器人系统ros2-开发实践06-将静态坐标系广播到 tf2(Python)-定义机器人底座与其传感器或非移动部件之间的关系

步骤1:

1 编写监听节点

我们首先创建源文件。转到learning_tf2_py我们在上一教程中创建的包。在src/learning_tf2_py/learning_tf2_py目录中新建turtle_tf2_listener.py,用vscode 打开文件,将下面的代码贴入文件中。

代码如下:

import mathfrom geometry_msgs.msg import Twistimport rclpy
from rclpy.node import Nodefrom tf2_ros import TransformException
from tf2_ros.buffer import Buffer
from tf2_ros.transform_listener import TransformListenerfrom turtlesim.srv import Spawnclass FrameListener(Node):def __init__(self):super().__init__('turtle_tf2_frame_listener')# Declare and acquire `target_frame` parameterself.target_frame = self.declare_parameter('target_frame', 'turtle1').get_parameter_value().string_valueself.tf_buffer = Buffer()self.tf_listener = TransformListener(self.tf_buffer, self)# Create a client to spawn a turtleself.spawner = self.create_client(Spawn, 'spawn')# Boolean values to store the information# if the service for spawning turtle is availableself.turtle_spawning_service_ready = False# if the turtle was successfully spawnedself.turtle_spawned = False# Create turtle2 velocity publisherself.publisher = self.create_publisher(Twist, 'turtle2/cmd_vel', 1)# Call on_timer function every secondself.timer = self.create_timer(1.0, self.on_timer)def on_timer(self):# Store frame names in variables that will be used to# compute transformationsfrom_frame_rel = self.target_frameto_frame_rel = 'turtle2'if self.turtle_spawning_service_ready:if self.turtle_spawned:# Look up for the transformation between target_frame and turtle2 frames# and send velocity commands for turtle2 to reach target_frametry:t = self.tf_buffer.lookup_transform(to_frame_rel,from_frame_rel,rclpy.time.Time())except TransformException as ex:self.get_logger().info(f'Could not transform {to_frame_rel} to {from_frame_rel}: {ex}')returnmsg = Twist()scale_rotation_rate = 1.0msg.angular.z = scale_rotation_rate * math.atan2(t.transform.translation.y,t.transform.translation.x)scale_forward_speed = 0.5msg.linear.x = scale_forward_speed * math.sqrt(t.transform.translation.x ** 2 +t.transform.translation.y ** 2)self.publisher.publish(msg)else:if self.result.done():self.get_logger().info(f'Successfully spawned {self.result.result().name}')self.turtle_spawned = Trueelse:self.get_logger().info('Spawn is not finished')else:if self.spawner.service_is_ready():# Initialize request with turtle name and coordinates# Note that x, y and theta are defined as floats in turtlesim/srv/Spawnrequest = Spawn.Request()request.name = 'turtle2'request.x = float(4)request.y = float(2)request.theta = float(0)# Call requestself.result = self.spawner.call_async(request)self.turtle_spawning_service_ready = Trueelse:# Check if the service is readyself.get_logger().info('Service is not ready')def main():rclpy.init()node = FrameListener()try:rclpy.spin(node)except KeyboardInterrupt:passrclpy.shutdown()

2 代码说明:

TransformListener以帮助简化接收转换的任务。

from tf2_ros.transform_listener import TransformListener

在这里,我们创建一个TransformListener对象。创建侦听器后,它开始通过线路接收 tf2 转换,并将它们缓冲最多 10 秒。

self.tf_listener = TransformListener(self.tf_buffer, self)

最后,我们向侦听器查询特定的转换。我们lookup_transform使用以下参数调用方法:
提供rclpy.time.Time()只会为我们提供最新的可用转换。所有这些都包含在 try- except 块中以处理可能的异常

t = self.tf_buffer.lookup_transform(to_frame_rel,from_frame_rel,rclpy.time.Time())

3 新增启动入口点

要允许命令运行您的节点,您必须将入口点添加到src/learning_tf2_py 的setup.py ,在setup.py 文件里找到console_scripts,在括号之间添加以下行

'turtle_tf2_listener = learning_tf2_py.turtle_tf2_listener:main',

在这里插入图片描述

3.1 更新启动文件

使用文本编辑器打开目录中调用的启动文件src/learning_tf2_py/launch,向启动描述turtle_tf2_demo.launch.py添加两个新节点,添加启动参数,然后添加导入。生成的新的文件应如下所示:

from launch import LaunchDescription
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfigurationfrom launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='turtlesim',executable='turtlesim_node',name='sim'),Node(package='learning_tf2_py',executable='turtle_tf2_broadcaster',name='broadcaster1',parameters=[{'turtlename': 'turtle1'}]),DeclareLaunchArgument('target_frame', default_value='turtle1',description='Target frame name.'),Node(package='learning_tf2_py',executable='turtle_tf2_broadcaster',name='broadcaster2',parameters=[{'turtlename': 'turtle2'}]),Node(package='learning_tf2_py',executable='turtle_tf2_listener',name='listener',parameters=[{'target_frame': LaunchConfiguration('target_frame')}]),])

这将声明一个target_frame启动参数,为我们将生成的第二只海龟启动一个广播器,以及将订阅这些转换的坐标侦监听器。

3 构建

在工作区的根目录中运行rosdep以检查是否缺少依赖项。

rosdep install -i --from-path src --rosdistro humble -y

在这里插入图片描述

仍然在工作区的根目录中构建您的包:

colcon build --packages-select learning_tf2_py

在这里插入图片描述

打开一个新终端,导航到工作区的根目录,然后获取安装文件:

. install/setup.bash

4 运行

现在您已准备好开始完整的海龟演示:
在工作区的根目录执行

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

看到有两个海龟,另外一个会向其中一个自动靠齐

在这里插入图片描述

您应该会看到海龟模拟卡上有两只海龟。在第二个终端窗口中键入以下命令:

ros2 run turtlesim turtle_teleop_key

在这里插入图片描述

要查看是否有效,只需使用箭头键围绕第一只乌龟行驶(确保您的终端窗口处于活动状态,而不是模拟器窗口),您将看到第二只乌龟紧随第一只乌龟!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 5月10日,星期五

每天一分钟,知晓天下事! 2024年5月10日 星期五 农历四月初三 1、 商务部:汽车以旧换新补贴可与新能源汽车购置税减免等叠加享受。 2、 教育部:京津优质中小学基础教育资源同雄安共享。 3、 医保局:发挥零售药店等不同…

HarmonyOS NEXT星河版之美团外卖点餐功能实战(上)

文章目录 一、目标二、开撸2.1 目录结构2.2 页面模块拆分2.3 主体拆分布局2.4 底部购物车布局2.5 顶部布局2.6 点菜布局---左2.7 菜品Item封装2.7 点菜布局---右2.8 主页面整体布局 三、小结 一、目标 二、开撸 2.1 目录结构 2.2 页面模块拆分 将页面主体拆为三部分&#xff…

Middle for Mac:简洁高效的文本编辑软件

追求简洁与高效?Middle for Mac将是您文本编辑的最佳选择。这款Mac平台上的文本编辑器,以其独特的魅力和实用的功能,赢得了众多用户的喜爱。 Middle注重用户体验,采用简洁直观的界面设计,让您能够迅速上手并享受高效的…

204. 计数质数

Problem: 204. 计数质数 文章目录 思路解题方法复杂度Code 思路 这个问题的关键是找出小于n的所有质数。质数是只有两个正因数(1和它自身)的自然数,且必须大于1。 解题方法 我们可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes&a…

【设计模式】JAVA Design Patterns——Abstract-document

🔍 目的 使用动态属性,并在保持类型安全的同时实现非类型化语言的灵活性。 🔍 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全,并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

docker学习笔记(五):harbor仓库搭建与简单应用

harbor私有仓库 简介 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管…

组件目录存放问题

目录 一、思考引入 二、组件分类 三、组件分类的目的 一、思考引入 .vue文件本质无区别,而路由相关的组件,为什么要放在views目录呢? 二、组件分类 .vue文件分2类:页面组件和复用组件。注意:都是.vue文件&#xff…

【八股系列】React中props和state的区别是什么?

React中props和state的区别是: props是用来从父组件向子组件进行传递数据的,在子组件中可以用props来接收到父组件传递过来的参数。props是不可变的,用户不能在子组件中修改props的值,因为从父组件中传递过来的值被认为是不可变数…

HJ19 简单错误记录

问题概要 开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 对应牛客网题目HJ19 简单错误记录 思路分析 其实这个题目并没有用到特别复杂的技巧,重点是对字符串的处理,以及模拟整个记录的过程。 代码实现 #include…

漫画对话 ai翻译

復讐の教科書ーー81 81-1 いい加減吐け!!冴木!! 快说吧!!冴木!! お前が一連の事件の犯人なんだろ!? 你就是连续事件的犯人吧!? だか…

400G QSFP-DD光模块的分类及应用领域

400G QSFP-DD光模块是一种光通信设备,具有高带宽和高密度的特点,适用于各种数据中心和通信网络。本文将介绍400G QSFP-DD光模块的分类和应用领域。 400G QSFP-DD光模块的分类 400G QSFP-DD光模块可以根据其传输速率、光纤类型和工作距离等因素进行分类。…

SpringBoot的启动器——Spring-boot-starter介绍和常见启动器

1、Starter是什么 Spring Boot通过将我们常用的功能场景抽取出来,做成的一系列的启动器,我们只需要在项目中引入这些starter,相关的所有依赖就会全部被导入进来,并且我们可以抛弃繁杂的配置,例如: ​ spri…

探索Java的未来:创新与演进的旅程

探索Java的未来:创新与演进的旅程 Java,这个被誉为“一次编写,到处运行”的编程语言,自1995年诞生以来,一直以其跨平台性、面向对象和强大的安全性而著称。随着技术的不断进步和市场的不断变化,Java也在不…

游戏工作室如何利用惯性动作捕捉技术制作动画?

随着动捕设备不断进步和游戏行业的发展,惯性动作捕捉技术在游戏开发领域逐渐普及。惯性动作捕捉技术,可以精准捕捉现实世界中的真人动作,并将其精准应用于虚拟角色上,使游戏中的角色动作可以呈现出更写实、逼真和沉浸感&#xff0…

##10 卷积神经网络(CNN):深度学习的视觉之眼

文章目录 前言1. CNN的诞生与发展2. CNN的核心概念3. 在PyTorch中构建CNN4. CNN的训练过程5. 应用:使用CNN进行图像分类5. 应用:使用CNN进行时序数据预测代码实例7. 总结与展望前言 在深度学习的领域中,卷积神经网络(CNN)已经成为视觉识别任务的核心技术。自从AlexNet在2…

光伏设备制造5G智能工厂数字孪生可视化平台,推进行业数字化转型

光伏设备制造5G智能工厂数字孪生可视化平台,推进行业数字化转型。光伏设备制造5G智能工厂数字孪生可视化平台是光伏行业数字化转型的重要一环。通过数字孪生平台,光伏设备制造企业可以实现对生产过程的全面监控和智能管理,提高生产效率&#…

ESP32-C3模组上跑通MQTT(4)

接前一篇文章:ESP32-C3模组上跑通MQTT(3) 本文内容参考: 《ESP32-C3 物联网工程开发实战》 特此致谢! 上一回讲到了MQTT的消息格式,讲解了MQTT控制报文中的固定头中的控制报文的类型、消息质量等级和标志…

基于51单片机的智能导盲手杖—超声波测距

基于51单片机的智能导盲手杖 (仿真+程序原理图+PCB设计报告) 功能介绍 具体功能: 1.显示前方障碍物距离。 2.实时测量距离,并通过蜂鸣器提醒距离过短,蜂鸣器蜂鸣发出预警。 3.可以通过按键调…

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型,增加数据集的规模可以帮助你获得更好…

ubantu安装rabbbitmq

ubantu安装rabbbitmq 安装Erlang1、在linux下直接安装2、上传Erlang文件后解压 安装rabbitmq开启web管理接口创建用户及修改guest密码,删除guest默认账号 安装Erlang 1、在linux下直接安装 #运行以下命令直接安装: sudo apt-get install erlang#可运行…