学习tf2和时间 (Python) [待校准@8480]

Goal: Learn to use the timeout in lookup_transform function to wait for a transform to be available on the tf2 tree.

Tutorial教程级别: Intermediate中级 [待校准@6713]

时间: 10分钟 [Alyssa@7452]

背景

在之前的教程中,我们通过编写 tf2 broadcaster and a tf2 listener. We also learned how to add a new frame to the transformation tree 重新创建了海龟例程。现在我们将了解更多关于 timeout 的参数,它使 lookup_transform 在引发异常之前等待指定的转换直到指定的持续时间。该工具对于侦听以不同速率发布的转换或网络不可靠且延迟不可忽略的传入源文件非常有用。本教程将教您如何使用 lookup_transform 函数中的超时来等待转换在tf2树上可用。 [待校准@8482]

任务

1更新监听节点 [待校准@8483]

编辑 turtle_tf2_listener.py ,并删除传递给第76行的 lookup_transform() 调用的 timeout=Duration(seconds=1.0) 参数。它应该如下所示: [待校准@8484]

trans = self._tf_buffer.lookup_transform(
   to_frame_rel,
   from_frame_rel,
   now)

此外,导入我们将在文件开始时处理的其他异常: [待校准@8485]

from tf2_ros import LookupException, ConnectivityException, ExtrapolationException

通过添加新导入的异常和 raise 语句来编辑第81行的异常处理,以查看异常: [待校准@8486]

except (LookupException, ConnectivityException, ExtrapolationException):
   self.get_logger().info('transform not ready')
   raise
   return

如果您现在尝试运行launch文件,您会注意到它失败了: [待校准@8487]

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

2修复监听节点 [待校准@8488]

你现在应该注意到 lookup_transform() 正在失效。它告诉你帧不存在或者数据在将来。要解决此问题,请在第76行编辑代码,如下所示 (返回 timeout 参数): [待校准@8489]

trans = self._tf_buffer.lookup_transform(
   to_frame_rel,
   from_frame_rel,
   now,
   timeout=Duration(seconds=1.0))

[需手动修复的语法] lookup_transform 可以接受四个参数,其中最后一个是可选的超时。它将阻塞长达该持续时间,等待其超时。 [待校准@8490]

注解

一旦更改,删除 raise 线从 except() 块添加的或代码将继续失败。 [待校准@8491]

您现在可以运行launch文件。 [待校准@8477]

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

你应该注意到 lookup_transform() 实际上会阻塞,直到两只海龟之间的转变变得可用 (这通常需要几毫秒)。一旦达到超时时间 (在这种情况下为一秒钟),仅当转换仍然不可用时才会引发异常。 [待校准@8492]

总结

在本教程中,您将了解更多关于 lookup_transform 函数及其超时功能的信息。您还学习了如何捕获和处理tf2可能引发的其他异常。 [待校准@8493]