36.Isaac教程--复合消息

news2024/11/15 4:38:40

复合消息

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

文章目录

  • 复合消息
    • 测量类型
    • 使用复合消息的示例
      • 手臂关节速度
    • 基本轨迹命令
    • 手臂关节和末端执行器命令
    • CompositeMetric 和 CompositeAtlas
      • 组件
      • 使用 CompositeMetric 计算距离
      • 在 Python 脚本中创建 Cask
      • 将 FollowPath 与 CompositeAtlas 结合使用
    • JSON 序列化
      • 图式

机器人硬件包括许多不同的部件,可以通过各种方式启动。 示例包括微分基础、完整基础或由关节位置或关节速度控制的多关节臂。 在 Isaac SDK 中,各种节点(如全局路径点规划器、局部轨迹规划器、控制器和驱动器)需要交换消息以传达机器人硬件的状态和命令。 此外,不仅需要单个状态,有时还需要状态的时间序列、时间序列的批次或携带有关多个实例的信息的状态。

为了解决这种消息传递需求的多样性,Isaac SDK 提供了复合消息:一种可以解决上述所有用例的单一消息类型。

测量类型

复合消息可以包括以下测量类型:

类型

描述 | 格式

None

数量的度量不包括在标量,矢量 测量类型列表,因此不是指定的矩阵,张量 。

Time

事件的时间,特别用于 为时间序列存储时间戳

标量

Mass

实体的权重

千克[kg]

Position

表示位置的欧几里得向量 空间中相对于参考的物体 frame:比如手机的位置 房间里的机器人。 该测量用于 存储状态的一般意义 n维系统,例如关节 多关节机器人手臂的“位置”。

n维向量 米 [m] 或无单位 [1]

Speed

物体位置的变化率 相对于随时间变化的参考系。 这个 测量也用于一般意义上 存储一个状态的变化率 n维系统。

n维向量 米/秒 [m/s] 或无单位/秒 [1/s]

Acceleration

速度的变化率。

n 维向量或标量 米/秒/秒 [m/s^2] 或无单位/秒/秒 [1/s^2]

Rotation

实体在 2D 或 3D 空间中的旋转 相对于锚点。 轮换最好 表示为单位复数 (cos(a), sin(a)) 或单位四元数。 避免使用角度 (对于 2D)或欧拉角(对于 3D)。

二维:归一化复数为 2 个标量 三维:归一化四元数为 4 个标量

AngularSpeed

旋转随时间的变化率。

2D:标量; [rad/s] 或 [1/s] 3D:3维向量; [rad/s] 或 [1/s]

AngularAcceleration

角速度随时间的变化率

2D:标量; [rad/s^2] 或 [1/s^2] 3D:3维向量; [rad/s^2] 或 [1/s^2]

使用复合消息的示例

手臂关节速度

以下复合消息描述了机械臂的关节速度:

proto: {
  "schema": [
    {"entity": "base_2", "element_type": Float64, "measure": Speed},
    {"entity": "foo", "element_type": Float64, "measure": Position},
    {"entity": "elbow", "element_type": Float64, "measure": Speed},
    {"entity": "base_1", "element_type": Float64, "measure": Speed},
    {"entity": "wrist", "element_type": Float64, "measure": Speed}
  ],
  "schema_hash": "...",
  "values": {
    "element_type": Float64,
    "sizes": [4],
    "dataBufferIndex": 0
  }
}
buffers: [[0.3, 0.7, -0.4, 0.2, 0.1]]

该组件读取消息:


class MyArm4Controller {
 public:
  void start() {
    speed_parser_.requestSchema({{"base_1", "base_2", "elbow", "wrist"},
    CompositeParser::Speed});
  }
  void tick() {
    Vector4f speeds;
    if (!speed_parser_.parse(rx_command().getProto(), rx_command().buffers(), speeds)) {
      reportFailure("Could not parse message: %s", speed_parser_.error_str());
      return;
    }
  }
  ISAAC_RX(CompositeProto, command);
 private:
  CompositeParser speed_parser_;
};

输出向量是 [0.2, 0.3, -0.4, 0.1]

基本轨迹命令

以下复合消息包含一个基本的轨迹命令:

proto: {
  "schema": [,
    {"entity": "time", "element_type": Float64, "measure": Time},
    {"entity": "base", "element_type": Float64, "measure": Position},
    {"entity": "base", "element_type": Float64, "measure": LinearSpeed},
    {"entity": "base", "element_type": Float64, "measure": AngularSpeed}
  ],
  "schema_hash": "...",
  "values": {
    "element_type": Float64,
    "sizes": [5, 4],
    "dataBufferIndex": 0
  }
}
buffers: [[0.30, 17.4, 0.70, -0.40], [0.35, 17.8, 0.64, -0.38], [0.40, 18.2, 0.61, -0.36], [0.44, 18.5, 0.56, -0.34], [0.47, 18.7, 0.59, -0.31]]

该组件处理命令:

class MyTrajectoryReceiver {
 public:
  void start() {
    speed_parser_.requestSchema({{"base", LinearSpeed}, {"base", AngularSpeed}});
  }
  void tick() {
    Timeseries<Vector2f, float> series;
    if (!speed_parser_.parse(rx_command().getProto(), rx_command().buffers(), "time", series)) {
      reportFailure("Could not parse message: %s", speed_parser_.error_str());
      return;
    }
  }
  ISAAC_RX(CompositeProto, command);
 private:
  CompositeParser speed_parser_;
};

输出时间序列为:(0.30, [0.70, -0.40]), (0.35, [0.64, -0.38]), (0.40, [0.61, -0.36]) , (0.44, [0.56, -0.34]), (0.47, [0.59, -0.31])

手臂关节和末端执行器命令

以下复合消息包含用于手臂关节和末端执行器的命令。 在这种情况下,末端执行器状态是二进制的,因此度量为 None:

proto: {
  "schema": [
    {"entity": "elbow", "element_type": Float64, "measure": Speed},
    {"entity": "base", "element_type": Float64, "measure": Speed},
    {"entity": "wrist", "element_type": Float64, "measure": Speed},
    {"entity": "gripper", "element_type": Float64, "measure": None}
  ],
  "schema_hash": "...",
  "values": {
    "element_type": Float64,
    "sizes": [5],
    "dataBufferIndex": 0
  }
}
buffers: [[0.3, 0.4, -0.2, 1]]

该组件处理命令:

class MyArmAndGripperController {
 public:
  void start() {
    arm_parser_.requestSchema({"base", "elbow", "wrist"}, CompositeParser::Speed);
    gripper_parser_.requestSchema({"gripper"}, CompositeParser::Position);
  }
  void tick() {
    Vector3d arm_joint_speeds;
    if (!arm_parser_.parse(rx_command().getProto(), rx_command().buffers(), arm_joint_speeds)) {
      reportFailure("Could not parse message: %s", parser_.error_str());
      return;
    }
    Vector1f gripper_position;
    if (!gripper_parser_.parse(rx_command().getProto(), rx_command().buffers(), gripper_position)) {
      reportFailure("Could not parse message: %s", parser_.error_str());
      return;
    }
  }
  ISAAC_RX(CompositeProto, command);
 private:
  CompositeParser arm_parser_;
  CompositeParser gripper_parser_;
};

输出是:arm_joint_speeds [0.4, 0.3, -0.2], gripper_position [1]

CompositeMetric 和 CompositeAtlas

CompositeProto 也可以用于表示配置空间中的路点,使用 cask 作为 atlas(一组命名的复合路点)的存储,使用 uuid 作为路点名称标识。 必须定义距离度量来比较 CompositeProto 与航路点的“接近度”。

组件

isaac.composite.CompositeMetric 组件定义了如何计算两个复合原型之间的距离。 它包含一个表示用于距离计算的数量的模式、用于每个数量的 p 范数及其在总距离中的权重。 用例包括移动通过一组关节角度航路点或打开或关闭吸力末端执行器。

isaac.composite.CompositeAtlas 组件提供对存储在 cask 中的航路点的访问。 这是支持从多个组件访问的线程安全方式。

isaac.composite.CompositePublisher 组件从 atlas 中读取路径点列表,并将整个路径发布为 CompositeProto。 航路点都具有相同的模式,并在 CompositeProto 中表示为批次。

isaac.composite.FollowPath 组件从 CompositePublisher 接收路径并一次发布一个路标。 它接收当前状态并计算到当前航路点的距离。 一旦距离在公差范围内,就会发布下一个航路点。 CompositeMetric 组件必须附加到同一节点以指定如何计算距离。

使用 CompositeMetric 计算距离

下面的代码片段计算了命令和状态通道上两个输入原型消息之间的距离。 请注意,如果小码使用 CompositeMetric 组件,则应将其放置在与该组件相同的节点中。

// get metric component
metric_ = node()->getComponent<CompositeMetric>();
// try to set schema for metric from command message
metric_->setOrLoadSchema(ReadSchema(tx_command().getProto()));
// get the schema used the CompositeMetric
const auto schema = metric_->getSchema();
// parse the two states to compare. error handle is omitted
if (schema) {
  parser.requestSchema(*schema)
  VectorXd x1(schema->getElementCount()),  x2(schema->getElementCount());
  if (parser.parse(tx_command().getProto(), tx_command().buffers(), x1) &&
      parser.parse(tx_state().getProto(), tx_state().buffers(), x2)) {
    double distance = *metric_->distance(x1, x2);
  }
}

在 Python 脚本中创建 Cask

下面的 Python 代码片段展示了如何创建一个带有复合路径点的Cask:

from engine.pyalice import Cask
from engine.pyalice.Composite import create_composite_message

cask = Cask(cask_root, writable=True)
msg = create_composite_message(quantities, values)
msg.uuid = name
cask.write_message(msg)

将 FollowPath 与 CompositeAtlas 结合使用

下面的 JSON 片段显示了如何创建跟随路径应用程序:

"graph": {
  "nodes": [
    {
      "name": "atlas",
      "components": [
       {
         "name": "CompositeAtlas",
         "type": "isaac:::composite::CompositeAtlas"
       }
     ]
    },
    {
      "name": "follow_path",
      "components": [
        {
          "name": "ledger",
          "type": "isaac::alice::MessageLedger"
        },
        {
          "name": "CompositeMetric",
          "type": "isaac:::composite::CompositeMetric"
        },
        {
          "name": "CompositePublisher",
          "type": "isaac::composite::CompositePublisher"
        },
        {
          "name": "FollowPath",
          "type": "isaac::composite::FollowPath"
        }
      ]
    }
  ],
  "edges": [
   {
     "source": "follow_path/CompositePublisher/path",
     "target": "follow_path/FollowPath/path"
   }
  ]
},
"config": {
  "follow_path": {
    "CompositePublisher": {
      "tick_period": "10Hz",
      "atlas": "atlas/CompositeAtlas",
      "path": ["cart_observe", "cart_align", "cart_dropoff"]
    },
    "CompositePublisher": {
      "tick_period": "10Hz",
      "wait_time": 1.0,
      "tolerance": 0.05
    }
  }
}

JSON 序列化

Measure、Quantity 和 Schema 的 JSON 序列化需要通过 ISAAC_PARAM 为 codelet 配置复合模式。

Measure:使用 CompositeProto::Measure 枚举的 capnp JSON 字符串序列化。 由于名称空间限制,无法使用 NLOHMANN_JSON_SERIALIZE_ENUM。

// in codelet
ISAAC_PARAM(std::string, measure)
// in app.json configs
"measure": "angularSpeed"

Quantity:由实体(字符串)、度量(字符串)和可选维度(整数数组)的 JSON 数组组成。

// in codelet
ISAAC_PARAM(composite::Quantity, quantity)
// in app.json configs
"quantity": ["tool", "position", [3]]
// or
"quantity": ["elbow", "position"] // dimension default to [1]

图式

选项 1:数量清单

// in codelet
ISAAC_PARAM(composite::Schema, schema)
// in app.json configs
"schema": [["tool", "position", [3]], ["tool", "rotation", [4]], ["elbow", "speed"]]

选项 2:一组实体(字符串)和一个度量; 尺寸默认为 [1]

// in codelet
ISAAC_PARAM(composite::Schema, schema)
// in app.json configs
"schema": {
  "entity": ["shoulder", "elbow", "wrist"],
  "measure": "speed"
}

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

在这里插入图片描述

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

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

相关文章

使用bookdown构建新年日记本

简介 一年多前在 B 站发布了一个视频&#xff0c;预览了一下基于 bookdown 构建的日记本。本打算之后更个文字版本教程。结果一直忘了&#xff0c;最近通过一位读者的了解&#xff0c;打算把这个坑补上。 本文内容将展示如何使用 bookdown 模板并修改成自己的日记本。此外&…

某阿里员工提问:年终绩效自己给自己打3.25,会有什么后果?网友回答:必死无疑,不要犯傻!...

年底评绩效&#xff0c;大多数人都会给自己打高绩效&#xff0c;但有些人却反其道而行之。最近&#xff0c;一位阿里员工提出了这样的问题&#xff1a;自评绩效时给自己打3.25&#xff0c;会有什么后果&#xff1f;希望领导能不按常理出牌&#xff0c;给自己3.75。有人问&#…

HashMap1.7中的线程安全问题

文章目录前言正文前言 下面聊聊JDK1.7HashMap的死循环问题&#xff0c;在这之前首先要知道JDK1.7的HashMap底层是数组 链表的形式的 正文 下面给出JDK1.7的扩容代码 //扩容代码 void resize(int newCapacity) {//旧的数组Entry[] oldTable table;//旧的数组长度int oldCap…

SpringBoot+Vue--引入Element-UI创建首页-笔记2

关于Vue项目目录结构介绍 https://tiantian.blog.csdn.net/article/details/128666429?spm1001.2014.3001.5502 先安装引入Element-UI Element - The worlds most popular Vue UI framework i是install的缩写 安装完成后,可以看到package.json里已经引入 在main.js里引入…

linux系统的结构

Linux系统一般有4个主要部分&#xff1a;内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构&#xff0c;它们使得用户可以运行程序、管理文件并使用系统。内核内核是操作系统的核心&#xff0c;具有很多最基本功能&#xff0c;它负责管理系…

Java基础之《netty(31)—用netty实现RPC》

一、需求说明 1、dubbo底层使用了netty作为网络通讯框架&#xff0c;要求使用netty实现一个简单的RPC框架。 2、模仿dubbo&#xff0c;消费者和提供者约定接口和协议&#xff0c;消费者远程调用提供者的服务&#xff0c;提供者返回一个字符串&#xff0c;消费者打印提供者返回…

S32G274A spi发送数组值不变问题

官方例程的spi问题 spi发送函数 下面是S32G两个spi从机发送函数 /** * brief SPI/DSPI异步传输。 * 这个函数使用提供的总线参数初始化异步传输 , 通过外部设备。 * param[in] ExternalDevice -指向传输数据的外部设备的指针 * param[in] TxBuffer -发送缓冲区的指针。 * pa…

3.1动态规划--矩阵连乘问题

写在前面&#xff1a;矩阵连乘的要点 1、最优解数组的含义--A[1:n]的最少数乘次数 2、数组的填写方向--斜着填 3、递推方程含义 今天开始动态规划的学习&#xff0c;动态规划与分治法类似&#xff0c;基本思想就是将待求解的问题分成若干子问题&#xff0c;先求解子问题&am…

Java 23种设计模式(2.创建者模式-工厂设计模式)

代码分析 通过代码的不同实现方式&#xff0c;了解工厂模式 代码分析之后有具体的讲解 1.业务和逻辑分开实现 public class Operation {public static double GetResult(double numberA,double numberB,String operate){double result 0;switch (operate){case "":r…

SpringBoot+Vue项目月度员工绩效考核管理系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏…

Kubernetes:通过 kubectl 插件 kubectl-tree 查看API对象层级关系

写在前面 分享一个小工具 kubectl-tree&#xff0c;用于查看 k8s API 对象层级关系比如对于有状态应用来讲&#xff0c;可以看到Deployment --> ReplicaSet --> Pod 的构成关系博文内容涉及&#xff1a;tree 插件的安装以及使用。理解不足小伙伴帮忙指正 岂其食鱼&#x…

Java---微服务---Nacos安装

Nacos安装1.Windows安装1.1.下载安装包1.2.解压1.3.端口配置1.4.启动1.5.访问2.Linux安装2.1.安装JDK2.2.上传Nacos安装包2.3.解压2.4.端口配置2.5.启动2.6.访问3.Nacos的依赖1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供…

Java/JavaScript有哪些图形图像处理的框架?

文章目录一个小问题引发的学习热潮其它几个图形库Eclipse GEF框架Java图像库JS 的图形框架图形处理库图像编辑物理引擎流程图/组织图/图编辑等全景图/AR/VR3D库Javascript游戏编程库尾声一个小问题引发的学习热潮 一直对Java图形图像编程念兹在兹&#xff0c;书架上有几本相关…

2、IDEA的卸载与安装

文章目录2、IDEA的卸载与安装2.1 卸载过程2.2 安装前的准备2.3 安装过程2.4注册过程方式一&#xff1a;免费试用30天方式二&#xff1a;官网购买方式三&#xff1a;教育使用2.5 闪退问题【尚硅谷】idea实战教程-讲师&#xff1a;宋红康 生活是属于每个人自己的感受&#xff0c;…

3.1 卷积神经网络的应用领域|卷积的作用|卷积特征值的计算方法|得到特征图表示|步长与卷积核大小对结果的影响|边缘填充方法

文章目录卷积神经网络的应用领域卷积的作用卷积特征值的计算方法得到特征图表示步长与卷积核大小对结果的影响边缘填充方法卷积神经网络的应用领域 检测任务分类与检索超分辨率重构医学任务无人驾驶NVIDIA Tegra X1&#xff08;显卡 GPU&#xff09; 卷积的作用 卷积神经网络…

产品设计-基础控件-信息输出控件

产品设计-基础控件-信息输出控件1.1 走马灯1.1.1 图片轮播样式1.1.2 文字轮播样式1.2 折叠面板1.3 时间轴与步骤条1.3.1 时间轴1.3.2 步骤条1.4标签和徽标1.4.1 标签和徽标1.4.2 徽标1.5 面包屑与查询器1.5.1 面包屑1.5.2 查询器1.6 列表页与详情页1.6.1 列表页1.6.2 详情页1.7…

【实操案例十】函数操作 实例代码及运行效果图!

任务一&#xff1a;Mini计算器 # 任务一&#xff1a;Mini计算器 def calc(a, b, op):if op :return add(a, b)elif op -:return sub(a, b)elif op *:return mul(a, b)elif op /:if b ! 0:return div(a, b)else:return 0不能为除数&#xff01;def add(a, b):return a bde…

这种银行病毒是2022年12月的头号恶意软件

到 2022 年&#xff0c;全球网络攻击同比增长 38%&#xff0c;并且是由更小、更灵活的黑客和勒索软件团伙驱动的。 根据一份报告&#xff0c;全球网络攻击数量在第四季度达到历史新高&#xff0c;平均每个组织每周发生 1,168 次攻击。 现在&#xff0c;一份新报告列出了上个月…

【iMessage苹果推】iOS 当地推送(Local Push) 安装OS CSR文件尽可能多地使每个证书区分开

推荐内容IMESSGAE相关 作者✈️IMEAX推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAX推荐内容3.日历推 *** …

长短期记忆(LSTM)详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ ​​​​​​https://github.com/tt-s-t/Deep-Learning.git 目录 一…