19.Isaac教程--C语言接口(Isaac C API)

news2025/2/24 18:54:28

Isaac C API

在这里插入图片描述

ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html

文章目录

  • Isaac C API
    • 程序流程和消息格式
    • ROS
    • 示例
    • 独立示例
    • 启动和停止应用程序
    • 向 Isaac 应用程序发布消息
    • 从 Isaac 应用程序接收消息
    • 语言环境设置
    • 示例消息
    • ImageProto
    • RangeScanProto
    • StateProto (messages::DifferentialBaseDynamics)
    • StateProto (messages::DifferentialBaseControl)
    • 缓冲区布局
    • 图像缓冲器
    • 张量缓冲器

Isaac C API 允许您使用 Isaac SDK 功能,而无需将您的软件堆栈与 ISAAC SDK 完全集成。 通过使用 C API,您不必为代码库使用 Bazel,也不必编写 Isaac codelet。 它还使您能够使用 C++ 以外的编程语言与 Isaac 应用程序进行通信。

  • 示例 1:您想将 Isaac 导航堆栈与 Carter 一起使用,但想从您自己的软件堆栈发送目标命令。 您可以通过 C API 向 Carter 应用程序发送 GoTo 命令来实现此目的。 这只需要对现有的 Carter 应用程序进行少量修改。

  • 示例 2:您想使用 Isaac 3D 物体姿态估计来检测物体的姿态。 但是,您有自己的代码来获取图像,并且希望在 Isaac 应用程序之外使用估计的姿势。 您可以通过基于 3D 对象姿态估计子图创建一个小型 Isaac 应用程序来实现此目的:您将通过 C API 发送相机图像并通过 C API 接收估计的姿态。

  • 示例 3:您想使用自定义模拟环境来评估 Isaac 应用程序。 您可以通过 C API 将传感器信息从模拟器发送到 Isaac 应用程序,并通过 C API 从应用程序接收命令。

程序流程和消息格式

使用 Isaac C API,您可以向 Isaac 应用程序发送消息并从中接收消息。 C API 负责启动和停止 Isaac 应用程序:您不能在没有 Isaac 应用程序的情况下使用 C API。 Isaac 应用程序是从 Isaac 使用的通用应用程序、图形和配置 JSON 文件加载的。 有关示例,请参阅示例部分。

通过 C API 发送的消息使用“JSON & buffers”格式。 在这种格式中,大部分高级消息数据存储在 JSON 对象中,而大数据块(例如图像和张量)存储在字节缓冲区中。 消息的 JSON 格式直接基于 Isaac 使用的相应 Cap’n Proto 消息。 您可以在本文档的消息 API 部分中查看消息列表。 缓冲区布局和示例消息部分提供了有关图像和张量的 JSON 格式和缓冲区布局的更多详细信息。

C API 的每个实例都与单个 Isaac 应用程序接口。 如果您想使用同一个 C 程序访问多个独立的 Isaac 功能,您应该将所有必需的节点添加到单个 Isaac 应用程序中。 这确保您只有一个调度程序在运行。 虽然可以从不同的进程启动多个 Isaac 应用程序,但您最终会得到多个独立的调度程序,这可能不是最佳的或者需要调整调度程序参数。

ROS

如果您想与现有的 ROS 应用程序通信,则不必使用 C API。 Isaac 可以通过 Isaac ROS 网桥直接与 ROS 通信。

示例

Isaac SDK 包含两个示例应用程序,用于说明如何使用 C API:

  • //apps/tutorials/c_api/viewer.c

  • //apps/tutorials/c_api/depth.c

使用以下命令运行示例:

bazel run //apps/tutorials/c_api:c_api_viewer
bazel run //apps/tutorials/c_api:c_api_depth

viewer.c 示例使用 C 代码创建图像并将其发送到位于 //apps/tutorials/c_api/viewer.app.json 中的 Isaac 应用程序。 Isaac 应用程序使用带有 ImageViewer codelet 的单个节点来可视化通过 C 发送的图像。

depth.c 示例在 //apps/tutorials/c_api/depth.app.json 中运行 Isaac 应用程序,它有一个节点运行 CameraGenerator codelet,创建一个虚拟深度图像。 C 代码接收这些消息并在控制台上打印中心像素的深度。

为了方便起见,这些示例使用 Bazel 来编译 C 源代码文件。 接下来我们将向您展示一个完全独立的示例,您的自定义代码不需要 Bazel。

独立示例

使用以下命令构建 C API 并将其部署到本地计算机上的文件夹(从 sdk/ 子目录):

./../engine/engine/build/deploy.sh -p //packages/engine_c_api:isaac_engine_c_api-pkg -d x86_64 -h localhost --deploy_path ~

链接代码时,必须为 C API 和“sight”模块提供共享库的路径,它们位于:

  • <deploy_path>/engine/alice/c_api/libisaac_c_api.so

  • <deploy_path>/packages/sight/libsight_module.so

以下是使用 GCC 编译的命令行示例:

gcc c_api_example.c \
   -L./engine/alice/c_api -lisaac_c_api \
   -L./packages/sight -lsight_module \
   -o c_api_example

export LD_LIBRARY_PATH=./engine/alice/c_api:./packages/sight:$LD_LIBRARY_PATH

./c_api_example

此示例显示了一个简单的ping-pong操作,您可以在其中通过 C API 将消息发送到最小的 Isaac 应用程序,并通过 C API 接收这些相同的消息。

启动和停止应用程序

每个使用 C API 的 Isaac 应用程序都需要一个 JSON 应用程序文件; 例如,上面的示例具有相应的 viewer.app.jsondepth.app.json 文件。 使用 JSON 应用程序文件的应用程序图来定义您希望使用 C API 与之通信的节点。

要启动 Isaac 应用程序,请按如下方式加载 JSON 文件:

isaac_handle_t app;
isaac_create_application("", "path/to/config.app.json", 0, 0, 0, 0, &app);
isaac_start_application(app);

要关闭应用程序,请使用以下命令:

isaac_stop_application(app);
isaac_destroy_application(&app);

向 Isaac 应用程序发布消息

Isaac 在内部使用 Cap’n Proto 消息; 但是,由于这种消息格式并未得到普遍支持,因此 C API 将消息有效负载公开为 JSON。 如果接收消息的节点需要 Cap’n Proto 消息,则需要启用消息转换为 Cap’n Proto 格式。

按照以下步骤向 Isaac 发布消息:

  1. 按如下方式创建新消息:

    isaac_uuid_t uuid;
    isaac_create_message(app, &uuid);
    isaac_write_message_json(app, &uuid, &json);
    
  2. 设置消息的原型 ID 并启用 JSON 到原型的转换,如下所示:

    isaac_set_message_proto_id(app, &uuid, proto_id);
    isaac_set_message_auto_convert(app, &uuid, isaac_message_type_proto);
    

    isaac_set_message_proto_id() 调用需要消息的原型 ID。 要确定消息的原型 ID,请将消息类型添加到 //apps/tutorials/c_api:typeid 应用程序,然后通过 bazel run //apps/tutorials/c_api:typeid 运行该应用程序。 原型 ID 将显示在终端上。

  3. 使用 isaac_publish_message() 调用将消息发布到 Isaac 应用程序节点。 该消息将作为 Cap’n Proto 消息转发到节点。

    isaac_publish_message(app, "node_name", "component_name", "key", &uuid);
    

    有关消息发布的示例,请参见 //apps/tutorials/c_api/viewer.c。

从 Isaac 应用程序接收消息

要从 JSON 应用程序文件中定义的任何节点接收最新消息,请使用以下调用:

isaac_receive_latest_new_message(app, "node_name", "component_name", "key", &uuid);

isaac_receive_latest_new_message() 调用返回“成功”代码 (isaac_error_success) 或“no message available”代码 (isaac_error_no_message_available)。

获取消息内容如下:

isaac_const_json_t json = isaac_create_null_const_json();
isaac_get_message_json(app, &uuid, &json);

如果消息源使用 Cap’n Proto 发布消息,消息会自动转换为 JSON。

处理完消息后,立即使用 isaac_release_message() 调用,它允许 Isaac 回收用于消息的任何资源:

isaac_release_message(app, &uuid);

如果要保留任何消息数据,请在发布消息之前复制它。

有关接收消息的示例,请参见 //apps/tutorials/c_api/depth.c

语言环境设置

Isaac 应用程序的区域设置自动设置为 en_US.UTF-8,以防止在将 JSON 消息与原型消息相互转换时出现十进制转换错误。 因此,为与 Isaac 节点通信而生成的 JSON 文件必须与 en_US.UTF-8 语言环境兼容。

示例消息

执行以下命令在 /tmp 文件夹中生成示例 JSON 文件:

bazel run apps/samples/proto_to_json

这些 JSON 文件(详见下文)对应于 Isaac 中使用的通用原型。

ImageProto

运行上面的命令后,在生成的文件/tmp/color_camera_proto.json中可以找到需要的JSON格式。 为方便起见,将 JSON 粘贴在此处:

{
  "channels": 3,
  "cols": 1920,
  "dataBufferIndex": 0,
  "elementType": "uint8",
  "rows": 1080
}

这条 Cap’n Proto 消息的名称是 ImageProto,原型 ID 是 16240193334533147313。

有关二维缓冲区布局的说明,请参阅图像缓冲区部分。

RangeScanProto

  • 文件名:range_scan_proto.json

  • 原型描述:RangeScanProto

  • 原型编号:11901202900662173387

有关缓冲区布局的说明,请参阅下面的张量缓冲区部分。 在这种情况下,有一个缓冲区用于范围,另一个缓冲区用于强度。 在示例 JSON 中,缓冲区大小为 16x8,因为垂直光束角 (theta) 列表有 16 个成员,而有八个水平射线切片(与 phi 角相关联)。

StateProto (messages::DifferentialBaseDynamics)

  • 文件名:/tmp/differential_base_state_proto.json

  • 原型描述:StateProto

  • 原型编号:13177870757040999364

有关缓冲区布局的说明,请参阅下面的张量缓冲区部分。 在这种情况下,缓冲区是一个 1x1x4 张量,其中包含以下值:

  1. 线速度

  2. 角速度

  3. 直线加速度

  4. 角加速度

StateProto (messages::DifferentialBaseControl)

  • 文件名:differential_base_control_proto.json

  • 原型描述:StateProto

  • 原型编号:13177870757040999364

有关缓冲区布局的说明,请参阅下面的张量缓冲区部分。 在这种情况下,缓冲区是一个 1x1x2 张量,其中包含以下值:

  1. 线速度

  2. 角速度

缓冲区布局

带有缓冲区的消息原型必须存储包含数据的缓冲区的索引。 例如,ImageProto 中的“dataBufferIndex”是包含图像数据的缓冲区的索引。

图像缓冲器

下面是 720p RGB 图像缓冲区的图示。 每个(行、列)位置都包含有关像素的信息。 Isaac 图像缓冲区按行优先顺序排列。

张量缓冲器

在一维张量中,元素按顺序堆叠:

二维张量类似于上面描述的图像缓冲区:每个 RGB 值都可以表示为一个元组元素。 如果图像是灰度图像,则每个元素都将是一个数字。 二维张量缓冲区的第一个元素索引为 (0,0),第二个元素索引为 (0,1),依此类推。

类似地,三维张量具有以下顺序:

(0, 0, 0), (0, 0, 1), (0, 0, 2), …. (0, 1, 0) …… (1, 0, 0) … (max_0, max_1, max_2),

其中 max_i 是维度“i”中的最大索引。

3D 张量可以表示 RGB 图像,每个(行、列、通道)索引指向 0 到 255 之间的值。

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

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

相关文章

C语言 八皇后(包含错误代码及分析)

基本思路&#xff1a;用递归思想解决&#xff0c;在8*8的棋盘放置8个皇后&#xff0c;则放置成功会每行有且仅有一个皇后&#xff08;因为皇后不能同行&#xff09;&#xff0c;所以可以循环行&#xff0c;尝试在某列放置&#xff0c;和 全排列 http://t.csdn.cn/kvIXC 的解决方…

vulnhub DC系列 DC-4

总结&#xff1a;爆破&#xff0c;teehee提权 目录 下载地址 漏洞分析 信息收集 密码爆破 命令执行 ​编辑 ssh爆破 提权 下载地址 DC-4.zip (Size: 617 MB)Download: http://www.five86.com/downloads/DC-4.zipDownload (Mirror): https://download.vulnhub.com/dc/D…

远程连接mysql报错:1130 - Host XXX is not allowed to connect to this MySQL server

问题描述 1130 - Host 123.120.193.96 is not allowed to connect to this MySQL server 译&#xff1a;不允许主机 123.120.193.96 连接到此 MySQL 服务器 远程连接的时候出现如下错误&#xff1a; 问题分析 根据描述提示&#xff0c;在用Navicat配置远程连接Mysql数据库时遇…

【Node.js】写一个数据自动整理成表格的脚本

前言 企业项目进行数据埋点后&#xff0c;埋点事件名需要整理成Excel表格便于统计&#xff0c;目标是将下图左侧数据转化成下图右侧的Excel表格&#xff1a; 考虑到左侧埋点数据是随项目迭代增加的&#xff0c;埋点数据每增加一次我就要把数据一条一条的CtrlC/V复制粘贴至Ex…

春节要放假了,外贸人你准备好了吗?

一转眼&#xff0c;老外们的假期即将结束&#xff0c;而我们的春节假期即将开启。有人会想&#xff1a;工作一年了&#xff0c;好不容易春节放个假&#xff0c;我是不是应该好好休息了&#xff1f;对别人是&#xff01;但是对于我们外贸人&#xff0c;并不是&#xff01;很多外…

第十三届蓝桥杯C++B组省赛 J 题——砍竹子(AC)

1.砍竹子 1.题目描述 这天&#xff0c;小明在砍竹子&#xff0c;他面前有 nnn 棵竹子排成一排&#xff0c;一开始第 iii棵竹子的高度为 hihihi。 他觉得一棵一棵砍太慢了&#xff0c;决定使用魔法来砍竹子。 魔法可以对连续的一段相同高度的竹子使用&#xff0c;假设这一段…

数学基本算法

欧几里得算法 求两个数的最大公约数&#xff1a; /**** param a 整数* param b 整数* return 两个整数的最大公约数*/public static int gcd(int a,int b){return b0?a:gcd(b,a%b);} 扩展欧几里得 /*** * param a * param b (a,b)两个整数* param x * param y (x,y)…

LeNet5模型与全连接模型的差异

1 问题深度学习训练过程中&#xff0c;有很多的训练模型&#xff0c;我们组就在思考LeNet模型与之前运用的全连接模型在训练精度损失与验证精度损失上有什么差别&#xff1f;2 方法这是LeNet模型的主要代码&#xff0c;对数据进行两成卷积与两次池化之后再建立三成全连接即可。…

Oracle数据库的监控指标

一、Oracle 监控指标 Oracle数据库常见性能指标主要有:当前登录数、非阻塞锁数、当前死锁数、阻塞锁数、当前锁数、会话数等内容,如下图所示。 注意:以下是 Oracle 监控所需要的指标,具体根据需要监控哪些、超阈值而定。 1.1 新建主机群组 1.2 新建模板 1.3 创建主机 …

Qt 6.4.2在Windows上安装过程及简单验证

Qt是一个跨平台的C开发库&#xff0c;用来开发图形用户界面(Graphical User Interface, GUI)。它支持Windows、Linux、macOS、Android、iOS、QNX等平台&#xff0c;一个框架、一套代码库、任意平台部署。Qt有开源和商业两种许可。 Qt从5.15开始官方不再直接提供开源的exe…

H5——连连看小游戏实现思路及源码

部门要求推广新产品用连连看小游戏的方式&#xff0c; 设计那边UI还没有排期&#xff0c;先撸个功能demo&#xff0c;正好记录一下&#xff1b; 连连看都玩过&#xff0c;程序的关键在于判断连续点击的两张图片是否能够消除&#xff0c;两个图片消除的条件有两个&#xff1a; …

【3 - 特征工程】菜菜sklearn机器学习

课程地址&#xff1a;《菜菜的机器学习sklearn课堂》_哔哩哔哩_bilibili 第一期&#xff1a;sklearn入门 & 决策树在sklearn中的实现第二期&#xff1a;随机森林在sklearn中的实现第三期&#xff1a;sklearn中的数据预处理和特征工程第四期&#xff1a;sklearn中的降维算法…

Blog Navigation

Blog Navigation Linux Kernel 0x01_LinuxKernel_内核的启动&#xff08;一&#xff09;之启动前准备[2022-7-5]0x02_LinuxKernel_内核的启动&#xff08;二&#xff09;SMP多核处理器启动过程分析 [TODO]0x21_LinuxKernel_内核活动&#xff08;一&#xff09;之系统调用 [20…

【OpenGL学习】OpenGL窗口创建

OpenGL窗口创建 本节介绍如何在利用配置好的GLFW和GLAD进行一个简单窗口的绘制&#xff0c;首先明白在OpenGL中进行图形绘制到窗口的整个流程&#xff1a; 初始化GLFW创建窗口window创建OpenGL上下文初始化Glad渲染循环结束绘制 初始化GLFW 然后我们从上面的流程逐步进行窗…

知微传感3D相机SDK开发文档一查找相机

知微传感3D相机SDK开发文档一查找相机 主要对知微传感3D相机的SDK文件做一个介绍&#xff0c;大家一个界面显示程序包含图像的获得&#xff0c;相机的查找和链接 查找相机&#xff0c;通过UDP广播形式查找局域网相机链接相机&#xff0c;通过IP地址链接局域网内的相机获取图片&…

如何提升计算机的运行速度-正确清理C盘的方法

本文是向大家介绍清理C盘的方法&#xff0c;它能够实现给系统盘瘦身&#xff0c;能够带来提升计算机运行速度价值。提升计算机的运行速度-清理C盘的方法1 利用Windows附带的磁盘清理工具鼠标右击【C盘】选择【属性】选择【磁盘清理】勾选需要清理的文件&#xff0c;点击【确定】…

2023 hgame --- week1 wp

文章目录Miscsign ine99p1ant_want_girlfriend神秘的海报Where am IWebClassic Childhood GameBecome A MemberGuess Who I AmShow Me Your BeautyCryptoRSABe Stream神秘的电话兔兔的车票Retest_your_IDAeasyasmencodeeasyenca_cup_of_teaPwntest_nciotHelp the uncle who can…

【阶段三】Python机器学习29篇:机器学习项目实战:DBSCAN算法的基本原理与DBCSAN新闻聚类分群模型

本篇的思维导图: DBSCAN模型 DBSCAN(全称为Density-Based Spatial Clustering of Applications with Noise)是一种以密度为基础的空间聚类算法,可以用密度的概念剔除不属于任一类别的噪声点。该算法将簇定义为密度相连的点的最大集合,将具有足够密度的区域划分为…

rabbitmq命令大全

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录服务管理启动服务后台启动查看状态用户管理新增账号删除用户所有用户:修改密码:清除密码角色管理设…

MinIO安装总结

概述 初学者安装MinIO还是会遇到很多坑的&#xff0c;这里做个总结&#xff0c;希望能够大家可以快速的搭建MinIO环境&#xff0c;可以更好的快速入门。 linux下手动安装(不推荐) cd /opt/testMinIO wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x…