使用时间(Python)

**目标:**学习如何在``lookup_transform``函数中使用``timeout``参数来等待变换在tf2树上可用。

教程级别: 中级

时间: 10分钟

背景

在之前的教程中,我们通过编写 tf2广播器。现在我们将更深入了解``timeout``参数,它使``lookup_transform``在指定的持续时间内等待指定的变换,然后才抛出异常。这个工具对于监听以不同速率发布的变换或具有不可靠网络和非常大延迟的传入源非常有用。本教程将教您如何使用``lookup_transform``函数中的timeout来等待tf2树上的变换可用。

任务

1. 更新监听器节点

编辑 turtle_tf2_listener.py 并删除传递给第 76 行的 lookup_transform() 调用的 timeout=Duration(seconds=1.0) 参数。修改后的代码应如下所示:

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

此外,在文件开头导入额外的异常,我们将在文件开头处理它们:

from tf2_ros import LookupException, ConnectivityException, ExtrapolationException

通过添加新导入的异常和 raise 语句,编辑第 81 行的异常处理以查看异常信息:

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

如果你现在尝试运行启动文件,你会注意到它执行失败:

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

2 修复监听节点

现在你应该注意到 lookup_transform() 执行失败。它告诉你帧不存在或数据在未来。为了修复这个问题,在第 76 行的代码中做如下修改(返回 timeout 参数):

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

lookup_transform 可以接受四个参数,其中最后一个是可选的超时时间。它将阻塞等待,最多等待指定的时长后超时。

注解

在进行这个更改后,从上面添加的 except() 块中移除 raise 行,否则代码将继续失败。

现在您可以运行启动文件。

ros2 launch learning_tf2_py turtle_tf2_demo.launch.py

你应该注意到,lookup_transform() 实际上会阻塞,直到两个 turtle 之间的变换可用(通常需要几毫秒)。一旦达到超时时间(在本例中为一秒),只有当变换仍然不可用时才会引发异常。

总结

在本教程中,你学习了关于 lookup_transform 函数及其超时特性的更多内容。你还学会了如何捕获和处理 tf2 可能抛出的其他异常。