使用適用 ROS 的 NVIDIA Isaac GEMs 來設計機器人

作者 NVIDIA

用於 ROS 的 NVIDIA ISAAC GEMs 為您的 ROS2 應用程式提供了一套 GPU 加速包,提高了影像處理及 DNN 感知模型的處理量。這些 ROS2 軟件包是從 ROS2 Foxy 構建的,這是機器人社群所推出的首個長期穩定版(Long Stable Release,LTS)。

本文研究如何通過執行 NVIDIA ISAAC ROS GEMs 來加快部署機器人。本文重點是使用以 NVIDIA Jetson 平台為基礎的簡單開放原始碼機器人 nanosaur,以偵測 AprilTags。

在詳細介紹這個應用程式之前,先介紹一下 ROS、NVIDIA ISAAC GEMs 的歷史,以及打造 nanosaur 的方式。

ROS 與 ROS2 的歷史

Willow Garage 在 2007 年開發出機器人作業系統(Robot Operating System,ROS)。2012 年移交給新成立的 Open Robotics 基金會,以維持繼續開發框架。最早主要是由機器人研究社群使用這個框架,後來在包括機器人製造商和企業在內等更廣大的開發者社群中獲得更大的歡迎。

2015 年,ROS 社群注意到生產版本的弱點,缺乏單機器人支持(roscore)安全性、即時支援緩慢及其他核心問題。此時社群開始奠定第二代 ROS 的基礎,為研究社群及企業重新設計它,著眼於安全性、內部通訊和可靠性上。

在最後一次發布 ROS 官方版本(Noetic)後,ROS2 成為新的機器人發行版本,且在發布第一個 LTS 後獲得社群更多的支持。

Nanosaur

nanosaur 是以 NVIDIA Jetson 為基礎的簡單開放原始碼機器人。完全可以使用 3D 列印技術來製作它,能在您的辦公桌上自由走來走去,使用一個簡單的攝影機及像是一對眼睛的兩個 OLED。它的尺寸為 10x12x6 公分,重量僅有 500 克。

Image of the NVIDIA Jetson-based nanosaur robot
圖 1:nanosaur 是一款以 NVIDIA Jetson 為基礎、完全可以使用 3D 列印技術製作的機器人。

nanosaur 的硬體與 NVIDIA JetBot 的硬體類似,使用兩個 I2C OLED 顯示器,共用相同的 I2C 馬達驅動器。然而 nanosaur 的軟體是直接在 ROS2 上開發,以 Docker 為基礎且完全透過 GPU 加速。

nanosaur 有許多節點來驅動和顯示機器人的狀態。所有節點均按軟體包排列。

  • nanosaur_base
    • nanosaur_base 啟用馬達控制器和顯示器。
    • joy2eyes 將操縱杆訊息轉換為眼睛的主題。要測試眼睛的主題時,便是使用這個節點。
  • nanosaur_camera
    • nanosaur_camera 將相機串流器從 MIPI 攝影機運行到 ROS2 主題。
  • ros2_jetson_stats
    • ros2_jetson_statsjetson-stats 軟體包的封套,用於監控 NVIDIA Jetson [Xavier NX、Jetson AGX Xavier、Nano、TX1 或 TX2]。

如需更多資訊,請見主 nanosaur GitHub 儲存庫。

這是啟動 nanosaur 時常見的 ROS2 圖表。

A ROS2 graph of nanosaur divided by repository and package
圖 2:nanosaur 的 ROS2 圖,按儲存庫和軟體包劃分。

nanosaur 從 NVIDIA Jetson ROS Foxy Docker 映像檔開始發布。還支援 ROS2 Galactic、ROS2 Elotent、ROS Melodic 和 ROS Noetic,以及 PyTorch、TensorRT 和 DeepStream SDK 等人工智慧框架。

ROS2 Foxy 在 nanosaur_camera 中與 Jetson -UTIL 一同編譯和使用,以加快攝影機存取速度。

Overview of the nanosaur docker
3Docker 概述。根據 dusty-nv/jetson-containers 指南建造 nanosaur

nanosaur 在運行時有一組可用的主題,例如 image_raw topic,在移動顯示器上繪製眼睛的眼睛主題,以及驅動機器人的導航命令。

ROS 適用的 NVIDIA Isaac GEMs

簡化部署 GPU 加速演算法一事,是這些新 ROS2 軟體包的核心目的。這些供機器人社群使用的開放原始碼軟體包可以利用 CPU,並且直接在 GPU 上使用人工智慧和機器人感知技術提高機器人的能力。所有這些 GEM 都是為 ROS Foxy 所部署,搭配 NVIDIA 引擎使用。

Block diagram of Isaac GEMs for ROS
4ROS 適用的 ISAAC GEMs 是一套為機器人社群發布的 GPU 加速 ROS2 軟體包 NVIDIA Jetson 平台的一部分。

NVIDIA ISAAC GEMs 在 ROS 軟體包中提供硬體加速的機器人功能,在其他 ROS 軟體包中結合時,維持在 ROS2 中介軟體裡原生節點的完整性。ROS 適用的 NVIDIA Isaac GEMs 用於 x86_ 64/dGPU(Ubuntu 20.04)和 Jetson Xavier NX / AGX Xavier,以及最新的 NVIDIA JetPack 4.6 發行版本。

新的 ROS 適用的 NVIDIA Isaac GEMs 包括: 

AprilTag

AprilTag 是一種經過最佳化的獨特 QR 碼,可用於攝影機快速解碼及遠距離讀取。這些標記是基準點,用於驅動機器人或操縱器從特定點開始動作或完成作業。它們還用於擴增實境內,以校準眼罩的里程計。這些標籤有多個系列,很容易用桌上型印表機來印出。

Image showing the various AprilTags, such as Tag36h11 and TagStandard41h12.
5:各類 AprilTag 及系列名稱

ROS2 AprilTag 軟體包使用 NVIDIA GPU 來加速偵測影像及發布姿勢、ID 和其他元資料。該軟體包與用於 CPU AprilTag 偵測的 ROS2 節點相當。

軟體包的依賴項有:

  • isaac_ros_common
  • isaac_ros_image_pipeline
  • image_common
  • vision_cv
  • OpenCV 4.5+

在熟悉儲存庫中提供的教學內容後,便能在 ROS2 機器人專案中定義和配置它。

Example pipeline for Isaac ROS, starting with image rectification to AprilTag detection
6NVIDIA ISAAC ROS 範例工作流程從攝影機串流開始到圖像校正最後是 AprilTag 偵測。

通常從攝影機或立體攝影機輸出的串流內容開始定義工作流程,其中發布了兩個主題:第一個主題,其中輸出為原始攝影機串流內容;以及 camera_info,其中所有校準和配置都定義了串流內容。

完成此步驟後,可使用 ros_image_proc 來加速 ROS2 應用程式以校正影像,以及可能對標籤和角進行姿勢估計。

Side-by-side picture comparison of raw image and rectified version
圖 7:比較原始影像與校正後的版本

isaac_ros_apriltag 是一個 ROS2 主題,其中包含從串流內容中偵測到的 AprilTag 陣列。列出的每個 AprilTag 陣列都有許多資料點,例如攝影機的中心點、所有角點、ID 和姿勢。預設主題是 /tag_detections。以下是 tag_detections 訊息的範例。

---
header:
  stamp:
    sec: 1631573373
    nanosec: 24552192
  frame_id: camera_color_optical_frame
detections:
- family: 36h11
  id: 0
  center:
    x: 779.4064331054688
    y: 789.7901000976562
    z: 0.0
  corners:
  - x: 614.0
    y: 592.0
    z: 0.0
  - x: 971.0
    y: 628.0
    z: 0.0
  - x: 946.0
    y: 989.0
    z: 0.0
  
- x: 566.0
    y: 970.0
    z: 0.0
  pose:
    header:
      stamp:
        sec: 0
        nanosec: 0
      frame_id: ''
    pose:
      pose:
        position:
          x: -0.08404197543859482
          y: 0.11455488204956055
          z: 0.6107800006866455
        orientation:
          x: -0.10551299154758453
          y: -0.10030339658260345
          z: 0.04563025385141373
          w: 0.9882935285568237
      covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
---

nanosaur 與 AprilTag 偵測

使用一個配置檔來初始化 nanosaur_follower 節點,其中所有選定的參數都是 PID 增益、要遵循的 AprilTag ID 和其他參數。在主迴圈中,該節點解碼來自 Isaac_ros_apriltag 的訊息,當它出現在攝影機串流內容裡,開始跟隨它,生成線性速度和旋轉。

在圖 8 中,Isaac_ros_apriltag 為每一幀生成一個新的標籤偵測輸出,nanosaur_follower 節點則是驅動機器人。

A diagram of AprilTag closed loop navigation and detection
圖 8:AprilTag 閉環導航和偵測

在本例中,nanosaur 運動學模型的第一個近似物單輪機器人,可使用解耦 PID 控制器來追蹤標籤。在圖 9 中,第一個控制器(A)將從中心 AprilTag 角到中心垂直線的誤差減小為零。此錯誤驅動 ROS2 旋轉訊息。同時來自攝影機距離的第二個錯誤驅動機器人速度(B)。

Two images of the nanosaur and how the AprilTag corner placement drives the twist output and the AprilTag camera distance drives the speed.
圖 9:在偵測 AprilTag 後,nanosaur 產生一個旋轉輸出來驅動馬達

即時網頁介面

nanosaur 提供了第二個 Docker 影像,能即時查看其中的所有主題和攝影機串流內容,且能即時看到機器人移動時發生的情況。圖 10 顯示了一個使用者介面範例。

Screenshot of interface with image and running code.
圖 10:機器人運行時的 ROS2 網頁介面範例

總結

我在本文中討論了如何使用 NVIDIA ISAAC ROS GEMs 來加快部署機器人。解決方案的重點是使用基於 NVIDIA Jetson 平台的簡單開放原始碼機器人 nanosaur 來偵測 AprilTags。

如需更多資訊,請從 GitHub 下載 Isaac ROS nanosaur 整合