美文网首页
艾萨克C API

艾萨克C API

作者: YottaYuan | 来源:发表于2020-03-18 03:48 被阅读0次

    艾萨克C API

    Isaac C API允许您使用Isaac SDK功能,而无需将Isaac SDK完全集成到软件堆栈中。它还使您能够使用C ++以外的语言构建Isaac应用程序。

    C API支持使用“JSON & buffers”格式向Isaac发送消息和从Isaac发送消息。以这种格式,大多数高级消息数据存储在JSON对象中,而大型数据块(例如图像和张量)存储在字节缓冲区(byte buffers)中。

    示例

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

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

    这些示例使用虚拟图像并通过C API发布/接收消息。运行时 viewer.c,您可以在Sight中查看图像。

    使用以下命令来运行示例:

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

    启动和停止应用程序

    每个使用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);
    

    发布消息给以撒

    以撒内部使用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);
    
    1. 设置消息的原始ID,并启用JSON到原始转换,如下所示:
    isaac_set_message_proto_id(app, &uuid, proto_id);
    isaac_set_message_auto_convert(app, &uuid, isaac_message_type_proto);
    
    1. 使用该isaac_publish_message()呼叫将消息发布到Isaac应用程序节点。该消息将作为Cap'n Proto消息转发到该节点。
    isaac_publish_message(app, "node_name", "component_name", "key", &uuid);
    

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

    接收以撒的消息

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

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

    isaac_receive_latest_new_message()呼叫传回“成功”的代码(isaac_error_success)或“无消息可用的”代码(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以获取接收消息的示例。

    建立C API

    使用以下命令来构建C API并将其部署到本地计算机上的文件夹中:

    ./engine/build/deploy.sh -p //engine/alice/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
    

    区域设置

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

    缓冲区布局

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

    图像缓冲区

    下图显示了720p RGB图像的缓冲区。每个(行,列)位置都包含有关像素的信息。Isaac图像缓冲区按行优先。

    图像缓冲区示例

    张量缓冲器

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

    图像缓冲区示例

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

    同样,三维张量具有以下顺序:

    哪里max_i是维度“ i”的最大索引。

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

    消息示例

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

    bazel run apps/samples/proto_to_json
    

    这些JSON文件(在下面进行详细介绍)与Isaac中使用的常见原型相对应。

    ColorCameraProto

    • 文件名: color_camera_proto.json
    • 原型说明:ColorCameraProto
    • 原型ID:12905539496848989000

    有关二维缓冲区布局的说明,请参见上面的“ 图像缓冲区”部分。

    RangeScanProto

    • 文件名: range_scan_proto.json
    • 原型说明:RangeScanProto
    • 原型ID:11901202900662173387

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

    StateProto(messages::DifferentialBaseDynamics)

    • 文件名: differential_base_state_proto.json
    • 原型说明:StateProto
    • 原型ID:13177870757040999364

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

    1. 线速度
    2. 角速度
    3. 线性加速度
    4. 角加速度

    StateProto(messages::DifferentialBaseControl)

    • 文件名: differential_base_control_proto.json
    • 原型说明:StateProto
    • 原型ID:13177870757040999364

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

    1. 线速度
    2. 角速度

    相关文章

      网友评论

          本文标题:艾萨克C API

          本文链接:https://www.haomeiwen.com/subject/twdtyhtx.html