5.Isaac教程--创建Isaac应用

news2024/11/20 18:46:17

创建Isaac应用

本教程将指导您完成使用 Isaac SDK 创建机器人应用程序的过程,以视频输入的 OpenCV 边缘检测处理为例。

文章目录

  • 创建Isaac应用
    • 预安装
    • 显示相机源
    • 创建应用程序文件
    • 启用节点间通信
    • 配置组件
    • 创建 Bazel 构建文件
    • 运行应用程序
    • 查看相机源
    • 处理相机源
    • 添加边缘检测节点
    • 修改应用程序边缘
    • 修改构建文件
    • 运行应用程序
    • 处理来自模拟的输入
    • 更换相机节点
    • 添加第二个 Camera_Viewer 节点
    • 修改应用程序edges
    • 添加 WebSight 配置
    • 修改构建文件
    • 启动Unity3D
    • 运行应用程序
    • 接下来

本教程将指导您完成以下步骤:

  1. 使用 Isaac SDK 显示 USB 摄像头源。

  2. 使用 OpenCV 边缘检测处理相机提要并显示处理后的提要。

  3. 使用 OpenCV 边缘检测处理来自 Isaac Sim Unity3D 的模拟输入。

预安装

本教程需要以下硬件/软件:

  1. 安装了 Issac SDK 和所有先决条件以及 Isaac Sim Unity3D 的 Linux x86 机器。 有关详细信息,请参阅设置页面。

  2. 与 Video4Linux2 (V4L2) 驱动程序兼容的 USB 摄像头

显示相机源

第一步,我们将使用 Isaac V4L2 组件在 Linux x86 机器上捕获摄像头源并将其显示在 Websight 中。

注意

此应用程序的完整 JSON 和构建文件可在 //apps/samples/v4l2_camera 获得。

创建应用程序文件

在 Isaac //apps 目录的新文件夹中创建一个名为 v4l2_camera.app.json 的 JSON 应用程序文件。 添加如下所示的内容:

{
   "name": "v4l2_camera",
   "modules": [
     "sensors:v4l2_camera",
     "sight",
     "viewers"
   ],
   "graph": {
       "nodes": [
         {
           "name": "camera",
           "components": [
             {
               "name": "V4L2Camera",
               "type": "isaac::V4L2Camera"
             }
           ]
         },
         {
           "name": "viewer",
           "components": [
             {
               "name": "ImageViewer",
               "type": "isaac::viewers::ImageViewer"
             }
           ]
         }
       ]
}

应用程序“graph”定义了两个节点:一个“camera”节点,它使用 V4L2Camera 组件捕获相机提要,以及一个“viewer”节点,它使用 ImageViewer 组件在 Websight 中显示提要。 “modules”部分包括应用程序中的这些组件。

启用节点间通信

要启用“camera”“viewer”节点之间的通信,请将 MessageLedger 组件添加到它们:

{
   "name": "v4l2_camera",
   "modules": [
     "sensors:v4l2_camera",
     "sight",
     "viewers"
   ],
   "graph": {
       "nodes": [
         {
           "name": "camera",
           "components": [
             {
               "name": "MessageLedger",
               "type": "isaac::alice::MessageLedger"
             },
             {
               "name": "V4L2Camera",
               "type": "isaac::V4L2Camera"
             }
           ]
         },
         {
           "name": "viewer",
           "components": [
             {
               "name": "MessageLedger",
               "type": "isaac::alice::MessageLedger"
             },
             {
               "name": "ImageViewer",
               "type": "isaac::viewers::ImageViewer"
             }
           ]
         }
       ],
}

使用“edges”小节将源“camera”节点连接到目标“viewer”节点。

"graph": {
    "nodes": [
      ...
    ],
    "edges": [
      {
        "source": "camera/V4L2Camera/frame",
        "target": "viewer/ImageViewer/image"
      }
    ]

配置组件

添加“config”部分以设置 USB 摄像头和 Websight 服务器的参数。 在“websight”部分中,“windows”子部分创建了一个窗口,用于在 Websight 中呈现摄像头源。

{
  "name": "v4l2_camera",
  "modules": [
    "sensors:v4l2_camera",
    "sight",
    "viewers"
  ],
  "graph": {
  ...
  },
  "config": {
    "camera": {
      "V4L2Camera": {
        "device_id": 0,
        "rows": 480,
        "cols": 640,
        "rate_hz": 30
      }
    },
    "websight": {
      "WebsightServer": {
        "port": 3000,
        "ui_config": {
          "windows": {
            "Camera": {
              "renderer": "2d",
              "channels": [
                { "name": "v4l2_camera/viewer/ImageViewer/image" }
              ]
            }
          }
        }
      }
    }
  },

创建 Bazel 构建文件

在与 JSON 应用程序文件相同的目录中创建一个名为 BUILD 的文件。 BUILD 文件指定应用程序的“名称”和应用程序使用的 Isaac 模块。 应用程序名称应与 <name>.app.json 应用程序文件名的 <name> 相匹配。

load("//bzl:module.bzl", "isaac_app")

isaac_app(
    name = "v4l2_camera",
    modules = [
        "sensors:v4l2_camera",
        "sight",
        "viewers",
    ],
)

运行应用程序

打开控制台窗口,导航到 Isaac 目录,然后按照入门页面中的描述运行应用程序:

bob@desktop:~/isaac/sdk$ bazel run //apps/samples/v4l2_camera

查看相机源

通过导航到 http://localhost:3000/,在 Web 浏览器中打开 Websight。 您应该在 Websight 的窗口中看到视频流。 如果不这样做,请确保选中左侧的 Channels > v4l2_camera 框。

要停止应用程序,请在控制台中按 Ctrl+C。

处理相机源

接下来,我们将构建在上一节中创建的应用程序图,以对相机源执行边缘检测。

注意

此应用程序的完整 JSON 和构建文件可在 //apps/tutorials/opencv_edge_detection 获得。 JSON 文件名为 opencv_edge_detection.app.json

添加边缘检测节点

将第三个节点“edge_detector”添加到应用程序图中。 该节点将使用 Isaac EdgeDetector 组件对 V4L2 摄像头源执行边缘检测。

"graph": {
    "nodes": [
      {
        "name": "camera",
        "components": [
          {
            "name": "MessageLedger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "V4L2Camera",
            "type": "isaac::V4L2Camera"
          }
        ]
      },
      {
        "name": "edge_detector",
        "components": [
          {
            "name": "MessageLedger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "EdgeDetector",
            "type": "isaac::opencv::EdgeDetector"
          }
        ]
      },
      {
        "name": "viewer",
        "components": [
          {
            "name": "MessageLedger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "ImageViewer",
            "type": "isaac::viewers::ImageViewer"
          }
        ]
      }
    ],

您还需要在“modules”部分添加 EdgeDetector 组件:

"modules": [
    "//apps/tutorials/opencv_edge_detection:edge_detector",
    "sensors:v4l2_camera",
    "sight",
    "viewers"
],

修改应用程序边缘

修改“edges”部分,使“camera”节点将提要传递给“edge_detector”节点,然后由“edge_detector”节点将处理后的提要发送给“viewer”节点。

"graph": {
    "nodes": [
      ...
    ],
    "edges": [
      {
        "source": "camera/V4L2Camera/frame",
        "target": "edge_detector/EdgeDetector/input_image"
      },
      {
        "source": "edge_detector/EdgeDetector/output_image",
        "target": "viewer/ImageViewer/image"
      }
    ]

修改构建文件

在应用程序构建文件中包含 EdgeDetector codelet:

load("//bzl:module.bzl", "isaac_app", "isaac_cc_module")

isaac_app(
    name = "opencv_edge_detection",
    modules = [
        "//apps/tutorials/opencv_edge_detection:edge_detector",
        "sensors:v4l2_camera",
        "sight",
        "viewers",
    ],
)

运行应用程序

运行应用程序:

bob@desktop:~/isaac/sdk$ bazel run //apps/tutorials/opencv_edge_detection

打开Websight。 您应该看到带有边缘检测的视频流。 如果不是这样,请确保选中左侧的 Channels > opencv_edge_detection 框。

处理来自模拟的输入

在这最后一部分中,我们将把我们的边缘检测应用程序与模拟机器人集成在一起。

注意

此应用程序的完整 JSON 和构建文件可在 //apps/tutorials/opencv_edge_detection 获得。 JSON 文件名为 opencv_unity3d.app.json。

更换相机节点

从应用程序图中删除“camera”节点。 将其替换为“simulation”节点,如下所示。 此节点中的子图允许应用程序访问来自 Unity3D 模拟的各种数据流,就好像它们是真实的传感器一样。 此子图还支持向模拟中的 Carter 机器人发送命令,但构建 App 教程中未涵盖该主题。

"graph": {
  "nodes": [
    {
      "name": "simulation",
      "subgraph": "packages/navsim/apps/navsim_navigation.subgraph.json"
    },
    {
      "name": "edge_detector",
      "components": [
        {
          "name": "MessageLedger",
          "type": "isaac::alice::MessageLedger"
        },
        {
          "name": "EdgeDetector",
          "type": "isaac::opencv::EdgeDetector"
        }
      ]
    },
   ...

添加第二个 Camera_Viewer 节点

为了将边缘检测输出与标准相机进行比较,我们希望在 Websight 中看到这两个流。 为此,添加第二个使用 ImageViewer 组件的节点。 在下面的示例中,两个节点分别命名为“edge_camera_viewer”和“camera_viewer”。

"graph": {
  "nodes": [
    {
      "name": "simulation",
      "subgraph": "packages/navsim/apps/navsim_navigation.subgraph.json"
    },
    {
      "name": "edge_detector",
      "components": [
        {
          "name": "MessageLedger",
          "type": "isaac::alice::MessageLedger"
        },
        {
          "name": "EdgeDetector",
          "type": "isaac::opencv::EdgeDetector"
        }
      ]
    },
    {
      "name": "edge_camera_viewer",
      "components": [
        {
          "name": "MessageLedger",
          "type": "isaac::alice::MessageLedger"
        },
        {
          "name": "ImageViewer",
          "type": "isaac::viewers::ImageViewer"
        }
      ]
    },
    {
      "name": "camera_viewer",
      "components": [
        {
          "name": "MessageLedger",
          "type": "isaac::alice::MessageLedger"
        },
        {
          "name": "ImageViewer",
          "type": "isaac::viewers::ImageViewer"
        }
      ]
    }
  ...

修改应用程序edges

在“edges”部分,修改第一“edges”,以便“edge_detector”节点接收来自模拟的输入。 为每个“查看器”节点包含一条边:“edge_camera_viewer”节点连接到“edge_detector”节点,而“camera_viewer”直接从模拟接收流。

"edges": [
      {
        "source": "simulation.interface/output/color",
        "target": "edge_detector/EdgeDetector/input_image"
      },
      {
        "source": "edge_detector/EdgeDetector/output_image",
        "target": "edge_camera_viewer/ImageViewer/image"
      },
      {
        "source": "simulation.interface/output/color",
        "target": "camera_viewer/ImageViewer/image"
      }
    ]

添加 WebSight 配置

在“config”部分,添加另一个窗口以显示另一个摄像头源。 请注意,您需要更改通道“name”以匹配修改后的节点名称。

"config": {
   "websight": {
         "WebsightServer": {
           "port": 3000,
           "ui_config": {
             "windows": {
               "Edge Detection": {
                 "renderer": "2d",
                 "dims": {
                   "width": 640,
                   "height": 480
                 },
                 "channels": [
                   {
                     "name": "opencv_unity3d/edge_camera_viewer/ImageViewer/image"
                   }
                 ]
               },
               "Color Camera": {
                 "renderer": "2d",
                 "dims": {
                   "width": 640,
                   "height": 480
                 },
                 "channels": [
                   {
                     "name": "opencv_unity3d/camera_viewer/ImageViewer/image"
                   }
                 ]
               }
             }
           }
         }
       }

我们还建议配置每个 ImageViewer 组件以减少资源消耗并使视频大小易于管理:

"config": {
    "edge_camera_viewer": {
      "ImageViewer": {
        "target_fps": 20,
        "reduce_scale": 4
      }
    },
    "camera_viewer": {
      "ImageViewer": {
        "target_fps": 20,
        "reduce_scale": 4
      }
    },

修改构建文件

要使用与 Unity3D 交互的“navsim_navigation”子图,您需要将其添加到 BUILD 文件中:

data = [
    "//packages/navsim/apps:navsim_navigation_subgraph",
],
modules = [
    "//apps/tutorials/opencv_edge_detection:edge_detector",
    "viewers"
],

启动Unity3D

在运行您的应用程序之前,您需要在 Unity3D 中启动“small_warehouse”示例场景:

bob@desktop:~/isaac_sim_unity3d$ cd builds
bob@desktop:~/isaac_sim_unity3d/builds$ ./sample.x86_64 --scene small_warehouse

Unity 窗口应打开,显示带有 Carter 机器人的仓库的俯视图。

运行应用程序

运行 Isaac 应用程序,它将从模拟中接收传感器数据:

bob@desktop:~/isaac/sdk$ bazel run //apps/tutorials/opencv_edge_detection:opencv_unity3d

在 Websight 中,您应该会看到模拟 Carter 的标准摄像头视图,以及经过边缘检测处理的视图。

接下来

现在您已经构建了几个应用程序,您可以准备探索 Isaac SDK 的其他方面:

  • 创建小码:本教程使用预先存在的小码来构建应用程序。 按照在 C++ 中开发小码教程学习如何构建您自己的小码。

  • 在真实机器人上运行应用程序:模拟之后,下一步是让您的应用程序在真实机器人上运行。 Isaac SDK 提供 NVIDIA Kaya 和 NVIDIA Carter 参考设计,以构建具有完整导航和感知能力的机器人。 请参阅 Jetson Nano 入门页面,了解如何将 Isaac 应用程序发布到 Jetson 设备。

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

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

相关文章

1.6日报

以redis为基础完成 addCacheData getCacheDataByUniqueId delCacheDataByUniqueId 并且测试通过。 升级getQRcodeAndScene接口&#xff0c;添加版本参数&#xff0c;实现“不同环境取不同小程序版本“功能 并添加扫码跳转页面功能。 遇到的问题及解决 加深对RequestBody…

性能优化系列之『HTTP-2 :升级HTTP-2的好处有哪些?如何升级?』

文章の目录一、HTTP/2 概念二、HTTP/2 优点三、HTTP/2 站点的优势四、在 Nginx 上启用 HTTP/21、升级 OpenSSL2、重新编译3、验证 HTTP/24、浏览器请求截图写在最后一、HTTP/2 概念 HTTP/2&#xff08;超文本传输协议第2版&#xff0c;最初命名为 HTTP 2.0&#xff09;&#x…

【Spring AOP】@Aspect结合案例详解(一): @Pointcut使用@annotation + 五种通知Advice注解

文章目录前言AOP与Spring AOPAspect简单案例快速入门一、Pointcutannotation二、五种通知Advice1. Before前置通知2. After后置通知3. AfterRunning返回通知4. AfterThrowing异常通知5. Around环绕通知总结前言 在微服务流行的当下&#xff0c;在使用SpringCloud/Springboot框…

分布式基础篇3——前端开发基础知识

前端技术对比一、ES61、简介2、什么是 JavaScript3、ES6新特性3.1 let3.2 const3.3 解构表达式3.4 字符串扩展3.5 函数优化3.6 对象优化3.7 map 和 reduce3.8 Promise3.9 模块化二、Vue1、MVVM 思想2、Vue 简介3、Vue 入门案例4、Vue 指令插值表达式v-text、v-htmlv-bindv-mode…

景区地图最短路径快速实现

1 前言以前粗略学习了一下在地图中实现最短路径&#xff0c;并在切图工具中实现了自动处理生成导航相关数据。https://blog.csdn.net/bq_cui/article/details/86795213最近发现工具实现的结果&#xff0c;错误一大堆。这次再详细捋一捋整个步骤&#xff0c;感兴趣的同学可以试一…

ctemplate 的安装和使用

ctemplate 用于linux下的web开发&#xff0c;可以动态生成一个html网页&#xff0c;这里的 “ 动态 ” 指的是网页的数据不是固定的&#xff0c;可以使用变量来填充网页内容。 目录 1、下载ctemplate 2、安装 ctemplate 3、使用ctemplate库 1、下载ctemplate 可以在gite…

前端对接微信公众号网页开发流程,授权对接

前面讲到 前端对接微信公众号网页开发流程&#xff0c;前期配置&#xff0c;本篇文章主要详细介绍关于公众号的授权对接。 一、引入微信js-sdk 在需要调用 JS 接口的页面引入如下 JS 文件 http://res.wx.qq.com/open/js/jweixin-1.6.0.js如需进一步提升服务稳定性&#xff0…

如何在windows上使用VMware安装macOS虚拟机

如何在windows上使用VMware安装macOS虚拟机一、准备工作1.1 安装 VMware1.2 下载macOS的安装包1.3 下载VMware虚拟机解锁安装苹果系统工具二、解锁VMware支持macOS安装2.1 关闭已经打开的VMware软件2.2 安装VMware Workstation Unlocker三、VMware创建虚拟机3.1 解压缩macOS的安…

【蓝桥杯】X 进制减法

难点一&#xff1a;base base * s[i] % mod;//***当前位乘以x&#xff0c;x要*s[i],一直要乘到个位的进制难点二&#xff1a;当当前该位的的进制位&#xff0c;为max(max(a[i]1, b[i]1), 2)的时候&#xff0c;结果最小ACcode:#include<iostream>using namespace std;con…

性能优化系列之『混合式开发: React Native内核及优势介绍』

文章の目录一、React Native愿景二、技术优势1、技术2、效率3、发版三、底层内核1、RN&#xff1a;helloWorld.jsx2、iOS&#xff1a;helloWorld.m3、Android&#xff1a;helloWorld.xml4、Web&#xff1a;helloWorld.html四、行业背景五、选型建议写在最后一、React Native愿景…

【计算机体系结构基础】指令流水线

单周期处理器 简要描述单周期处理器的执行过程&#xff1a; PC从指令存储器中读取指令 取指后译码得出相关的控制信号读取regfile&#xff08;寄存器堆&#xff09; 运算器对regfile中取出的操作数进行计算&#xff0c;将计算的结果写回通用寄存器堆或者得到访存指令的地址或…

边缘数据采集网关如何实现PLC远程上下载

边缘数据采集网关&#xff0c;又称边缘计算网关、工业物联网网关&#xff0c;是连接工业设备与通信网络的桥梁&#xff0c;可以实现不同协议之间的解析转换&#xff0c;打造高效实时的数据采集系统&#xff0c;并借助边缘计算规则对数据进行清洗过滤&#xff0c;适配云平台实现…

QT 学习笔记(十五)

文章目录一、UDP 通信过程1. Linux 下的 UDP 通信过程2. QT 下的 UDP 通信过程3. 在 QT 中实现 UDP 通信的流程4. TCP/IP 和 UDP的区别二、UDP 文本发送1. UDP 文本发送实例演示2. UDP 广播3. UDP 组播三、UDP 文本发送实现代码1. 主窗口头文件 widget.h2. 主窗口源文件 widget…

论文创新及观点

FEW-SHOT TEXT CLASSIFICATION WITH DISTRIBUTIONAL SIGNATURES 任务 Given an N-way K-shot classification task 论文设计图像 数据集 20 Newsgroups is comprised of informal discourse from news discussion forums (Lang, 1995).Documents are organized under 20 to…

数据分析-深度学习 Day2

目录&#xff1a;第一节 机器学习&深度学习介绍第二节 机器学习攻略一、机器学习的框架二、模型训练攻略三、针对Optimization Issue的优化&#xff0c;类神经网络训练不起来怎么办(一) 局部最优点和鞍点(二) 批处理和momentum(三) 自动调节学习率Learning rate(四) 损失函…

vue实现微信端和企业微信端扫码

前要&#xff1a;微信端调用微信的扫一扫和企业微信端调用企业微信的扫一扫获取订单码查询&#xff01;&#xff01; 一、微信端扫一扫 这里使用的是uniapp框架调用微信的内置sdk扫码防伪溯源&#xff01;http引入或者npm安装模块&#xff1a; //public/index.html <!DOCT…

《设计模式》命令模式

《设计模式》设计模式的基本原则 《设计模式》单例模式 《设计模式》工厂模式 《设计模式》原型模式 《设计模式》建造者模式 《设计模式》适配器模式 《设计模式》桥接模式 《设计模式》装饰者模式 《设计模式》组合模式 《设计模式》外观模式 《设计模式》享元模式 《设计模式…

【Java开发】Spring Cloud 03 :Spring Boot 项目搭建

为了体验从 0 到 1 的微服务改造过程&#xff0c;我们先使用 Spring Boot 搭建一个基础版的优惠券平台项目&#xff0c;等学习到 Spring Cloud 的时候&#xff0c;我们就在这个项目之上做微服务化改造&#xff0c;将 Spring Cloud 的各个组件像添砖加瓦一样集成到项目里。上一章…

jacoco:java代码覆盖率实践

文章目录一、jacoco基本了解二、实践准备三、jacoco使用3.1 插桩3.2 dump:覆盖率文件导出3.3 report:可视化报告3.4 merge:合并覆盖率文件四、相关命令扩展4.1 javaagent4.2 dump4.3 merge4.4 report五、资源链接一、jacoco基本了解 jacoco是一款面向java的代码覆盖率工具&…

linux系统中C++中构造与析构函数以及this的使用方法

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;C里面的基本语法结构以及对应的操作方法。 目录 第一&#xff1a;构造函数与析构函数 第二&#xff1a;this指针 第一&#xff1a;构造函数与析构函数 什么是构造函数&#xff1f;构造函数在对象实例化时被系统自动调用&a…