【Nav2中文网】四、首次机器人安装指南(一)设置转换

2023-11-03 17:59

本文主要是介绍【Nav2中文网】四、首次机器人安装指南(一)设置转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 本教程来自:Nav2中文网
  • Nav2交流社区:https://fishros.org.cn/forum
  • ROS2/Nav2千人交流群:(QQ)139707339
  • 更多精彩教程请关注微信公众号:鱼香ROS
  • 欢迎添加机器人小伊微信,解锁机器人学习特殊服务

设置转换 [待校准@1866]

在本指南中,我们将了解 Nav2 所需的必要转换。这些转换允许 Nav2 解释来自各种来源的信息,例如传感器和里程计,通过将它们转换为坐标系以供使用。下面是机器人的完整变换树的样子,但我们将从更简单的东西开始。 [songhuangong@1867]

在这里插入图片描述

对于本教程,我们将首先简要介绍 ROS 中的转换。其次,我们将制作一个 TF2 静态发布者的简单命令行演示,以查看它的实际效果。最后,我们将概述 Nav2 正常工作下所需要发布的必要转换。 [songhuangong@1868]

转换介绍 [待校准@1869]

注解:
本指南的这一部分改编自 ROS (1) 中的Navigation 文档 使用 tf 设置你的机器人<http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF>__
[songhuangong@1870]

许多 ROS 包需要使用 TF2 ROS 包发布机器人的变换树。变换树定义了不同坐标系之间的关系,包括平移、旋转和相对运动。为了使这一点更具体,让我们举一个简单的机器人示例,它有一个移动底座,上面安装了一个激光传感器。 [songhuangong@1871]

该机器人有两个已定义的坐标系:一个对应于机器人移动底座的中心点,一个对应于安装在底座顶部的激光器的中心点。我们将连接到移动基地的坐标系称为 base_laser ,我们将把连接到激光的坐标系称为 base_laser 。请注意,下一节将更多地讨论这些坐标系的命名和约定。 [songhuangong@1872]

这时,让我们假设我们有一些来自激光器的数据,这些数据以距激光器中心点的距离测量的形式出现。换句话说,我们在 base_laser 坐标系中有一些数据。 [songhuangong@1873]

现在,假设我们想要获取这些数据并使用它来帮助移动基地避免世界上的障碍。为了成功地做到这一点,我们需要一种方法将我们收到的激光扫描从 base_laser 转变为 base_link 。本质上,我们需要定义 base_laserbase_link 坐标框架之间的关系。 [songhuangong@1874]

在这里插入图片描述

在定义这种关系时,让我们假设我们拥有的唯一数据是激光器安装在移动底座中心点前方 10 厘米和上方 20 厘米处。这给了我们一个平移偏移量,它将 base_link 框架与 base_laser 框架联系起来。具体来说,我们知道要从 base_linkbase_laser 获取数据,我们必须应用横向的一个平移(x: 0.1m, y: 0.0m, z: 0.2m) ,要从 base_laser 获取数据到 base_link ,我们必须应用相反的平移(x:-0.1m,y:0.0m,z:-0.20m)。 [songhuangong@1875]

我们可以选择自己管理这种关系,这意味着在必要时在帧之间存储和应用适当的平移,但是随着坐标帧数量的增加,这变得非常痛苦。幸运的是,我们不必自己做这项工作。相反,我们将使用 TF2 定义 base_linkbase_laser 之间的关系,并让它为我们管理两个坐标系之间的转换。这在处理非静态变换时特别有用,例如一组相对于彼此移动的框架,例如地图框架中的机器人基础框架。 [songhuangong@1876]

要使用 TF2 定义和存储 base_linkbase_laser 帧之间的关系,我们需要将它们添加到变换树中。从概念上讲,变换树中的每个节点对应一个坐标系,每条边对应于从当前节点移动到其子节点需要应用的变换。 TF2 使用树结构来保证只有一次遍历将任意两个坐标系链接在一起,并假设树中的所有边都是从父节点指向子节点的。 [songhuangong@1877]

在这里插入图片描述

为了简单示例创建一个变换树,我们将创建两个节点:一个用于 base_link 坐标系,一个用于 base_laser 坐标系。要在它们之间创建“边”,我们首先需要确定哪个节点是父节点,哪个节点是子节点。请记住——这种区别很重要,因为 TF2 假定所有转换都从父级移动到子级。 [songhuangong@1878]

我们选择 base_link 坐标系作为父坐标系,因为当其他部件/传感器添加到机器人时,如通过遍历 base_link 框架 关联到 base_laser 这对它们来讲是最有意义的。 [songhuangong@1879]

设置好这个变换树后,将 base_laser 中接收到的激光扫描转换为 base_link 就像调用 TF2 库一样简单。我们的机器人现在可以使用这些信息来推断 base_link 框架中的激光扫描,并安全地绕过其环境中的障碍物。 [songhuangong@1880]

静态转换 Publisher(发布) 演示 [songhuangong@1881]

警告: 如果您是 ROS 2 新手或者还没有工作环境,请花一些时间使用官方资源正确设置您的机器 ROS2安装文档
[songhuangong@1882]

现在让我们尝试使用 TF2 提供的 static_transform_publisher 工具发布一个非常简单的转换。我们将发布从 base_linkbase_laser 的转换,通过(x:0.1m,y:0.0m,z:0.2m)。请注意,我们将根据本教程前面的图表构建转换。 [songhuangong@1883]

打开命令行并执行以下命令: [songhuangong@1884]

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@1885]

ros2 run tf2_ros tf2_echo base_link base_laser

您应该能够观察到与以下类似的重复输出。 [songhuangong@1886]

At time 0.0
- Translation: [0.100, 0.000, 0.200]
- Rotation: in Quaternion [0.000, 0.000, 0.000, 1.000]

这就是这个简短的演示 - 我们能够使用 TF2 库成功发布从 base_linkbase_laser 的转换。请注意,我们不建议在为您的实际机器人项目发布转换时使用上述演示,这只是一个快速演示,以了解 TF2 的实际运行情况。对于真正的机器人系统,我们将创建一个 URDF 文件,该文件嵌入此信息和更多关于您的机器人的信息,以使用 robots_state_publisher 而不是 static_transform_publisher。有更合适和实用的方法来解决这个问题,将在 设置URDF [待校准@1907] 教程中讨论。 [songhuangong@1887]

参见:
如果您想了解更多关于 TF2 以及如何创建自己的转换发布者的信息,请前往官方的 TF2
文档
[songhuangong@1888]

Navigation2 中的转换 [songhuangong@1889]

我们强烈建议您查看两个重要的 ROS REP。这些文档详细介绍了 ROS 社区为确保不同包之间的正常运行,而制定的一些标准。 Nav2 也遵守这些标准和约定。 [songhuangong@1890]

  1. REP 105 - Coordinate Frames for Mobile Platforms
  2. REP 103 - Standard Units of Measure and Coordinate Conventions

为了快速总结 REP 105,本文档指定了 ROS 中使用的不同坐标系的命名约定和语义含义。本教程感兴趣的是 base_linkodommap 坐标系。 base_link 是一个坐标系,它连接到机器人的固定位置,通常在其主底盘和旋转中心。 odom 坐标系是相对于机器人起始位置的固定框架,主要用于 局部一致 的距离表示。最后, map 坐标系是一个世界固定框架,用于 全球一致 的距离表示。 [songhuangong@1893]

另一方面,REP 103 讨论了一些标准度量单位和其他相关约定,以将不同 ROS 包之间的集成问题降至最低。基本概述是使用右手定则定义框架,Z 向上和 X 向前,单位应为标准 SI 单位。 [songhuangong@1894]

现在让我们继续讨论 Navigation2 包正常运行的一些细节。 Nav2 需要在 ROS 中发布以下转换: [songhuangong@1895]

  1. map => odom
  2. odom => base_link
  3. base_link => base_laser (传感器底座) [小鱼@1898]

注解:
base_laser 坐标系不包括在 REP 105 标准中。对于本指南,我们将使用此名称来指代机器人平台上激光传感器的坐标系。如果有多个传感器基础框架(例如camera_link、base_laser2、lidar_link 等),则需要将每个基础框架转换回 base_laser
[songhuangong@1899]

第一个变换 map => odom 通常由处理本地化和映射的不同 ROS 包提供,例如 AMCL。此转换使用时,实时更新,因此我们不会在机器人的 TF 树中为此设置静态值。关于如何设置的更多细节可能非常复杂,因此我们强烈建议您查看您用于平台的映射或本地化包的文档。所有符合 ROS 的 SLAM 和本地化包都将在启动时自动为您提供这种转换。 [songhuangong@1900]

odom => base_link 通常由我们的里程计系统使用传感器(例如车轮编码器)发布。这通常通过使用 robot_localization 包的里程计传感器(IMU、车轮编码器、VIO 等)的传感器融合来计算。 [songhuangong@1901]

所有其他静态定义的变换(例如 base_link => base_laserbase_link => wheelswheels => IMU 等)是什么我们将在本指南的其余部分讨论。 Nav2 使用此转换树来正确关联信息(从传感器或其他感兴趣的frame到机器人的其余部分)。这两个坐标系之间的转换通常通过 Robot State Publisher 和 Universal Robot Descriptor File (URDF) 提供给 Nav2。如果您的平台上有更多传感器坐标系,则需要发布从 base_link 到每个传感器坐标系的变换树。 [songhuangong@1902]

参见: 要更深入地讨论变换的使用以及如何使用它们来估计机器人的当前状态,我们强烈建议您查看:ref:concepts 中的状态估计主题。
[songhuangong@1903]

小结 [songhuangong@1616]

在本教程中,我们讨论了变换的概念以及它们在 Nav2 中的使用方式。 [songhuangong@1904]

在上一节中,我们还探索了使用 TF2 的 static_transform_publisher 来发布我们的变换。您可以使用它来设置 Nav2 的转换,但这通常不是最好的方法。在大多数机器人项目中,我们使用 Robot State Publisher,因为随着我们的机器人变得更加复杂,它更易于使用和扩展。我们将在下一个教程中讨论机器人状态发布器、URDF 以及如何设置它。 [songhuangong@1905]

最后,我们还讨论了 Nav2 的三个已发布转换要求以及设置它们时要牢记的必要 REP。 [songhuangong@1906]

  • 本文主要校准贡献:songhuangong
  • 本文遵循知识共享协议,禁止未授权商用转载

这篇关于【Nav2中文网】四、首次机器人安装指南(一)设置转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_27865227/article/details/123992104
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/339908

相关文章

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

使用Java将实体类转换为JSON并输出到控制台的完整过程

《使用Java将实体类转换为JSON并输出到控制台的完整过程》在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用JSON格式,用Java将实体类转换为J... 在软件开发的过程中,Java是一种广泛使用的编程语言,而在众多应用中,数据的传输和存储经常需要使用j

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS

电脑软件不能安装到C盘? 真相颠覆你的认知!

《电脑软件不能安装到C盘?真相颠覆你的认知!》很多人习惯把软件装到D盘、E盘,刻意绕开C盘,这种习惯从哪来?让我们用数据和案例,拆解背后的3大原因... 我身边不少朋友,在使用电脑安装软件的时候,总是习惯性的把软件安装到D盘或者E盘等位置,刻意避开C盘。如果你也有这样的习惯,或者不明白为什么要这么做,那么我

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。