目标:学习如何使用 tf2 获取帧变换。
教程级别:中级
时间:10 分钟
目录
背景
先决条件
任务
1. 编写监听节点
2. 更新启动文件
3. 构建
4. 运行
摘要
背景
在之前的教程中,我们创建了一个 tf2 广播器来发布乌龟的姿态到 tf2。
在本教程中,我们将创建一个 tf2 监听器以开始使用 tf2。
先决条件
本教程假设您已经完成了 tf2 静态广播器教程(Python)和 tf2 广播器教程(Python)。在上一个教程中,我们创建了一个 learning_tf2_py
包,我们将继续在此基础上进行工作。
任务
1. 编写监听节点
让我们首先创建源文件。转到我们在上一个教程中创建的 learning_tf2_py
包。在 src/learning_tf2_py/learning_tf2_py
目录中,通过输入以下命令下载示例监听器代码:
wget https://raw.githubusercontent.com/ros/geometry_tutorials/ros2/turtle_tf2_py/turtle_tf2_py/turtle_tf2_listener.py
现在使用您喜欢的文本编辑器打开名为 turtle_tf2_listener.py
的文件。
# 版权 2021 开源机器人基金会,公司。
#
# 根据Apache许可证版本2.0(“许可证”)许可;
# 除非符合许可证,否则不得使用此文件。
# 您可以在以下位置获取许可证副本:
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# 除非适用法律要求或书面同意,否则在许可证下分发的软件
# 将按“原样”基础分发,无任何形式的明示或暗示
# 保证或条件。有关在许可证下管理权限和
# 限制的语言,请参阅许可证。
import math # 导入数学库
from geometry_msgs.msg import Twist # 从geometry_msgs包导入Twist消息
import rclpy # 导入ROS客户端库
from rclpy.node import Node # 从rclpy.node导入Node类
from tf2_ros import TransformException # 从tf2_ros导入TransformException异常
from tf2_ros.buffer import Buffer # 从tf2_ros.buffer导入Buffer类
from tf2_ros.transform_listener import TransformListener # 从tf2_ros.transform_listener导入TransformListener类
from turtlesim.srv import Spawn # 从turtlesim.srv导入Spawn服务
class FrameListener(Node): # 定义FrameListener类,继承自Node类
def __init__(self): # 定义初始化函数
super().__init__('turtle_tf2_frame_listener') # 调用父类初始化函数,设置节点名为'turtle_tf2_frame_listener'
# 声明并获取`target_frame`参数
self.target_frame = self.declare_parameter(
'target_frame', 'turtle1').get_parameter_value().string_value # 声明并获取'target_frame'参数,默认值为'turtle1'
self.tf_buffer = Buffer() # 创建tf缓冲区
self.tf_listener = TransformListener(