< >
Home » ROS2与tf2入门教程 » ROS2与tf2入门教程-使用tf2进行Time travel(Python)

ROS2与tf2入门教程-使用tf2进行Time travel(Python)

说明:

  • 介绍tf2的高级时间旅行功能

概述:

  • 在之前的教程中,我们讨论了 tf2 和 time 的基础知识。

  • 本教程将带我们更进一步,并揭示一个强大的 tf2 技巧:时间旅行。

  • 简而言之,tf2 库的关键特性之一是它能够在时间和空间上转换数据。

  • 此 tf2 时间旅行功能可用于各种任务,例如长时间监控机器人的姿势或构建跟随领导者“步骤”的跟随机器人。

  • 我们将使用该时间旅行功能及时查找变换,并编程turtle2 使其落后于carrot1 5 秒。

步骤:

  • 新建turtle_tf2_listener_travel.py
cd ~/tf2_ws/src/learning_tf2_py/learning_tf2_py
cp turtle_tf2_listener_timeout.py turtle_tf2_listener_travel.py
vim turtle_tf2_listener_travel.py
  • 将文件中的lookup_transform()修改为如下部分
when = self.get_clock().now() - rclpy.time.Duration(seconds=5.0)
trans = self._tf_buffer.lookup_transform(
    to_frame_rel,
    from_frame_rel,
    when,
    timeout=Duration(seconds=0.05))
  • 现在,如果你运行它,在前 5 秒内,第二只乌龟将不知道去哪里,因为我们还没有乌龟的 5 秒姿势历史
     
  • 增加权限 
sudo chmod +x turtle_tf2_listener_travel.py
  • 添加入口,修改setup.py在'console_scripts': [里添加
'turtle_tf2_listener_travel = learning_tf2_py.turtle_tf2_listener_travel:main',
  • 新增为turtle_tf2_demo_travel.launch.py
cd ~/tf2_ws/src/learning_tf2_py/launch
cp turtle_tf2_demo_timeout.launch.py turtle_tf2_demo_travel.launch.py
vim turtle_tf2_demo_travel.launch.py
  • 修改内容如下
Node(
  package='learning_tf2_py',
  executable='turtle_tf2_listener_travel',
  name='listener',
  parameters=[
      {'target_frame': LaunchConfiguration('target_frame')}
  ]
),   
  • 新增为turtle_tf2_fixed_frame_demo_travel.launch.py
cd ~/tf2_ws/src/learning_tf2_py/launch
cp turtle_tf2_fixed_frame_demo_timeout.launch.py turtle_tf2_fixed_frame_demo_travel.launch.py
vim turtle_tf2_fixed_frame_demo_travel.launch.py
  • 修改内容如下
demo_nodes = IncludeLaunchDescription(
  PythonLaunchDescriptionSource([os.path.join(
        get_package_share_directory('learning_tf2_py'), 'launch'),
        '/turtle_tf2_demo_travel.launch.py']),
  launch_arguments={'target_frame': target_frame}.items()
)
  • 构建
colcon build --symlink-install --packages-select learning_tf2_py
  • 加载工作空间
. ~/tf2_ws/install/local_setup.bash

测试:

  • 启动turtle_tf2_fixed_frame_demo_travel.launch.py
. ~/tf2_ws/install/local_setup.bash
ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo_travel.launch.py

请输入图片描述

  • 你现在应该注意到你的乌龟像这个截图一样不受控制地四处行驶。 让我们试着理解这种行为背后的原因。

  • 在我们的代码中,我们向 tf2 询问了以下问题:“carrot1 5 秒前相对于 turtle2 5 秒前的姿势是什么?”。

  • 这意味着我们根据 5 秒前的位置以及第一个carrot1 5 秒前的位置来控制第二个海龟。

  • 然而,我们真正想问的是:“carrot1 5 秒前的pose,相对于turtle2 的当前位置是什么?”。

lookup_transform()高级API

  • 此函数没测试通过, 暂作记录
  • 为了向 tf2 提出这个特定问题,我们将使用一个高级 API,它使我们能够明确说明何时获取指定的转换。
  • 这是通过使用附加参数调用lookup_transform_full() 方法来完成的。
  • 您的代码现在看起来像这样:
when = self.get_clock().now() - rclpy.time.Duration(seconds=5.0)
trans = self._tf_buffer.lookup_transform_full(
        target_frame=to_frame_rel,
        target_time=rclpy.time.Time(),
        source_frame=from_frame_rel,
        source_time=when,
        fixed_frame='world',
        timeout=Duration(seconds=0.05))
  • lookup_transform_full() 的高级 API 采用六个参数:
目标框架
转变为的时间
源框架
评估源帧的时间
不随时间改变的框架,在这种情况下是世界框架
等待目标帧可用的时间
  • 综上所述,tf2 在后台做了以下事情。
  • 过去,它计算从carrot1到world的变换。
  • 在world框架中,tf2 时间从过去穿越到现在。
  • 在当前时间,tf2 计算从world 到 turtle2 的变换。
  • 再次运行模拟,这次使用高级时间旅行 API
ros2 launch learning_tf2_py turtle_tf2_fixed_frame_demo_travel.launch.py

请输入图片描述

参考:

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与tf2入门教程