15.Isaac教程--Isaac机器人引擎简介

news2025/1/17 14:10:18

Isaac机器人引擎简介

在这里插入图片描述
ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html

文章目录

  • Isaac机器人引擎简介
    • 基础
    • Codelets
    • 完整的应用

基础

本节介绍如何使用 Isaac 机器人引擎。 它介绍了相关术语并解释了 Isaac 应用程序的结构。

Isaac 应用程序由 JavaScript Object Notation (JSON) 文件定义。 以下示例位于 /sdk/apps/tutorials/ping/ping.app.json 的 Isaac SDK 中,显示了基本格式。

{
  "name": "ping",
  "modules": [
    "//apps/tutorials/ping:ping_components",
    "sight"
  ],
  "graph": {
    "nodes": [
      {
        "name": "ping",
        "components": [
          {
            "name": "ping",
            "type": "isaac::Ping"
          }
        ]
      }
    ],
    "edges": []
  },
  "config": {
    "ping" : {
      "ping" : {
        "message": "My own hello world!",
        "tick_period" : "1Hz"
      }
    }
  }
}

Isaac 应用程序由四个部分定义:

  • name 是一个包含应用程序名称的字符串。

  • modules 是正在使用的库列表。 在上面的示例中,我们包含 //apps/tutorials/ping:ping_components 以便“apps/tutorials/ping/Ping.cpp”可用。 Isaac SDK 带有高质量和经过良好测试的包,可以作为模块导入。 本教程后面将显示一个更长的模块示例。

  • graph有两个小节来定义应用程序的功能:

    • nodes 是我们应用程序的基本构建块。 在这个简单的例子中,我们只有一个名为“ping”的节点,它只有一个组件。 请注意,此组件的类型 isaac::Pingapps/tutorials/ping/Ping.hpp 的最后一行匹配。 一个典型的 Isaac 应用程序有多个节点,每个节点通常有多个组件。

    • edges 将组件连接在一起并使它们之间能够通信。 此示例不需要连接任何组件。

  • config 允许您根据您的用例调整每个节点的参数。 在此示例中,指定“ping”分量应以 1 赫兹tick。

定义应用程序后,接下来您需要创建一个 makefile。 以下是与 ping 应用程序关联的 BUILD 文件。

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

isaac_cc_module(
    name = "ping_components",
    srcs = ["Ping.cpp"],
    hdrs = ["Ping.hpp"],
)

isaac_app(
    name = "ping",
    data = ["fast_ping.json"],
    modules = [
        "sight",
        "//apps/tutorials/ping:ping_components",
    ],
)

Codelets

Codelets 是使用 Isaac 构建的机器人应用程序的基本构建块。 Isaac SDK 包括您可以在您的应用程序中使用的各种小代码。 下面的示例说明了如何导出Codelets。

为了更好地理解Codelets,请参阅了解Codelets部分。

以下 Ping.hpp 和 Ping.cpp 清单显示了位于 sdk/apps/tutorials/ping 的示例Codelets的源代码:

// This is the header file located at sdk/apps/tutorials/ping/Ping.hpp

#pragma once

#include <string>

#include "engine/alice/alice_codelet.hpp"

namespace isaac {

// A simple C++ codelet that prints periodically
class Ping : public alice::Codelet {
 public:
  // Has whatever needs to be run in the beginning of the program
  void start() override;
  // Has whatever needs to be run repeatedly
  void tick() override;

  // Message to be printed at every tick
  ISAAC_PARAM(std::string, message, "Hello World!");
};

}  // namespace isaac

ISAAC_ALICE_REGISTER_CODELET(isaac::Ping);
// This is the C++ file located at apps/tutorials/ping/Ping.cpp

#include "Ping.hpp"

namespace isaac {

void Ping::start() {
  // This part will be run once in the beginning of the program

  // We can tick periodically, on every message, or blocking. The tick period is set in the
  // json ping.app.json file. You can for example change the value there to change the tick
  // frequency of the node.
  // Alternatively you can also overwrite configuration with an existing configuration file like
  // in the example file fast_ping.json. Run the application like this to use an additional config
  // file:
  //   bazel run //apps/tutorials/ping -- --config apps/tutorials/ping/fast_ping.json
  tickPeriodically();
}

void Ping::tick() {
  // This part will be run at every tick. We are ticking periodically in this example.

  // Print the desired message to the console
  LOG_INFO(get_message().c_str());
}

}  // namespace isaac

完整的应用

下面显示的应用程序(位于 /sdk/apps/tutorials/proportional_control_cpp)功能更强大,具有具有多个节点的图、具有多个组件的节点、节点之间的边以及接收和传输消息的Codelets。

首先查看 JSON 文件以了解边缘是如何定义的。 请注意,此文件比上面的 ping 示例更长,但它遵循完全相同的语法。

{
  "name": "proportional_control_cpp",
  "modules": [
    "//apps/tutorials/proportional_control_cpp:proportional_control_cpp_codelet",
    "navigation",
    "segway",
    "sight"
  ],
  "config": {
    "cpp_controller": {
      "isaac.ProportionalControlCpp": {
        "tick_period": "10ms"
      }
    },
    "segway_rmp": {
      "isaac.SegwayRmpDriver": {
        "ip": "192.168.0.40",
        "tick_period": "20ms",
        "speed_limit_angular": 1.0,
        "speed_limit_linear": 1.0,
        "flip_orientation": true
      },
      "isaac.alice.Failsafe": {
        "name": "robot_failsafe"
      }
    },
    "odometry": {
      "isaac.navigation.DifferentialBaseOdometry": {
        "tick_period": "100Hz"
      }
    },
    "websight": {
      "WebsightServer": {
        "port": 3000,
        "ui_config": {
          "windows": {
            "Proportional Control C++": {
              "renderer": "plot",
              "channels": [
                { "name": "proportional_control_cpp/cpp_controller/isaac.ProportionalControlCpp/reference (m)" },
                { "name": "proportional_control_cpp/cpp_controller/isaac.ProportionalControlCpp/position (m)" }
              ]
            }
          }
        }
      }
    }
  },
  "graph": {
    "nodes": [
      {
        "name": "cpp_controller",
        "components": [
          {
            "name": "message_ledger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "isaac.ProportionalControlCpp",
            "type": "isaac::ProportionalControlCpp"
          }
        ]
      },
      {
        "name": "segway_rmp",
        "components": [
          {
            "name": "message_ledger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "isaac.SegwayRmpDriver",
            "type": "isaac::SegwayRmpDriver"
          },
          {
            "name": "isaac.alice.Failsafe",
            "type": "isaac::alice::Failsafe"
          }
        ]
      },
      {
        "name": "odometry",
        "components": [
          {
            "name": "message_ledger",
            "type": "isaac::alice::MessageLedger"
          },
          {
            "name": "isaac.navigation.DifferentialBaseOdometry",
            "type": "isaac::navigation::DifferentialBaseOdometry"
          }
        ]
      },
      {
        "name": "commander",
        "subgraph": "packages/navigation/apps/differential_base_commander.subgraph.json"
      }
    ],
    "edges": [
      {
        "source": "segway_rmp/isaac.SegwayRmpDriver/segway_state",
        "target": "odometry/isaac.navigation.DifferentialBaseOdometry/state"
      },
      {
        "source": "odometry/isaac.navigation.DifferentialBaseOdometry/odometry",
        "target": "cpp_controller/isaac.ProportionalControlCpp/odometry"
      },
      {
        "source": "cpp_controller/isaac.ProportionalControlCpp/cmd",
        "target": "commander.subgraph/interface/control"
      },
      {
        "source": "commander.subgraph/interface/command",
        "target": "segway_rmp/isaac.SegwayRmpDriver/segway_cmd"
      }
    ]
  }
}

文件 isaac_app 与 ping 示例非常相似。 但是,添加了此应用程序所需的模块,如“segway”。

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

isaac_cc_module(
    name = "proportional_control_cpp_codelet",
    srcs = ["ProportionalControlCpp.cpp"],
    hdrs = ["ProportionalControlCpp.hpp"],
    visibility = ["//visibility:public"],
    deps = [
        "//messages/state:differential_base",
        "//packages/engine_gems/state:io",
    ],
)

isaac_app(
    name = "proportional_control_cpp",
    data = [
        "//packages/navigation/apps:differential_base_commander_subgraph",
    ],
    modules = [
        "//apps/tutorials/proportional_control_cpp:proportional_control_cpp_codelet",
        "navigation",
        "segway",
        "sensors:joystick",
        "sight",
        "viewers",
    ],
)

下面的 ProportionalControlCpp 小码可以通过 ISAAC_PROTO_RX ISAAC_PROTO_TX 宏以及 JSON 文件中的关联边与其他组件进行通信。

// This is the header file located at
// sdk/apps/tutorials/proportional_control_cpp/ProportionalControlCpp.hpp

  #pragma once

  #include "engine/alice/alice_codelet.hpp"
  #include "messages/differential_base.capnp.h"
  #include "messages/state.capnp.h"

  namespace isaac {

  // A C++ codelet for proportional control
  //
  // We receive odometry information, from which we extract the x position. Then, using refence and
  // gain parameters that are provided by the user, we compute and publish a linear speed command
  // using `control = gain * (reference - position)`
  class ProportionalControlCpp : public alice::Codelet {
   public:
    // Has whatever needs to be run in the beginning of the program
    void start() override;
    // Has whatever needs to be run repeatedly
    void tick() override;

    // List of messages this codelet recevies
    ISAAC_PROTO_RX(Odometry2Proto, odometry);
    // List of messages this codelet transmits
    ISAAC_PROTO_TX(StateProto, cmd);

    // Gain for the proportional controller
    ISAAC_PARAM(double, gain, 1.0);
    // Reference for the controller
    ISAAC_PARAM(double, desired_position_meters, 1.0);
  };

  }  // namespace isaac

  ISAAC_ALICE_REGISTER_CODELET(isaac::ProportionalControlCpp);

// This is the C++ file located at
// apps/tutorials/proportional_control_cpp/ProportionalControlCpp.cpp

#include "ProportionalControlCpp.hpp"

#include "messages/math.hpp"
#include "messages/state/differential_base.hpp"
#include "packages/engine_gems/state/io.hpp"

namespace isaac {

void ProportionalControlCpp::start() {
  // This part will be run once in the beginning of the program

  // Print some information
  LOG_INFO("Please head to the Sight website at <IP>:<PORT> to see how I am doing.");
  LOG_INFO("<IP> is the Internet Protocol address where the app is running,");
  LOG_INFO("and <PORT> is set in the config file, typically to '3000'.");
  LOG_INFO("By default, local link is 'localhost:3000'.");

  // We can tick periodically, on every message, or blocking. See documentation for details.
  tickPeriodically();
}

void ProportionalControlCpp::tick() {
  // This part will be run at every tick. We are ticking periodically in this example.

  // Nothing to do if we haven't received odometry data yet
  if (!rx_odometry().available()) {
    return;
  }

  // Read parameters that can be set through Sight webpage
  const double reference = get_desired_position_meters();
  const double gain = get_gain();

  // Read odometry message received
  const auto& odom_reader = rx_odometry().getProto();
  const Pose2d odometry_T_robot = FromProto(odom_reader.getOdomTRobot());
  const double position = odometry_T_robot.translation.x();

  // Compute the control action
  const double control = gain * (reference - position);

  // Show some data in Sight
  show("reference (m)", reference);
  show("position (m)", position);
  show("control", control);
  show("gain", gain);

  // Publish control command
  messages::DifferentialBaseControl command;
  command.linear_speed() = control;
  command.angular_speed() = 0.0;  // This simple example sets zero angular speed
  ToProto(command, tx_cmd().initProto(), tx_cmd().buffers());
  tx_cmd().publish();
}

}  // namespace isaac

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

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

相关文章

卫星AIS接收机

1.设备简介星载AIS模块&#xff0c;专门针对小卫星设计的AIS载荷&#xff0c;设计时考虑到CubeSat的尺寸、重量和功率限制&#xff0c;也可以作为较大的LEO卫星上的有效载荷。2.产品特征独立4信道AIS接收机集成LNA和SAW滤波器AIS帧的数据存储支持频谱样本采集安全在轨软件升级支…

【Wiki】XWiki安装教程_War包版本

目录0、XWiki说明1、war包安装说明1.1、环境说明1.2、如果懒得下载可以使用这边准备好的物料包汇总2、war包安装2.1、Tomcat安装2.2、java安装(需要root权限)2.3 、使用 source /etc/profile 刷新linux配置2.4、数据库安装2.5、解压war包与xip2.6、修改配置文件2.6.1、修改WEB-…

mysql快速生成100W条测试数据(4)全球各城市房价和销售数据并存入mysql数据库

首先这个就是我们需要生成的数据类型&#xff0c;这种只是我们用于测试以及学习时候使用&#xff0c;主要就是全球城市房价的均值和一些虚拟的销售数据 这是之前的文章里面包含一些以前的一些操作流程可以进行参考学习 更加详细操作步骤在第一篇文章里面 mysql快速生成100W条测…

Speckle Revit连接器使用教程

Speckle Revit 连接器目前支持 Autodesk Revit 2020、2021、2022 和 &#x1f195;2023。 1、安装Speckle revit连接器 要安装 Revit 连接器并添加 Speckle 帐户&#xff0c;请按照 Speckle 管理器中的说明进行操作。 安装后&#xff0c;可以在Speckle选项卡下的功能区菜单中…

一个前端大神电脑里的秘密

前言作为前端仔&#xff0c;当你入职一家公司&#xff0c;拿到新发的电脑&#xff0c;你会对电脑干点啥&#xff0c;装开发环境&#xff1f;装软件&#xff1f;你是否铺天盖地到处找之前电脑备份的东西&#xff1f;又或者是想不起来有什么上一台电脑好用的软件叫什么名&#xf…

KT148A语音芯片420s秒的语音空间是什么意思,mp3文件支持多大

一、问题简介 我想问一下KT148A这个芯片真的能存420秒的语音么&#xff1f;我随便一个5秒的语音mp3格式都65k了&#xff0c;如果是这样的话 那我的mp3的源文件在最小的采样率和最小码率的情况下 mp3文件可以支持多大&#xff1f;有没有实际测试的数据&#xff0c;使用的是一线串…

【可解释性机器学习】可解释机器学习简介与特征选择方法

特征选择&#xff1a;Feature Importance、Permutation Importance、SHAP1. Introduction什么是可解释机器学习&#xff08;Explainable ML&#xff09;&#xff1f;为什么需要Explainable ML?直接使用一些可以interpretable的模型不好吗&#xff1f;2. Local Explanation方法…

Homekit智能家居DIY-智能吸顶灯

灯要看什么因素 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#xff09;单位面积&#xff0c;简单理解的话就是越靠近灯光&#xff0c;看的就越清楚&#xff0c;是个常识性问题。 不同房间户型对照度的要求自然不尽相同&#xff0c;…

http协议之Range

http协议中可能会遇到&#xff1a;请求取消或数据传输中断&#xff0c;这时客户端已经收到了部分数据&#xff0c;后面再请求时最好能请求剩余部分&#xff08;断点续传&#xff09;&#xff1b;或者&#xff0c;对于某个较大的文件&#xff0c;能够支持客户端多线程分片下载..…

某集团汽车配件电子图册性能分析案例(三)

背景 汽车配件电子图册系统是某汽车集团的重要业务系统。业务部门反映&#xff0c;汽车配件电子图册调用图纸时&#xff0c;出现访问慢现象。 汽车集团总部已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史原始流量。本次分析重点针对汽车配件电子图册…

web服务器、中间件和他们的漏洞

目录 Nginx Apache Tomcat IIS 漏洞 Apache解析漏洞 文件名解析漏洞 罕见后缀 .htaccess文件 Ngnix解析漏洞 畸形解析漏洞(test.jpg/*.php) %00空字节代码解析漏洞 CVE-2013-4547(%20%00) IIS解析漏洞 目录解析漏洞(/test.asp/1.jpg) 文件名解析漏洞(test.asp;…

想转行没方向,PMP证书用处大吗?

当下了要转行的决心&#xff0c;你又陷入另一种焦虑中——怎么转&#xff1f;毕竟“隔行如隔山”。要知道缺乏经验&#xff0c;你要面对的是旷日持久的努力、未知的付出和回报转换率。 但别忘了&#xff0c;在山与山之间&#xff0c;有一些纵横交错的道路相连&#xff0c;可以…

详解SpringMVC

1.DispatcherServlet初始化时机 DispatcherServlet是由spring创建的&#xff0c;初始化是由Tomcat完成的&#xff0c;通过setLoadOnStartup来决定是否为tomcat启动时初始化 Configuration ComponentScan // 没有设置扫描包的话默认扫描当前配置的包及其子包 PropertySource(&…

verilog学习笔记- 11)按键控制蜂鸣器实验

简介&#xff1a; 蜂鸣器按照驱动方式主要分为有源蜂鸣器和无源蜂鸣器&#xff0c;其主要区别为蜂鸣器内部是否含有震荡源。一般的有源蜂鸣器内部自带了震荡源&#xff0c;只要通电就会发声。而无源蜂鸣器由于不含内部震荡源&#xff0c;需要外接震荡信号才能发声。 左边为有源…

JAVA JVM学习

1.JVM介绍 越界检查肯定有用&#xff0c;防止覆盖别的地方的代码。 JVM来评价java在底层操作系统的差异。 2.程序计数器 我们java源代码会变成一条一条jvm指令。 在物理上实现程序计数器&#xff0c;是用一个寄存器。这样速度更快。 程序计数器不会内存溢出 2.1 线程私有 …

clickhouse整合ldap,无需重启

测试你的ladp服务ldapsearch -x-bdcexample,dccom -H ldap://ldap.forumsys.com应该输出类似以下的内容# extended LDIF # # LDAPv3 # base <dcexample,dccom> with scope subtree # filter: (objectclass*) # requesting: ALL # ​ # example.com dn: dcexample,dccom o…

【Premake】构建工程

Premake 一、什么是Premake&#xff1f; Premake 是一种命令工具&#xff0c;通过读取项目脚本&#xff0c;来生成各种开发环境的项目文件。 开源地址&#xff1a;https://github.com/premake/premake-core 下载地址&#xff1a;https://premake.github.io 实例地址&#xf…

揭秘HTTP/3优先级

编者按 / 相对于HTTP2&#xff0c;HTTP/3的优先级更加简单&#xff0c;浏览器厂商更可能实现统一的优先级策略。本文来自老朋友Robin Marx&#xff0c;已获授权转载&#xff0c;感谢刘连响对本文的技术审校。翻译 / 核子可乐技术审校 / 刘连响原文链接 / https://calendar.per…

【MySQL数据库入门】:面试中常遇到的 ‘ 数据类型 ’

文章目录数据类型1.数据类型分类2.数值类型2.1 tinyint类型2.2 bit类型2.3 小数类型2.3.1 float2.3.2 decimal3.字符串类型3.1 char3.2 varchar3.3 char和varchar比较4.日期和时间类型5.enum和set数据类型 1.数据类型分类 2.数值类型 2.1 tinyint类型 create table tt1(num t…

解决unable to find valid certification path to requested target

问题描述 最近java程序去调用远程服务器接口时报错了&#xff1a; I/O error on POST request for “https://XXX.xyz/create”: sun.secu rity.validator.ValidatorException: PKIX path building failed: sun.security.provi der.certpath.SunCertPathBuilderException: una…