如何教授 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
首先,下載 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 是訓練期間的景象:
在經過訓練後,JetBot 可以在 Isaac Sim 中的道路上自主行駛。
以下說明如何在真實 JetBot 上測試經過訓練的 RL 模型。
圖 5 為真實 JetBot 見到的畫面和思考。
在真實 JetBot 上執行經過訓練的 RL 模型
在建構 JetBot時,需要下列硬體元件:
- 大腦:Jetson Nano 開發人員套件(2GB 或 4GB)
- 身體:Waveshare JetBot 套件
- 記憶體:MicroSD 卡
- 用於 JetBot 的 18650 充電式電池。
- 若使用 2GB Jetson Nano,則需要 Wi-Fi 介面卡。由於4GB Jetson Nano 具有內建的 Wi-Fi 晶片,所以不需要。
欲瞭解更多與支援之元件有關的資訊,請參閱 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
使用向上箭頭按鈕,從 Isaac Sim best_model.zip 檔案上傳經過訓練的 RL 模型。
您也可以下載經過訓練的模型。啟動 jetbot/notebooks/isaacsim_RL/isaacsim_deploying.ipynb 筆記本。選取各個 Jupyter 單元,並按下 Ctrl+Enter 即可執行。PPO.load(MODEL_PATH) 的第二個單元,可能需要幾分鐘的時間。[*] 表示核心正在執行中。在完成之後,會變成數字。
執行攝影機程式碼,應會開啟 JetBot 攝影機。
執行此程式碼區塊,可以讓經過訓練的網路在攝影機上執行推論,並根據見到的畫面發出行駛命令。
若想要中斷 while 迴圈,請選擇停止。若想要停止機器人,請執行 robot.stop。
模擬至真實工作
我們精心打造出訓練環境,以建立可以將在模擬中學到的知識,成功轉移至真實 JetBot 的代理程式。最初在建立攝影機時,我們是使用 FOV 的預設值,並向下拍攝路面。此初始設定與真實攝影機影像(圖 10)不同。我們調整了模擬攝影機的 FOV 和方向(圖 11),並在訓練期間為輸出增加了均勻隨機雜訊。主要目的是使模擬攝影機影像能盡可能地接近真實攝影機的影像。
我們最初是使用模擬攝影機的全 RGB 輸出進行訓練。但是,我們發現網路需要更新數十萬次,才能開始一致地行駛。為了縮短此時間,請將所有影像從 RGB 轉換成灰階。在大約更新 10 萬次之後,應可看到網路開始展現一致的轉向行為。如果在更新數十萬次之後看到結果趨於穩定,即可降低學習速率,以協助網路持續學習。
我們也希望能建立不需要特定設定即可運作的代理程式。照明、顏色、陰影等差異,代表網路在轉移至真實 JetBot 之後的領域非常大。您無法模擬所有的可能性,因此,應教導網路忽略這些事物的變化。方式是定期將路徑、照明等事物隨機化。您也可以產生隨機網格(又稱為干擾物)、在路徑上投射硬陰影,以及協助教導網路應忽略什麼。此過程稱為領域隨機化,是轉移學習的常用技術。
結論
本文示範如何使用 Isaac Sim 訓練模擬 JetBot 的 AI 駕駛員,並將技能轉化成真實技能。您可以評估經過訓練之 RL 模型在真實 JetBot 上的表現,然後使用 Isaac Sim 解決缺點。解決方法包括將失敗案例進行更多隨機化、將領域隨機化用於照明眩光與攝影機校正等,以及重新訓練和重新部署。您可以嘗試使用更多方法,進一步改善結果。
Isaac Sim 也會提供 RGB、深度、分段和定界框資料。建議您在 Isaac Sim 中使用這些資料,探索如何教授 JetBot 新技巧。
致謝
特別感謝 NVIDIA Isaac Sim 團隊和 Jetson 團隊為這一篇文章付出的貢獻,尤其是 Hammad Mazhar、Renato Gasoto、Cameron Upright、Chitoku Yato 以及 John Welsh。