Setting Up Transformations
在本指南中,我们将了解 Nav2 所需的必要转换。这些转换允许 Nav2 解释来自各种来源的信息,例如传感器和里程计,通过将它们转换为坐标系以供使用。下面是机器人的完整变换树的样子,但我们将从更简单的东西开始。 [校准@songhuangong]
对于本教程,我们将首先简要介绍 ROS 中的转换。其次,我们将制作一个 TF2 静态发布者的简单命令行演示,以查看它的实际效果。最后,我们将概述 Nav2 正常工作下所需要发布的必要转换。 [校准@songhuangong]
转换介绍 [待校准@1869]
备注
本指南的这一部分改编自 ROS (1) 中的Navigation 文档 `使用 tf 设置你的机器人<http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF>`__ [校准@songhuangong]
许多 ROS 包需要使用 TF2 ROS 包发布机器人的变换树。变换树定义了不同坐标系之间的关系,包括平移、旋转和相对运动。为了使这一点更具体,让我们举一个简单的机器人示例,它有一个移动底座,上面安装了一个激光传感器。 [校准@songhuangong]
该机器人有两个已定义的坐标系:一个对应于机器人移动底座的中心点,一个对应于安装在底座顶部的激光器的中心点。我们将连接到移动基地的坐标系称为 base_link
,我们将把连接到激光的坐标系称为 base_laser
。请注意,下一节将更多地讨论这些坐标系的命名和约定。 [校准@code_fw]
这时,让我们假设我们有一些来自激光器的数据,这些数据以距激光器中心点的距离测量的形式出现。换句话说,我们在 base_laser
坐标系中有一些数据。 [校准@songhuangong]
现在,假设我们想要获取这些数据并使用它来帮助移动基地避免世界上的障碍。为了成功地做到这一点,我们需要一种方法将我们收到的激光扫描从 base_laser
转变为 base_link
。本质上,我们需要定义 base_laser
和 base_link
坐标框架之间的关系。 [校准@songhuangong]
在定义这种关系时,让我们假设我们拥有的唯一数据是激光器安装在移动底座中心点前方 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)。 [校准@songhuangong]
我们可以选择自己管理这种关系,这意味着在必要时在帧之间存储和应用适当的平移,但是随着坐标帧数量的增加,这变得非常痛苦。幸运的是,我们不必自己做这项工作。相反,我们将使用 TF2 定义 base_link
和 base_laser
之间的关系,并让它为我们管理两个坐标系之间的转换。这在处理非静态变换时特别有用,例如一组相对于彼此移动的框架,例如地图框架中的机器人基础框架。 [校准@songhuangong]
要使用 TF2 定义和存储 base_link
和 base_laser
帧之间的关系,我们需要将它们添加到变换树中。从概念上讲,变换树中的每个节点对应一个坐标系,每条边对应于从当前节点移动到其子节点需要应用的变换。 TF2 使用树结构来保证只有一次遍历将任意两个坐标系链接在一起,并假设树中的所有边都是从父节点指向子节点的。 [校准@songhuangong]
为了简单示例创建一个变换树,我们将创建两个节点:一个用于 base_link
坐标系,一个用于 base_laser
坐标系。要在它们之间创建“边”,我们首先需要确定哪个节点是父节点,哪个节点是子节点。请记住——这种区别很重要,因为 TF2 假定所有转换都从父级移动到子级。 [校准@songhuangong]
我们选择 base_link
坐标系作为父坐标系,因为当其他部件/传感器添加到机器人时,如通过遍历 base_link
框架 关联到 base_laser
这对它们来讲是最有意义的。 [校准@songhuangong]
设置好这个变换树后,将 base_laser
中接收到的激光扫描转换为 base_link
就像调用 TF2 库一样简单。我们的机器人现在可以使用这些信息来推断 base_link
框架中的激光扫描,并安全地绕过其环境中的障碍物。 [校准@songhuangong]
静态转换 Publisher(发布) 演示 [校准@songhuangong]
警告
如果您是 ROS 2 新手或者还没有工作环境,请花一些时间使用官方资源正确设置您的机器 ROS 2 安装文档 [校准@songhuangong]
现在让我们尝试使用 TF2 提供的 static_transform_publisher 工具发布一个非常简单的转换。我们将发布从 base_link
到 base_laser
的转换,通过(x:0.1m,y:0.0m,z:0.2m)。请注意,我们将根据本教程前面的图表构建转换。 [校准@songhuangong]
打开命令行并执行以下命令: [校准@songhuangong]
ros2 run tf2_ros static_transform_publisher 0.1 0 0.2 0 0 0 base_link base_laser
有了这个,我们现在成功地将我们的 base_link
发布到 TF2 中的 base_laser
。现在让我们通过 tf2_echo
检查它是否正常工作。打开一个单独的命令行窗口并执行以下命令: [校准@songhuangong]
ros2 run tf2_ros tf2_echo base_link base_laser
您应该能够观察到与以下类似的重复输出。 [校准@songhuangong]
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 教程中讨论。 [校准@songhuangong]
参见
如果您想了解更多关于 TF2 以及如何创建自己的转换发布者的信息,请前往官方的 TF2 文档 [校准@songhuangong]
小结 [校准@songhuangong]
在本教程中,我们讨论了变换的概念以及它们在 Nav2 中的使用方式。 [校准@songhuangong]
在上一节中,我们还探索了使用 TF2 的 static_transform_publisher 来发布我们的变换。您可以使用它来设置 Nav2 的转换,但这通常不是最好的方法。在大多数机器人项目中,我们使用 Robot State Publisher,因为随着我们的机器人变得更加复杂,它更易于使用和扩展。我们将在下一个教程中讨论机器人状态发布器、URDF 以及如何设置它。 [校准@songhuangong]
最后,我们还讨论了 Nav2 的三个已发布转换要求以及设置它们时要牢记的必要 REP。 [校准@songhuangong]