適用于 ROS 的 NVIDIA Isaac Transport(NITROS)是在 ROS 2 Humble 中引入的兩種硬件加速功能——類型適應和類型協商的實現。
類型適應 使 ROS 節點能夠以針對特定硬件加速器優化的數據格式工作。經過調整的類型用于處理圖形,以減少 CPU 和內存加速器之間的內存復制。
通過類型協商,不同的 ROS 節點可以在圖形中公布它們支持的類型,使得 ROS 框架能夠選擇合適的數據格式,從而實現最佳性能。

當兩個支持 NITROS 的 ROS 節點在一個圖形中相鄰時,它們可以通過類型協商發現彼此,然后使用類型適應來共享數據。類型適應和類型協商相結合,通過刪除不必要的內存拷貝,顯著提高了基于 ROS 的應用程序中 AI 和計算機視覺任務的性能。
這降低了 CPU 開銷,并優化了底層硬件的性能。圖 1 顯示了使用 NITROS 實現的高效硬件加速。數據可從 GPU 顯存訪問,而無需頻繁進行 CPU 復制。
您可以在處理圖形中將基于 NITROS 的 Isaac ROS 節點與其他 ROS 節點結合使用,因為 ROS 框架能夠與不支持協商的傳統節點保持兼容。在與非 NITROS 節點通信時,支持 NITROS 的節點的功能與典型的 ROS 2 節點相似。大多數 Isaac ROS GEM 都是 NITROS 加速的。
詳細了解 NITROS 和系統假設:NVIDIA NITROS 文檔。
采用 NITROS 的 NVIDIA CUDA
NVIDIA CUDA 是一種并行計算編程模型,能夠利用 GPU 大幅加速機器人系統中的功能。您可以通過托管 NITROS 發布者和托管 NITROS 訂閱者,將 CUDA 與 NITROS 結合使用,以優化您的自定義 ROS 2 節點。

ROS 節點中的 CUDA 代碼可以使用 GPU 顯存與支持 NITROS 的 Isaac ROS 節點共享其輸出緩沖區,托管 NITROS 發行商。這將消除昂貴的 CPU 內存復制,從而提高性能。NITROS 還通過發布與普通 ROS 2 消息相同的數據來保持與非 NITROS 節點的兼容性。

在訂閱者端,ROS 節點中的 CUDA 代碼可以使用托管 NITROS 用戶。輸入可以來自支持 NITROS 的 Isaac ROS 節點,也可以來自使用 NITROS Publisher 的另一個支持 CUDA 的 ROS 節點。與帶管理的 NITROS Publisher 一樣,這通過增加 GPU 和 CPU 之間的并行計算來提供更好的性能。

為了更好地理解這一點,我們來考慮一個執行基于 DNN 的點云分割的示例圖。總的來說,以下是使用 CUDA 和 NITROS 的三個主要組件:
- 使用帶管理的 NITROS Publisher 的編碼器節點sensor_msgs/PointCloud2將消息轉換成NitrosTensorList
- Isaac ROS TensorRT 節點用于執行 DNN 推理,NitrosTensorList并生成輸出NitrosTensorList
- 帶托管 NITROS 訂閱者的解碼器節點,用于轉換輸出NitrosTensorList分割成一個sensor_msgs/PointCloud2市場宣傳文本
托管式 NITROS 發布者和訂閱者提供熟悉的界面,與標準 rclcpp::Publisher 和 rclcpp::Subscriber API,可直觀地與現有的 ROS 2 節點集成。CUDA 與 NITROS 還實現了更模塊化的軟件設計。借助托管 NITROS 發行商和訂閱者,CUDA 節點可以在圖形中的任何位置與 Isaac ROS 節點和其他 CUDA 節點一起使用,從而在每個節點中獲得加速計算的優勢。
再深入探究一下,NITROS 基于 NVIDIA 圖形執行框架(GXF),這是一個用于構建高性能計算圖的可擴展框架。NITROS 利用 GXF 實現高效的 ROS 應用圖。借助 NITROS 的 CUDA,開發者可以在不需要深入了解 GXF 底層工作原理的情況下,支持 NITROS 節點。GXF 層被抽象化,使用戶能夠像平常一樣輕松快速地編寫 ROS 2 節點,并通過直接調整以啟用 NITROS。
詳細了解 核心概念:CUDA 與 NITROS 的結合。
目前,托管式 NITROS 發行商和訂閱者僅與 Isaac ROS 兼容 NitrosTensorList 消息類型。請訪問 isaac_ros_nitros_type 以獲取 NITROS 數據類型的完整列表。
使用 CUDA 與 NITROS 和 YOLOv8 進行物體檢測
Isaac ROS 提供了 YOLOv8 樣本,展示了如何結合使用托管式 NITROS 實用程序與自定義 ROS 解碼器,以充分利用 NITROS。此示例利用 Isaac ROS DNN 推理 中的 YOLOv8,執行 TensorRT 加速的物體檢測。托管式 NITROS 發布者和訂閱者使用 NITROS 類型的消息,目前僅與 Isaac ROS NitrosTensorList 消息類型兼容。此消息類型用于在節點與 Isaac ROS DNN 推理節點之間共享張量。

假設您想使用具有 Isaac ROS DNN 推理和 CUDA NITROS 加速的自定義物體檢測模型。檢測流程涉及三個主要步驟:輸入圖像編碼、DNN 推理和輸出解碼。Isaac ROS DNN 推理可實現前兩個步驟。
在解碼步驟中,必須從推理結果(即張量)中提取相關信息。對于 2D 物體檢測等任務,相關信息包括圖像中檢測到的每個輸出的邊界框和類分數。
我們來詳細了解每個步驟。
第 1 步:編碼
在輸入端,Isaac ROS 提供了 NITROS 加速的DNN 圖像編碼器。它會預處理輸入圖像,并將其轉換為張量,然后通過 isaac_ros_tensor_list 輸入到 TensorRT 或 Triton 節點進行推理。
您可以為調整大小等各種預處理函數指定圖像大小和網絡預期的輸入大小等參數。請注意,根據任務,您將需要不同的編碼器。例如,您無法將此圖像編碼器與語言模型一起使用,因為網絡需要不同的輸入編碼。

第 2 步:推理
Isaac ROS 為 DNN 推理提供了兩個 ROS 節點,分別是 TensorRT 節點 和 Triton 節點。目前,YOLOv8 示例使用的是 TensorRT 節點。您只需將訓練好的模型提供給 TensorRT 節點,該節點便會執行推理并輸出包含檢測結果的張量。
此輸出張量列表將傳遞給解碼器節點。您可以指定網絡預期的維度和張量名稱等參數,這些信息可以通過使用 Netron 等工具輕松找到。

第 3 步:解碼
必須將來自 TensorRT 或 Triton 節點的推理輸出張量解析為所需邊界框和類信息。假設您已將模型的解碼器編寫為 ROS 2 節點(尚未支持 NITROS)。解碼器節點不支持 NITROS 類型的消息,并且需要來自推理節點的典型 ROS 2 消息。這仍然有效,因為 NITROS 與非 NITROS 節點保持兼容性。
但是,在這種情況下,來自推理節點(GPU 顯存中)的輸出 NITROS 類型消息將轉換為 ROS 2 消息,并帶到 CPU 顯存以供解碼器使用。由于數據現在位于 CPU 顯存中,因此這會增加一些開銷,導致在與下游 ROS 節點一起工作時出現 CPU 顯存復制。
現在,假設您想升級解碼器,以通過 NITROS 與推理節點(和其他 NITROS 加速節點)通信,而不是產生 CPU 顯存復制成本。在這種情況下,所有數據都保留在 GPU 顯存中。
通過在解碼器節點中使用托管 NITROS 訂閱者,可以輕松實現這一點。它訂閱來自推理節點的 NITROS 類型的輸出消息,并使用 NITROS 視圖 獲取包含檢測輸出的 CUDA 緩沖區。然后,您可以對這些數據實施解碼邏輯,并通過適當的 ROS 消息類型發布結果。
YOLOv8 解碼器可配置 NMS 值和置信值等參數,以篩選候選檢測結果。可使用簡單的可視化節點訂閱生成的 ROS 消息,并在輸入圖像上繪制邊界框。請注意,帶管理的 NITROS 只能與 CPP ROS 2 節點集成。

Isaac ROS NITROS 橋接器
如果您的機器人應用目前基于 ROS 1,您仍然可以利用新發布的 Isaac ROS NITROS 橋接器。對于那些使用早于 Humble 版本的 ROS 2,無法進行類型適應和協商的開發者來說,這個橋接器也非常有用。
為了突出顯示可以實現的加速效果,NITROS 橋接器在 ROS 1 Noetic 和 NITROS 軟件包之間傳輸 1080p 圖像時,速度提高了 2.5 倍,相比于 ROS 1 橋接器。
ROS 橋接器包含基于 CPU 的內存復制成本,而 Isaac ROS NITROS 橋接器通過將數據從 CPU 移動到 GPU 來消除這種成本。這些數據可以在 GPU 顯存中就地使用。
NITROS 橋接器由兩個轉換器節點組成。一個用于 ROS 側(例如 Noetic),另一個用于 ROS 2 側(例如 Humble)。在沒有 NITROS 轉換器的情況下使用 ROS 橋接器會導致圖像從 Noetic 發送到 Humble,并通過 CPU 內存中 ROS 進程的副本返回,從而增加延遲。這個問題在發送大量數據(例如分段點云)的節點之間尤為明顯。

NITROS 橋接器旨在降低 ROS 版本之間的端到端延遲。考慮使用相同的示例,這次使用 NITROS 轉換器。Noetic 側的轉換器(圖 10)將圖像移動到 GPU 顯存,避免通過橋接器復制 CPU 內存。Humble 側的轉換器(圖 10)將 GPU 顯存中的圖像轉換為與其他 NITROS 加速節點兼容的 NITROS 圖像類型。
工作原理與之類似,即圖像數據作為 NITROS 圖像從 Humble 通過兩側的轉換器發送到 Noetic 中 CPU 可訪問內存中的圖像。
想要了解更多關于性能提升的信息,請訪問 Isaac ROS 基準測試,了解 NITROS 橋接器 和 ros1_bridge 的詳細信息。請注意,Isaac ROS NITROS 橋接器目前尚不支持 NVIDIA Jetson 平臺。

將 ROS 2 節點與 NITROS 集成的優勢
以下總結了將 ROS 2 節點與 NITROS 集成的諸多優勢:
- 通過減少 CPU 內存復制來提高性能。
- 兼容其他非 NITROS ROS 節點,例如 RViz.
- 通過托管 NITROS 發行商和訂閱者,輕松將自定義 ROS 2 節點與硬件加速的 Isaac ROS 節點集成。
- 使用 CUDA 和 NITROS 進行模塊化軟件設計。
- 使用 NITROS 橋接器提高基于早期 ROS 版本的應用程序的性能。
嘗試使用 Isaac ROS NITROS 和我們的 YOLOv8 物體檢測 示例!
欲了解更多關于我們的硬件加速軟件包的信息,請訪問 NVIDIA Isaac ROS 文檔。如需獲取 Isaac ROS 的最新信息,請訪問 開發者論壇。
?