< >
Home » ROS2与Navigation2入门教程 » ROS2与Navigation2入门教程-设置TF

ROS2与Navigation2入门教程-设置TF

说明:

  • 介绍ROS中的坐标变换,制作TF2静态发布者的简单命令行演示,以查看其运行情况

坐标变换简介

  • 许多ROS软件包需要使用ROS软件包TF2发布机器人的坐标变换树。坐标变换树定义了不同坐标系之间的关系,包括平移、旋转和相对运动。为了更具体地说明这一点,下面以一个简单机器人为例,该机器人具有一个可移动底座,并在其顶部安装了一个激光传感器。

  • 该机器人有两个定义好的坐标系:一个对应于机器人可移动底座的中心点,而另一个对应于安装在该底座顶部的激光器的中心点。可以将依附于可移动底座的坐标系称为base_link,而将依附于激光的坐标系称为base_laser。请注意,下一节将详细讨论这些坐标系的命名和约定。

  • 此时,假设有一些来自激光器的数据,这些数据是来自激光器中心点的距离测量值。换句话说,在base_laser坐标系中有一些数据。

  • 现在,假设想要获取这些数据并用它来帮助可移动底座避开机器人世界中的障碍物。为了成功做到这一点,需要一种方法将 base_laser坐标系中接收到的激光扫描数据变换到base_link坐标系。从本质上说,就是需要定义base_laser和base_link坐标系之间的关系。

请输入图片描述

  • 在定义这种关系时,假设我们拥有的唯一数据就是激光器安装在可移动底座中心点前方10厘米和上方20厘米处。这为我们提供了对 base_link坐标系与base_laser坐标系进行关联的平移偏移量。具体来说,我们知道要将base_link坐标系中获取的数据变换到base_laser坐标系,必须应用(x: 0.1m, y: 0.0m, z: 0.2m)的平移量,反之,将base_laser坐标系中获取的数据变换到base_link坐标系,则必须应用相反的平移量,即(x:-0.1m,y:0.0m,z:-0.20m)。

  • 可以选择让用户自己管理这种关系,这意味着在必要时存储和应用坐标系之间的适当变换,但是随着坐标系数量的增加,这会变得非常痛苦。幸运的是,我们可以不必自己做这项工作。相反地,可以使用TF2一次性定义base_link和base_laser坐标系之间的关系,并让TF2来管理这两个坐标系之间的坐标变换。这在处理非静态变换时特别有用,例如一组相对于彼此正在移动的坐标系,如在地图(map)坐标系中的机器人底座坐标系。

  • 为了使用TF2定义和存储base_link和base_laser坐标系之间的关系,需要将它们添加到坐标变换树中。从概念上讲,变换树中的每个节点对应一个坐标系,每条边对应于从当前节点移至其子节点所需执行的坐标变换。TF2使用树结构来保证只需一次遍历即可将任何两个坐标系链接起来,并假设树中的所有边都是从父节点指向子节点的。

请输入图片描述

  • 要为上面的简单示例创建一个坐标变换树,就会创建两个节点:一个用于base_link坐标系,一个用于base_laser坐标系。要在这两个节点之间创建边,首先需要决定哪个节点是父节点,哪个节点是子节点。请记住,这种区别很重要,因为TF2假设所有坐标变换都是从父节点到子节点的变换。

  • 这里选择base_link坐标系作为父级坐标系,因为当其他部件/传感器添加到机器人上时,通过遍历base_link坐标系将它们与base_laser坐标系关联起来最有意义。这意味着与连接base_link和 base_laser的边相关联的坐标变换应该是 (x: 0.1m, y: 0.0m, z: 0.2m)。

  • 设置好这个变换树后,将base_laser坐标系中接收到的激光扫描变换至base_link坐标系就如同调用TF2库一样简单。这样,机器人现在就可以使用这些变换树信息来对base_link坐标系中的激光扫描进行推理,并安全地规划路径绕过机器人环境中的障碍物。

静态坐标变换发布者节点运行演示

  • 现在来尝试使用TF2提供的static_transform_publisher工具发布一个非常简单的坐标变换。
  • 这里将会发布从链接base_link到链接base_laser的变换,平移量为 (x: 0.1m, y: 0.0m, z: 0.2m)。
  • 请注意,这里会构建来自本教程前面图表中的坐标变换。
  • 打开命令行窗口并执行以下命令:
ros2 run tf2_ros static_transform_publisher 0.1 0 0.2 0 0 0 base_link base_laser
  • 这样就成功地在TF2中发布了base_link到base_laser的坐标变换。
  • 现在通过tf2_echo来检查它是否正常工作。
  • 打开另一个单独的命令行窗口并执行以下命令:
ros2 run tf2_ros tf2_echo base_link base_laser
  • 这样就应该能够看到类似于下面的重复输出:
At time 0.0

- Translation: [0.100, 0.000, 0.200]

- Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]
  • 这个简短的演示就是这样——可以使用TF2库成功地发布从 base_link到base_laser的坐标变换。请注意,不建议在为您的真实机器人项目发布坐标变换时使用上述演示,这只是为了查看TF2实际运行情况的快速演示。对于真实的机器人系统,会创建一个URDF文件,该文件会嵌入这个坐标变换信息以及机器人相关的更多信息,以便使用robots_state_publisher而不是static_transform_publisher。

  • 关于这个问题有更多合适和实用的方法,这将会在“设置URDF”教程中进行讨论。

Navigation2中的坐标变换

  • 强烈建议查看两个重要的ROS REP(ROS Enhancement Proposals)。

  • 这些REP文档详细说明了ROS社区制定的一些标准,以确保在不同的软件包之间正确地进行操作。

  • Nav2也遵守这些标准和约定。

    • REP 105——移动机器人平台的坐标系
    • REP 103——标准度量单位和坐标约定
  • REP 105的内容简要概括如下:此文档规定了ROS中使用的不同坐标系的命名约定和语义含义。本教程关心的是base_link、odom和map坐标系。坐标系base_link是依附于机器人上的某个固定位置的,通常该位置是在机器人的主机架或底盘(chassis)中心和旋转中心。坐标系odom是相对于机器人起始位置的一个固定坐标系,主要用于距离的局部一致性表示。最后,map坐标系是一个机器人世界固定坐标系,用于距离的全局一致性表示。

  • 另一方面,REP 103则讨论了一些标准度量单位和其他相关约定,以将ROS的不同软件包之间的集成问题降至最低。基本概述就是坐标系是使用右手法则定义的,Z轴向上而X轴向前,单位应为标准的SI(国际单位制)单位。

  • 现在来继续讨论使Navigation2软件包正常运行的一些具体规定。

  • Nav2要求在ROS中发布下面三个坐标变换:

map => odom
odom => base_link
base_link => base_laser (sensor base frames)
  • *注:base_laser坐标系不包含在REP 105标准中。本指南中使用此名称来指代机器人平台上激光传感器的坐标系。如果有多个基于传感器的坐标系(例如camera_link、base_laser2、lidar_link等),则需要将每个坐标系变换回base_link坐标系。

  • 第一个坐标变换map => odom通常由处理定位和制图的不同 ROS软件包提供,例如AMCL。这个变换会更新使用中的实时数据,因此不会在机器人的TF树中为这个变换设置静态值。有关如何设置的更多详细信息可能非常复杂,因此强烈建议阅读您的平台所使用的制图或定位软件包的文档。所有合规的ROS SLAM软件包和定位软件包都会在启动时自动提供这个坐标变换。

  • 坐标变换odom => base_link通常由里程计系统使用传感器(如车轮编码器)发布。

  • 这通常是使用机器人定位软件包robot_localization通过里程计传感器(IMU、车轮编码器、VIO 等)的传感器融合来计算的。

  • 所有其他静态定义的坐标变换(例如base_link => base_laser、base_link => wheels、wheels => IMU等)都是本指南其余章节将要讨论的内容。Nav2使用此坐标变换树将来自传感器或其他感兴趣坐标系的信息与机器人的其余部件进行正确地关联。这两个坐标系之间的坐标变换通常是通过机器人状态发布者(Robot State Publisher)软件包和统一机器人描述格式URDF(Unified Robot Description Format)文件提供给Nav2的。如果您的平台上有更多传感器坐标系,则需要发布从base_link坐标系到每个传感器坐标系的坐标变换树。

结束语

  • 本教程讨论了坐标变换的概念以及如何在Nav2中使用坐标变换。

  • 在上一节中还探索了使用TF2的static_transform_publisher节点来发布坐标变换。可以使用该节点来设置Nav2的坐标变换,但通常来说这并不是最好的方法。大多数机器人项目中会使用机器人状态发布者(Robot State Publisher)软件包,因为它更容易使用,并且在机器人变得更加复杂时也易于扩展。在下一个教程“设置URDF”中将会讨论Robot State Publisher软件包、URDF以及如何设置URDF。

  • 最后,还讨论了Nav2的三个坐标变换的发布要求以及在设置它们时要记住的必要REP(REP 105和REP 103)。

参考:

  • https://navigation.ros.org/setup_guides/transformation/setup_transforms.html

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

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


标签: ros2与navigation2入门教程