56.Isaac教程--ROS

news2024/11/18 11:40:52

ROS

在这里插入图片描述
ISAAC教程合集地址

文章目录

  • ROS
    • 安装ROS
    • 创建和使用自定义 ROS 包
    • 创建 ROS Bridge
    • Ros节点
    • 时间同步器
    • 消息转换器基地
    • 姿势同步
    • 自定义小码
    • 示例:将 ROS 导航堆栈与 Isaac 结合使用
    • 在此示例上构建
    • 将 Isaac 映射转换为 ROS 映射

Isaac 和机器人操作系统 (ROS) 都使用消息传递来处理各自系统不同部分之间的通信。 Isaac 和 ROS 之间的通信需要在两个系统之间创建消息转换层。 本节介绍该层的概述和工作流程。

安装ROS

为了使用 ROS Bridge,您必须在您的设备上安装 ROS。 例如,如果你想在 Jetson 上使用 ROS Bridge,你必须在 Jetson 上安装 ROS。 如果你想在桌面上使用 ROS,你必须在桌面上安装 ROS。

您安装的 ROS 版本必须与您设备的操作系统相匹配。 对于您的桌面系统或 Jetson Xavier(均运行 Ubuntu 18.04),您必须安装 ROS Melodic Morenia。

要安装 ROS,请按照 ROS 网页上的说明进行操作。

创建和使用自定义 ROS 包

Isaac 不需要大部分 ROS 功能,因此包含的软件包仅提供对通常随默认 ROS 安装一起安装的消息的支持,如下所列。

roscpp rospy actionlib_msgs control_msgs diagnostic_msgs geometry_msgs
map_msgs nav_msgs pcl_msgs sensor_msgs shape_msgs std_msgs stereo_msgs
tf2_geometry_msgs tf2_msgs trajectory_msgs visualization_msgs

ROS Bridge 所需的第三方库仅在桌面和 Jetson Xavier 上受支持。

如果上述消息类型足以满足您的应用,请继续进行下一小节。 否则,为了使用自定义 ROS 消息,有必要生成自定义包并将 bazel 构建系统指向这样的包。 首先生成一个包含所需包的自定义工作区。 请参阅 ./engine/engine/build/scripts/ros_package_generation.sh 以获取有关如何创建具有正确路径结构的自定义包的指南。 一旦这样的包存在,修改 third_party/ros.bzl 以指向新的工作区。

首先注释掉平台特定的默认包,它应该类似于以下内容:

isaac_http_archive(
    name = "isaac_ros_bridge_x86_64",
    build_file = clean_dep("//third_party:ros.BUILD"),
    sha256 = "b2a6c2373fe2f02f3896586fec0c11eea83dff432e65787f4fbc0ef82100070a",
    url = "https://developer.nvidia.com/isaac/download/third_party/ros_kinetic_x86_64.tar.gz",
)

将特定于平台的包替换为以下内容以指向包含自定义包的新工作区:

isaac_new_local_repository(
    name='isaac_ros_bridge_x86_64',
    path='path to the workspace',
    build_file = clean_dep("//third_party:ros.BUILD"),
)

新部分中的 name 和 build_file 字段必须与被替换部分的字段相匹配。

创建 ROS Bridge

“ros_bridge”包提供了一个消息转换器库,可以很容易地创建新的。 得益于模块化设计,用户可以创建具有不同连接和转换器配置的各种桥接器,并在需要时轻松创建新的转换器。 虽然本节的其余部分将解释和构建此包,但如果用户想直接使用 roscpp,示例应用程序“navigation_rosbridge”的小码说明了如何执行此操作。

Isaac-ROS bridge包括:

  1. 一个且只有一个 RosNode codelet,

  2. 与 RosNode 小码位于同一节点中的 TimeSynchronizer 小码,

  3. 根据需要尽可能多的消息和姿势转换器小码,

  4. 一旦 RosNode 与 roscore 建立连接,就会启动转换器的行为树。

Ros节点

RosNode 是初始化 ROS 节点并等待 roscore 启动的 Isaac codelet。 每个带有 ROS 桥的 Isaac 应用程序都需要有一个且只有一个节点具有这种类型的单个组件。

时间同步器

允许在 Isaac 表示法和 ROS 表示法之间转换时间戳。

消息转换器基地

Isaac 为用户提供了基类来快速开发典型的转换器:

  1. ProtoToRosConverter:这是将 Isaac 原型消息转换为 ROS 消息并将其发布到 ROS 的小码的基类。 请检查 OdometryToRos 转换器以查看有关如何使用 ProtoToRosConverter 创建新转换器的示例:我们需要做的就是定义一个 protoToRos 函数。

  2. RosToProtoConverter:这是接收 ROS 消息并将其转换为 Isaac 原型消息的小码的基类。 请检查 RosToDifferentialBaseCommand 转换器以查看有关如何使用 RosToProtoConverter 创建新转换器的示例:我们需要做的就是定义一个 rosToProto 函数。

姿势同步

Isaac 姿势树和 ROS tf2 可以使用下面的代码同步:

  1. PosesToRos:对于姿势映射列表,此小代码从 Isaac Pose Tree 读取姿势并将其写入 ROS tf2。

  2. RosToPoses:对于姿势映射列表,此小代码从 ROS tf2 读取转换并将它们写入 Isaac 姿势树。

自定义小码

如果所需的小码与上述小码或基类不匹配,您可以轻松创建更高级的小码。 例如,GoalToRosAction 接收到两条 Isaac 消息,运行一个 ROS 动作客户端,并发布一条 Isaac 消息。

示例:将 ROS 导航堆栈与 Isaac 结合使用

请查看 packages/ros_bridge/apps/ros_navigation/ros_bridge.subgraph.json 以获取有关如何使用 RosNode 和转换器小代码的示例。 请注意,行为树确保转换器在 RosNode 完成初始化 ROS 连接后启动。

此示例子图用于通过 Isaac 模拟器或通过 Isaac 与真实机器人一起运行 ROS 导航堆栈。 让我们看看 TurtleBot 3 Waffle Pi 由 Flatsim 中的 TurtleBot 3 的 ROS 导航堆栈导航。

  1. 除了 ROS 之外,还为 TurtleBot 3 安装 ROS 导航堆栈。

  2. 按照 Virtual Navigation with TurtleBot3 中的说明,为 Isaac 小型仓库场景运行以下命令:

    bob@desktop:~/isaac/sdk$ TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$(realpath packages/ros_bridge/maps/small_warehouse.yaml)
    
    

    您不需要自己启动 roscore,roslaunch 会为您完成。

  3. 运行具有 flatsim 和 ROS 桥的 Isaac 应用程序:

    bob@desktop:~/isaac/sdk$ bazel run packages/ros_bridge/apps:ros_to_navigation_flatsim -- --more apps/assets/maps/virtual_small_warehouse.json --config ros_navigation:packages/ros_bridge/maps/small_warehouse_map_transformation.config.json,ros_navigation:packages/ros_bridge/apps/ros_to_navigation_turtlebot3_waffle_pi.config.json
    
  4. 打开 http://localhost:3000/ 通过 Isaac 进行监控。 通过 ROS 监视 RViz 窗口以进行监视。 请注意,RViz 可能会抱怨“没有从 [wheel_left_link][map] 的转换”。 此信息不由桥提供,因为它不被 ROS 导航堆栈使用。 但是,如果需要,它(和其他数据)可以像其他转换一样发布。

  5. 机器人现在应该导航到目标,可以通过拖动 Sight 上“地图”窗口的“pose_as_goal”标记轻松修改。

注意

由于 ROS 导航堆栈中的问题,ROS 可能会打印如下警告。

Warning: Invalid argument "/map" passed to canTransform argument target_frame in tf2 frame_ids cannot start with a '/' like:
at line 134 in /tmp/binarydeb/ros-melodic-tf2-0.6.5/src/buffer_core.cpp

在这种情况下,请应用 https://github.com/ROBOTIS-GIT/turtlebot3/pull/402/files 中显示的更改,即从 global_costmap_params.yaml 和 local_costmap_params.yaml 的框架名称中删除“/”字符。 如果您安装了 turtlebot3 包,这些文件可能存在于 /opt/ros/melodic/share/turtlebot3_navigation/param/,或者存在于您克隆 turtlebot3 存储库的位置。 有关详细信息,请查看 https://github.com/ros-planning/navigation/issues/794 上的讨论。

注意

如果 turtlebot3_navigation 没有为您安装 dwa-local-planner,ROS 可能会运行失败并显示以下消息:

[FATAL] [1567169699.791910573]: Failed to create the dwa_local_planner/DWAPlannerROS planner, are you sure it is properly registered and that the containing library is built? Exception: According to the loaded plugin descriptions the class dwa_local_planner/DWAPlannerROS with base class type nav_core::BaseLocalPlanner does not exist. Declared types are  base_local_planner/TrajectoryPlannerROS

在这种情况下,为您的 ROS 发行版安装缺少的依赖项,如下所示:

sudo apt install ros-<your_distro>-dwa-local-planner

例如,Melodic Morenia 的命令是

sudo apt install ros-melodic-dwa-local-planner

在此示例上构建

  • 要使用 isaac_sim_unity3d 而不是 Flatsim 进行模拟,请通过运行以下命令启动小型仓库场景:

    bob@desktop:~isaac_sim_unity3d/builds$ ./sample.x86_64 --scene small_warehouse --scenarioFile ~/isaac/sdk/packages/navsim/scenarios/turtlebot3_waffle_pi.json --scenario 0
    
  • 然后,在单独的终端上输入以下命令以运行与 Unity 和 ROS 通信的应用程序:

    bashbob@desktop:~/isaac/sdk$ bazel run packages/ros_bridge/apps:ros_to_navigation_unity3d -- --more apps/assets/maps/virtual_small_warehouse.json --config ros_navigation:packages/ros_bridge/maps/small_warehouse_map_transformation.config.json, ros_navigation:packages/ros_bridge/apps/ros_to_navigation_turtlebot3_waffle_pi.config.json
    
  • 使用与上述相同的命令运行 ROS:

    bob@desktop:~/isaac/sdk$ TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_navigation turtlebot3_navigation.launch 地图文件:=$(realpath packages/ros_bridge/maps/small_warehouse.yaml)
    

    和以前一样,可以通过拖动 Sight 中的“pose_as_goal”标记来修改目标。

  • 要在不同的地图上运行,只需在上面的命令中更改地图文件的路径(如果您不使用 flatsim,则在模拟器窗口中更改)。

  • 要模拟不同的机器人,请在上面的命令中更改机器人配置(如果您不使用 flatsim,则在模拟器窗口中更改)。 在这种情况下,还应更新 ROS 导航堆栈。

将 Isaac 映射转换为 ROS 映射

Isaac 和 ROS 之间的地图文件扩展名和地图框架约定不同:

  • Isaac 使用便携式网络图形 (.png) 地图,而 ROS 导航堆栈使用便携式灰度图格式 (.pgm)。

  • (0, 0)坐标对应Isaac map的左上角,x方向指向下方,而ROS的map_server的frame依赖于.yaml文件的origin参数。

以下是生成供 ROS 使用的 .yaml 和 .pgm 文件的步骤。 反向转换类似。

  1. 转换 Isaac 地图图像:

    bob@desktop:~/isaac/sdk$ convert apps/assets/maps/virtual_small_warehouse.png -flatten packages/ros_bridge/maps/small_warehouse.pgm
    

    如果愿意,您也可以在此命令中使用旋转标志。 我们将在步骤 3 中处理框架转换。

  2. 创建一个 packages/ros_bridge/maps/small_warehouse.yaml 文件,读取

    image: ./small_warehouse.pgm
    resolution: 0.1
    origin: [0.0, 0.0, 0.0]
    negate: 0
    occupied_thresh: 0.65
    free_thresh: 0.196
    

    您可以根据需要修改原点。 但是,分辨率字段应与 apps/assets/maps/virtual_small_warehouse.json 中的 cell_size 匹配。

  3. 找到从Isaac map frame到ROS map frame的正确转换创建packages/ros_bridge/maps/small_warehouse_map_transformation.config.json:

    {
    "pose_initializers": {
        "map_transformation": {
          "lhs_frame": "ros_map",
          "rhs_frame": "map",
          "pose": {
            "rotation": { "yaw_degrees": 180 },
            "translation": [19.3, 24.3, 0.0]
          }
        }
    }
    }
    
    

注意

ROS Answers 中描述了找到这种转换的一种方法:

  1. 启动 ROS 导航:
bob@desktop:~/isaac/sdk$ TURTLEBOT3_MODEL=waffle_pi roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$(realpath packages/ros_bridge/maps/small_warehouse.yaml)

  1. 在单独的终端中,键入以下内容:
bob@desktop:~/isaac/sdk$ rostopic echo /move_base_simple/goal

  1. 给出对应于上述 Isaac 地图框架的 2D 导航目标(即地图的左上角,指向下方)。 用rostopic在终端上打印的pose是ros_map_T_map。

更多精彩内容:
https://www.nvidia.cn/gtc-global/?ncid=ref-dev-876561

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/195218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

other-chatGPT记录

title: other-chatGPT记录 categories: Others tags: [人工智能, ai, 机器人, chatGPT] date: 2023-02-02 10:04:33 comments: false mathjax: true toc: true other-chatGPT记录 前篇 官网 https://openai.com/api - https://openai.com/api/测试 - https://platform.openai.…

DSP_CCS7实现变量的导出与MatLAB读取

前言 最近在做基于dsp平台的无通信接口系统辨识&#xff0c;因此需要直接利用CCS将数据导出&#xff0c;然后再利用MatLAB解析读取后的数据。MatLAB的代码参考了以下这篇链接: -/导出CCS3.3数据及使用matlab处理的方法.md at master dailai/- GitHub 高版本的CCS&#xff…

GitHub访问问题与 Steam++下载及使用(适合小白)

前言 &#x1f4dc; “ 作者 久绊A ” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴 ​ 目录 前言 一、Steam的介绍 1、大概介绍 2、详细介绍 二、Ste…

Unity与Android交互(双端通信)

前言 最近小编开始做关于手部康复的项目&#xff0c;需要Android集成Unity&#xff0c;以Android为主&#xff0c;Unity为辅的开发&#xff1b;上一篇给大家分享了Unity嵌入Android的操作过程&#xff0c;所以今天想给大家分享一下双端通信的知识&#xff1b; 一. Android与Un…

安装OpenResty

安装OpenResty 1.安装 首先你的Linux虚拟机必须联网 1&#xff09;安装开发库 首先要安装OpenResty的依赖开发库&#xff0c;执行命令&#xff1a; yum install -y pcre-devel openssl-devel gcc --skip-broken2&#xff09;安装OpenResty仓库 你可以在你的 CentOS 系统中…

物联网平台+业务平台基本架构设计与优化想法

前言 目前的交付底座有点老&#xff0c;而且集成的有点杂&#xff0c;计划是要升级下&#xff0c;先说想法&#xff0c;看领导做不做。 1 业务平台定位 我们的愿景&#xff1a;通过物联平台赋能&#xff0c;让数据产生价值。 为客户提供可视化的平台&#xff08;数据价值…

【王道数据结构】第二章 | 线性表

目录 2.1线性表的定义 2.2线性表的基础操作 2.3顺序表的定义 2.4顺序表的基本操作 2.5 线性表的链式表示 2.1线性表的定义 线性表是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个空表。若用L命名线性表&#xf…

Block底层原理读书笔记-《高级编程- iOS与OS多线程和内存管理》(更新中)

1 一个Block 真正的底层都有些什么&#xff1f; Block会被解析成一个结构体&#xff08;这里成为Block结构体&#xff09;&#xff0c;这个结构体里有&#xff1a; &#xff08;1&#xff09;isa指针&#xff08;说明Block的本质是一个对象&#xff09;&#xff1a;指向Stack…

动态修改Azure DevOps区域路径或迭代路径的继承权限(Inhertiance)

Contents1. 场景描述2. 解决方案2.1 更改继承的接口&#xff1a;ChangeInhertiance2.2 获取区域路径的接口&#xff1a;ClassificationNodes1. 场景描述客户使用工作项模板&#xff0c;定制了一个设计变更流程&#xff0c;需要在不同的阶段(流程状态)控制工作项的更改权限。我们…

Grafana 系列文章(六):Grafana Explore 中的日志

&#x1f449;️URL: https://grafana.com/docs/grafana/latest/explore/logs-integration/#labels-and-detected-fields &#x1f4dd;Description: Explore 中的日志 除了指标之外&#xff0c;Explore 还允许你在以下数据源中调查你的日志。 ElasticsearchInfluxDBLoki 在基…

[算法设计与分析考点4] 改进的串匹配算法——KMP算法

算法核心思想 在BF算法的基础上加以改进&#xff0c;BF算法中每次当前字符不相等时&#xff0c;主串S要回溯到其下一个字符处&#xff0c;模式串T要回溯到 j0 位置进行下一趟的匹配。然而&#xff0c;大多数情况下&#xff0c;这种回溯是没有必要的&#xff0c;非常耗时且效率低…

qt入门介绍

1.Qt 是一个跨平台的 C开发库。主要用来开发图形用户界面&#xff08;GUI&#xff09;程序。Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控件、布局、交互&…

【css】前端拉下代码后,node-sass sass-loader 与node版本不符怎么办

因为每次node和sass版本匹配都容易出现问题&#xff0c; 所以如果我自己开发&#xff0c;我不使用sass或者less&#xff0c;只用原生css 但如果是拉下来的项目&#xff0c;别人已经成功使用&#xff0c;webview版本 和 sass已经匹配&#xff0c;只需考虑 node版本匹配。 根据…

Hive分析函数系列文章

Hive分析窗口函数(一) SUM,AVG,MIN,MAXhttps://blog.csdn.net/weishuai90/article/details/128843715 Hive分析窗口函数(二) NTILE,ROW_NUMBER,RANK,DENSE_RANKhttps://blog.csdn.net/weishuai90/article/details/128858824 Hive分析窗口函数(三) CUME_DIST,PERCENT_RANKhttp…

Object类有什么作用?怎样使用Object类?

在Java中提供了一个Object类&#xff0c;它是所有类的父类&#xff0c;即每个类都直接或间接继承自该类&#xff0c;因此&#xff0c;Object类通常被称之为超类、基类或根类。当定义一个类时&#xff0c;如果没有使用extends关键字为这个类显示地指定父类&#xff0c;那么该类会…

【微积分易错点总结】函数、极限和连续

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

DSPE-PEG-DOTA,磷脂聚乙二醇大环配体 二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体

中文名称&#xff1a;二硬脂酰基磷脂酰乙醇胺- 聚乙二醇-四氮杂环配体 英文名称&#xff1a;DSPE-PEG-DOTA 别称&#xff1a;1,2-distearoyl-sn-glycero-3-phosphoethanolamine-poly(ethylene glycol)-DOTA PEG分子量&#xff1a;1000、2000、3400、5000等等 用 途&#xf…

《流浪地球2》的现实倒影(一):从量子计算机到MOSS

编者按&#xff1a;跟大家一样&#xff0c;《流浪地球2》的上映让我们感到无比兴奋。作为科技领域的内容创作者&#xff0c;在《流浪地球2》中不仅看到了中国科幻电影与电影工业的崛起&#xff0c;更看到了大量现实中真实存在的科技脉络。由于这部电影在科技方面的基本功非常扎…

RK3568平台开发系列讲解(驱动基础篇)自旋锁详解

🚀返回专栏总目录 文章目录 一、什么是spinlock 自旋锁二、什么是raw_spinlock原始自旋锁三、自旋锁的使用3.1、spinlock 自旋锁相关API3.2、raw_spinlock原始自旋锁相关API沉淀、分享、成长,让自己和他人都能有所收获!😄 📢自旋锁用于处理器之间的互斥,适合保护很短的…

Python枚举类定义和使用

一些具有特殊含义的类&#xff0c;其实例化对象的个数往往是固定的&#xff0c;比如用一个类表示月份&#xff0c;则该类的实例对象最多有 12 个&#xff1b;再比如用一个类表示季节&#xff0c;则该类的实例化对象最多有 4 个。针对这种特殊的类&#xff0c;Python 3.4 中新增…