在 NVIDIA Isaac Sim 中訓練 JetBot

作者 NVIDIA Developer

如何教授 JetBot 新技巧?本文介紹 NVIDIA Isaac Sim 模擬和訓練功能,以及為您示範如何透過強化學習 (RL) ,在 Isaac Sim 中訓練 JetBot,並使用真實 JetBot, 在 NVIDIA Jetson Nano 上測試經過訓練的 RL 模型。

目標

目標是在 Isaac Sim 中訓練深度神經網路代理程式,並轉移至真實 JetBot,以沿著道路行駛。在真實 JetBot 上訓練此網路需要經常注意。Isaac Sim 可以模擬 JetBot 和攝影機感測器的機制,以及自動設定和重設 JetBot。模擬也可以讓您取得真值資料,且能將代理程式學習的環境隨機化,以協助使網路具備足以驅動真實 JetBot的穩健性。

在 Isaac Sim 中訓練 JetBot

圖 1:在 Isaac Sim 中訓練 JetBot 沿著道路行駛。

首先,下載 Isaac Sim。需要下列資源才能執行Isaac Sim:

  • Ubuntu 18.04
  • NVIDIA GPU(RTX 2070 或更高階)
  • NVIDIA GPU 驅動程式(最低版本 450.57)

其次,套用此 Isaac Sim 更新檔

欲瞭解更多與如何在 Isaac Sim 中訓練 RL JetBot 樣本有關的資訊,請參閱 Reinforcement Training Samples

Isaac Sim 可以模擬 JetBot 行駛,並將環境、照明、背景和物件姿態隨機化,以提高代理程式的穩健性。圖 3 是訓練期間的景象:

圖 2:以領域隨機化照明、干擾物和彎道創造變化,並提高網路穩健性。

在經過訓練後,JetBot 可以在 Isaac Sim 中的道路上自主行駛。

圖 3:Isaac Sim 中的 RL 訓練結果。

以下說明如何在真實 JetBot 上測試經過訓練的 RL 模型。

圖 4:Isaac Sim 中的 RL 訓練結果。

圖 5 為真實 JetBot 見到的畫面和思考。

圖 5:JetBot 攝影機觀點和轉向意圖。

在真實 JetBot 上執行經過訓練的 RL 模型

在建構 JetBot時,需要下列硬體元件:

欲瞭解更多與支援之元件有關的資訊,請參閱 Networking

依據指示組裝 JetBot。拆下 Waveshare Jetbot 的前方第四輪,有助於避免卡住。此外,2GB Jetson Nano 可能不具備風扇接頭。

依據下列指示刷新 JetBot:

將 microSD 卡裝入 Jetson Nano 機板中。使用 12.6V 轉接器,將鍵盤、滑鼠和 HDMI 線插入機板。啟動及依據螢幕上的指示設定 JetBot 使用者。

更新套件清單:

$ sudo apt-get update

如果使用 2GB Jetson Nano,則必須同時執行以下命令:

$ sudo apt-get dist-upgrade

在設定實體 JetBot 之後,複製以下 JetBot 分支:

$ git clone https://github.com/hailoclu/jetbot.git

透過 NVIDIA-AI-IOT/jetbot GitHub 儲存庫中的所有步驟,啟動 Docker,然後執行以下命令:

./scripts/enable_swap.sh
./docker/camera/enable.sh

必須直接在 JetBot 上或透過 SSH 執行,而不是在 Jupyter 終端機視窗中執行。如果看到 docker: invalid reference format,請叫用 source configure.sh,以再次設定環境變數。

在 Jupyter 終端機視窗中執行以下兩個命令,也可以使用 SSH 連線至 JetBot:

apt install openssh-server
ssh jetbot@0.0.0.0

在使用 ./enable.sh $HOME 啟動 Docker 之後,可以在瀏覽器上前往 JetBot IP 位址,透過 Jupyter 筆記本,從電腦連線至 JetBot,例如 https://192.168.0.185:8888。如果設定成功,且未出現錯誤,則 JetBot 的 IP 位址應會顯示在機器人背面的 LED 上。

拔下鍵盤、滑鼠和 HDMI ,以釋放 JetBot。

在 Jupyter 筆記本中按加號 (+) ,啟動終端機視窗,並執行以下兩個命令,以安裝穩定基準:

apt install python3-scipy python3-pandas python3-matplotlib
python3 -m pip install stable_baselines3==0.8.0
圖 6:使用 Jupyter 筆記本與真實 JetBot 通訊。

使用向上箭頭按鈕,從 Isaac Sim best_model.zip 檔案上傳經過訓練的 RL 模型。

您也可以下載經過訓練的模型。啟動 jetbot/notebooks/isaacsim_RL/isaacsim_deploying.ipynb 筆記本。選取各個 Jupyter 單元,並按下 Ctrl+Enter 即可執行。PPO.load(MODEL_PATH) 的第二個單元,可能需要幾分鐘的時間。[*] 表示核心正在執行中。在完成之後,會變成數字。

圖 7:使用 Jupyte r筆記本,在真實 JetBot 上載入經過訓練的 RL 模型。

執行攝影機程式碼,應會開啟 JetBot 攝影機。

圖 8:開啟真實 JetBot 攝影機。

執行此程式碼區塊,可以讓經過訓練的網路在攝影機上執行推論,並根據見到的畫面發出行駛命令。

圖 9:在真實 JetBot 上執行推論。

若想要中斷 while 迴圈,請選擇停止。若想要停止機器人,請執行 robot.stop

模擬至真實工作

我們精心打造出訓練環境,以建立可以將在模擬中學到的知識,成功轉移至真實 JetBot 的代理程式。最初在建立攝影機時,我們是使用 FOV 的預設值,並向下拍攝路面。此初始設定與真實攝影機影像(圖 10)不同。我們調整了模擬攝影機的 FOV 和方向(圖 11),並在訓練期間為輸出增加了均勻隨機雜訊。主要目的是使模擬攝影機影像能盡可能地接近真實攝影機的影像。

圖 10:初始攝影機參數不符合。 左:真實,右:Isaac Sim。
圖 11:使真實與模擬攝影機的參數一致。並將虛線顏色從黃色改成白色。 左:真實,右:Isaac Sim。

我們最初是使用模擬攝影機的全 RGB 輸出進行訓練。但是,我們發現網路需要更新數十萬次,才能開始一致地行駛。為了縮短此時間,請將所有影像從 RGB 轉換成灰階。在大約更新 10 萬次之後,應可看到網路開始展現一致的轉向行為。如果在更新數十萬次之後看到結果趨於穩定,即可降低學習速率,以協助網路持續學習。

我們也希望能建立不需要特定設定即可運作的代理程式。照明、顏色、陰影等差異,代表網路在轉移至真實 JetBot 之後的領域非常大。您無法模擬所有的可能性,因此,應教導網路忽略這些事物的變化。方式是定期將路徑、照明等事物隨機化。您也可以產生隨機網格(又稱為干擾物)、在路徑上投射硬陰影,以及協助教導網路應忽略什麼。此過程稱為領域隨機化,是轉移學習的常用技術。

圖 12:在同一次訓練中進行兩次相似的轉彎。在訓練期間,顏色、照明和紋理變化會迫使代理程式學習忽略真實世界中的屬性。

結論

本文示範如何使用 Isaac Sim 訓練模擬 JetBot 的 AI 駕駛員,並將技能轉化成真實技能。您可以評估經過訓練之 RL 模型在真實 JetBot 上的表現,然後使用 Isaac Sim 解決缺點。解決方法包括將失敗案例進行更多隨機化、將領域隨機化用於照明眩光與攝影機校正等,以及重新訓練和重新部署。您可以嘗試使用更多方法,進一步改善結果。

圖 13:在 2GB Jetson Nano 上執行經過訓練的 RL 模型。

Isaac Sim 也會提供 RGB、深度、分段和定界框資料。建議您在 Isaac Sim 中使用這些資料,探索如何教授 JetBot 新技巧。

致謝

特別感謝 NVIDIA Isaac Sim 團隊和 Jetson 團隊為這一篇文章付出的貢獻,尤其是 Hammad Mazhar、Renato Gasoto、Cameron Upright、Chitoku Yato 以及 John Welsh。