目标:学习如何向 tf2 添加额外的框架。
教程级别:中级
时间:15 分钟
目录
背景
tf2 树
任务
1 编写固定帧广播器
1.1 检查代码
1.2 添加入口点
1.3 编写启动文件
1.4 构建
1.5 运行
2 编写动态帧广播器
2.1 检查代码
2.2 添加入口点
2.3 编写启动文件
2.4 构建
2.5 运行
摘要
背景
在之前的教程中,我们通过编写 tf2 广播器和 tf2 监听器重新创建了乌龟演示。本教程将教您如何向变换树添加额外的固定和动态帧。事实上,在 tf2 中添加帧与创建 tf2 广播器非常相似,但本示例将向您展示 tf2 的一些附加功能。
对于许多与变换相关的任务,在局部坐标系中思考更容易。例如,最容易在激光扫描仪中心的坐标系中推理激光扫描测量值。tf2 允许您为系统中的每个传感器、链接或关节定义一个局部坐标系。当从一个坐标系变换到另一个坐标系时,tf2 将处理所有引入的隐藏中间坐标系变换。
任务
1 编写固定帧广播器
在我们的乌龟示例中,我们将添加一个新的框架 carrot1
,它将是 turtle1
的子框架。这个框架将作为第二只乌龟的目标。
首先创建源文件。进入我们在前面的教程中创建的 learning_tf2_py
包。在 src/learning_tf2_py/learning_tf2_py
目录中,通过输入以下命令下载固定帧广播代码:
cxy@ubuntu2404-cxy:~$ cd ~/ros2_ws/src/learning_tf2_py/learning_tf2_py
cxy@ubuntu2404-cxy:~/ros2_ws/src/learning_tf2_py/learning_tf2_py$ wget https://raw.githubusercontent.com/ros/geometry_tutorials/ros2/turtle_tf2_py/turtle_tf2_py/fixed_frame_tf2_broadcaster.py
现在打开名为 fixed_frame_tf2_broadcaster.py
的文件。
from geometry_msgs.msg import TransformStamped # 从 geometry_msgs.msg 导入 TransformStamped 消息类型
import rclpy # 导入 rclpy 库
from rclpy.node import Node # 从 rclpy.node 导入 Node 类
from tf2_ros import TransformBroadcaster # 从 tf2_ros 导入 TransformBroadcaster 类
class FixedFrameBroadcaster(Node): # 定义一个名为 FixedFrameBroadcaster 的类,继承自 Node 类
def __init__(self): # 初始化方法
super().__init__('fixed_frame_tf2_broadcaster') # 调用父类的初始化方法,并设置节点名称为 'fixed_frame_tf2_broadcaster'
self.tf_broadcaster = TransformBroadcaster(self) # 创建一个 TransformBroadcaster 对象
self.timer = self.create_timer(0.1, self.broadcast_timer_callback) # 创建一个定时器,每 0.1 秒调用一次 broadcast_timer_callback 方法
def broadcast_timer_callback(self): # 定义定时器回调方法
t = TransformStamped() # 创建一个 TransformStamped 对象
t.header.stamp = self.get_clock().now().to_msg() # 设置时间戳为当前时间
t.header.frame_id = 'turtle1' # 设置父坐标系 ID 为 'turtle1'
t.child_frame_id = 'carrot1' # 设置子坐标系 ID 为 'carrot1'
t.transform.translation.x = 0.0 # 设置平移变换的 x 坐标为 0.0
t.transform.translation.y = 2.0 # 设置平移变换的 y 坐标为 2.0
t.transform.translation.z = 0.0 # 设置平移变换的 z 坐标为 0.0