NVIDIA Holoscan SDK v2.9.0

在 GXF 应用程序中使用 Holoscan 操作器、资源和类型

对于熟悉 GXF 开发生态系统的用户,我们提供导出功能,以利用原生 Holoscan 代码作为 GXF 组件,在 GXF 应用程序和 Graph Composer 中执行。

为了简化将原生 C++ Holoscan 操作器包装为 GXF 代码段的方法,请查看以下描述的 wrap_operator_as_gxf_extension 示例。

为了精细地包装多个操作器和资源,请查看以下描述的 wrap_holoscan_as_gxf_extension 示例。

1. 创建兼容的 Holoscan 操作器

注意

本节假设您已熟悉如何创建原生 C++ 操作器

为了确保与 GXF 代码段的兼容性,建议在 Operator::setup(OperatorSpec& spec) 中将 holoscan::gxf::Entity 指定为输入和输出端口的类型。这在 PingTxNativeOpPingRxNativeOp 的实现中得到了演示。相比之下,内置操作器 PingTxOpPingRxOp 使用不同的规范。请注意,指定类型目前仅用于注释目的,因为 Holoscan SDK 不验证输入和输出类型。但是,此行为将来可能会更改。

有关使用 holoscan::gxf::Entity 的更多详细信息,请参阅关于 GXF 和原生 C++ 操作器之间的互操作性 的文档。

2. 创建包装操作器的 GXF 扩展

为了在 GXF 扩展中将原生操作器包装为 GXF 代码段,我们在 SDK 中提供了 CMake wrap_operator_as_gxf_extension 函数。有关如何包装 PingTxNativeOpPingRxNativeOp 的示例,请参见此处

注意

使用 Holoscan SDK 脚本 generate_extension_uuids.py 为 GXF 包装的组件生成 UUID。

3. 在 GXF 应用程序中使用您包装的操作器

注意

本节假设您熟悉如何创建 GXF 应用程序

gxf_app/CMakeLists.txt 此处 所示,您需要在 create_gxe_application() 中列出以下扩展以使用您包装的代码段

  • GXF::std

  • gxf_holoscan_wrapper

  • 为创建的扩展的 CMake 目标名称,由传递给上一节中 wrap_operator_as_gxf_extensionEXTENSION_TARGET_NAME 参数定义。

代码段类名称(由传递给上一节中 wrap_operator_as_gxf_extensionCODELET_NAMESPACE::CODELET_NAME 参数定义)然后可以用作 GXF 应用程序节点中的组件 type,如示例的 YAML 应用程序定义 中所示,连接两个 ping 操作器。

Holoscan SDK 提供了几个细粒度的 CMake 宏,以使资源和操作器与 GXF 应用程序兼容。

1. 将 holoscan::Resource 包装为 GXF::Component

Holoscan SDK 提供了 CMake generate_gxf_resource_wrapper 函数,用于为 GXF 包装资源。该函数接受 Holoscan SDK Resource 类,并应用包装器模板以生成以下内容

  • 用于为 GXF 包装资源的 C++ 源文件和头文件;

  • 用于将代码编译为共享库的 CMake 构建目标;

  • 在扩展中使用的 GXF C++ 宏源代码。

例如,wrap_holoscan_as_gxf_extension 演示了如何按如下方式包装资源

复制
已复制!
            

generate_gxf_resource_wrapper(RESOURCE_HDRS RESOURCE_SRCS EXT_CPP_CONTENT RESOURCE_CLASS myres::PingVarCustomNativeRes COMPONENT_NAME PingVarCustomNativeResComponent COMPONENT_NAMESPACE myexts COMPONENT_TARGET_NAME gxf_wrapped_ping_variant_custom_native_res_lib HASH1 0xc4c16b8d6ef94a01 HASH2 0x8014ce5b3e9602b1 INCLUDE_HEADERS ping_variant_custom_native_res.hpp PUBLIC_DEPENDS ping_variant_custom_native_res COMPONENT_TARGET_PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )

此函数调用在示例构建上下文中的结果如下

  • 生成 C++ 源文件和头文件,用于在 GXF 兼容的 myexts::PingVarCustomNativeResComponent 类中包装 myres::PingVarCustomNativeRes 资源。输出 C++ 文件位置存储在 RESOURCE_HDRSRESOURCE_SRCS CMake 变量中。

  • 定义名为 gxf_wrapped_ping_variant_custom_native_res_lib 的构建目标。运行 cmake --build <build-dir> --target <gxf_wrapped_ping_variant_custom_native_res_lib> 将构建 GXF 资源包装器,具体取决于 ping_variant_custom_native_res

  • 将 GXF 工厂宏 C++ 代码片段附加到 EXT_CPP_CONTENT CMake 变量以供稍后使用。

重复此步骤以包装要包含在扩展中的任何其他资源。

注意

使用 Holoscan SDK 脚本 generate_extension_uuids.py 为 GXF 包装的组件生成 UUID。

2. 将 holoscan::Operator 包装为 GXF::Component

Holoscan SDK 提供了 CMake generate_gxf_operator_wrapper 函数,用于为 GXF 包装操作器。与上面的资源包装器类似,此函数创建 C++ 源文件和头文件,用于包装操作器,以及用于构建操作器包装器的共享库的构建目标。与之前的示例不同,此函数本身不生成 GXF 扩展。

wrap_holoscan_as_gxf_extension 演示了如何按如下方式包装操作器

复制
已复制!
            

generate_gxf_operator_wrapper(TX_CODELET_HDRS TX_CODELET_SRCS EXT_CPP_CONTENT OPERATOR_CLASS "myops::PingVarTxNativeOp" CODELET_NAME PingVarTxNativeOpCodelet CODELET_NAMESPACE myexts HASH1 0x35545ef8ae1541c5 HASH2 0x8aef3c2078fc50b4 CODELET_TARGET_NAME gxf_wrapped_ping_variant_tx_native_op_lib DESCRIPTION "Ping Tx Native Operator codelet" INCLUDE_HEADERS ping_variant_tx_native_op.hpp PUBLIC_DEPENDS ping_variant_tx_native_op CODELET_TARGET_PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )

此函数调用在示例构建上下文中的结果如下

  • 生成 C++ 源文件和头文件,用于在 GXF 兼容的 myexts::PingVarTxNativeOpCodelet 类中包装 myop::PingVarTxNativeOp 操作器资源。输出 C++ 文件位置存储在 TX_CODELET_HDRSTX_CODELET_SRCS CMake 变量中。

  • 定义名为 gxf_wrapped_ping_variant_tx_native_op_lib 的构建目标。运行 cmake --build <build-dir> --target <gxf_wrapped_ping_variant_tx_native_op_lib> 将构建 GXF ping 操作器包装器,具体取决于 ping_variant_tx_native_op

  • 将 GXF 工厂宏 C++ 代码片段附加到 EXT_CPP_CONTENT CMake 变量以供稍后使用。

重复此步骤以包装要包含在扩展中的任何其他操作器。

3. 生成组合的 GXF 扩展

Holoscan SDK 提供了 CMake generate_gxf_extension 函数,用于在 GXF 扩展模板中捆绑包装的组件。该函数接受扩展详细信息和从前面的包装函数调用序列生成的 C++ GXF 函数内容。然后,GXF 组件工厂可以在应用程序运行时实例化在 GXF 扩展中注册的每个组件。

wrap_holoscan_as_gxf_extension 演示了如何按如下方式生成 GXF 扩展

复制
已复制!
            

generate_gxf_extension( EXTENSION_TARGET_NAME gxf_wrapped_ping_variant_ext EXTENSION_NAME PingVarCustomNativeResExtension EXTENSION_DESCRIPTION "Ping Variant Custom Native extension. Includes wrapped Holoscan custom resource and tx/rx operators" EXTENSION_AUTHOR "NVIDIA" EXTENSION_VERSION "${holoscan_VERSION}" EXTENSION_LICENSE "Apache-2.0" EXTENSION_ID_HASH1 0x2b8381ed5c2740a1 EXTENSION_ID_HASH2 0xbe586c019eaa87be INCLUDE_HEADERS ${RESOURCE_HDRS} ${TX_CODELET_HDRS} ${RX_CODELET_HDRS} PUBLIC_DEPENDS gxf_wrapped_ping_variant_custom_native_res_lib gxf_wrapped_ping_variant_tx_native_op_lib gxf_wrapped_ping_variant_rx_native_op_lib EXTENSION_TARGET_PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} EXT_CPP_CONTENT "${EXT_CPP_CONTENT}" )

generate_gxf_extension 函数调用生成 CMake 构建目标 gxf_wrapped_ping_variant_ext 以构建 GXF 扩展共享库。生成的扩展可以包含在 GXF 上下文中,以使自定义资源和 Tx/Rx 操作器可用于 GXF 应用程序。

4. 在 GXF 应用程序中使用您包装的组件

注意

本节假设您熟悉如何创建 GXF 应用程序

使用 Holoscan SDK 包装生成的 GXF 扩展依赖于 Holoscan Wrapper 扩展。在应用程序清单中列出扩展时,请确保按顺序观察依赖项

  • GXF::std

  • ucx_holoscan_extension

  • gxf_holoscan_wrapper

  • 您的自定义包装器扩展名称

查看示例 YAML 应用程序定义,以演示如何在应用程序中将自定义资源用作 tx 操作器的参数。

上一篇 GXF 示例
下一篇 GXF 用户指南
© 版权所有 2022-2024 NVIDIA。 上次更新于 2025 年 1 月 27 日。