1. 介紹
承續上篇 Isaac Sim 的介紹, 讀者對于如何執行 Isaac Sim 以及它最基本的環境已經有了一些初步的了解了,接下來我們就要來玩一下能不能在模擬環境上部署深度學習模型來讓 Jetbot 機器人從無到有自己學會道路駕駛,例如下面的范例影片,透過仿真的 Jetbot 鏡頭看出去,我們可以看到機器人確實有沿著道路在行走!
本篇文章是參考 Nvidia 官方的范例教學做成的, 想要進一步了解的讀者可以去參考看看哦。
2. 準備道路模型
要讓機器人學會道路駕駛,最基本的就是要先有個道路可以讓機器人去跑,我們在這邊使用樂高的道路平板來拼湊出基本的道路,好讓機器人可以學習如直走跟轉彎。
2.1. LeoCAD
1.首先,我們必須去下載LeoCAD, 一款專門用來畫樂高模型的繪圖軟件,請點選下方的鏈接來下載并安裝。
2.安裝完成后,啟動 LeoCAD,在右邊的零件表搜尋一下四種道路平板,
?44336p01 Baseplate 32×32 Road 6-Stud Straight
?44342p01 Baseplate 32×32 Road 6-Stud Curve
?44341p01 Baseplate 32×32 Road 6-Stud T-Junction
?44343p01 Baseplate 32×32 Road 6-Stud Crossroad
3.可以試著把四片平板組合起來,看看是不是可以拼成以下的道路圖。
4.那么最后就是把這幾件平板輸出成COLLADA 檔,準備做進一步的轉檔處理。
2.2. Blender
前面提過我們拿到了道路的 COLLADA 檔,這是一種用來在多個3D軟件交換用的格式。但是我們還得要用 Blender 再進行一次轉檔,才能轉成可以在 Isaac Sim 渲染的圖檔。
1.下載并安裝 Blender
2.將剛剛輸出的 COLLADA 檔匯到 Blender 中
匯入后應該可以看到道路的圖文件顯示如下
3.接下來我們將每一塊零件的偏移量歸零,因為等會要丟到 Isaac Sim 時,會用程序組裝出各種可能的道路,所以我們必須確保零件的原點都是一致的。
4.從新命名每一個零件,方便我們待會匯入到Isaac Sim 時比較好辨認。
5.最后輸出圖檔成 Isaac Sim 可以吃的 fbx 檔。
記得要在 Transform 那邊選擇 Z Up, X Forward。
輸出完成后,我們就會拿到下面四個圖檔。
?p44336p01.fbx
?p44342p01.fbx
?p44341p01.fbx
?p44343p01.fbx
2.3. 將圖檔匯入 Issac sim
接下來我們回到 Isaac Sim 中,我們要把前面的圖檔匯入到模擬環境中。首先,開啟 Isaac Sim 并在左下角的 Content 中建立一個 Omniverse/localhost/Library/Props/Road_Tiles/Parts 的文件夾, 然后在右邊的空白字段點右鍵,選擇Import and Convert 來匯入 fbx 檔案。
假設我們前面的 fbx 檔案是存在 Download 這個文件夾,我們就可以將他們全選并上傳到 Nucleus 服務器,記得在上傳的時候要勾選下面三個選項:
?Import Materials
?Import As Single USD
?Generate Smooth Normals
匯入后如下圖
最后檢查一下是否我們要的四塊道路圖檔都有被正確匯入了。
3. 開始訓練深度學習的模型
接下來的操作需要使用者有事先匯入 Isaac Sim 的 Asset 套件包,里面有機器學習的范例文件(如果不知道怎么匯入的讀者可以去參考我們的上一篇文章: Isaac Sim 的介紹)。
有別于之前的操作都是直接使用 Isaac Sim 的圖形化界面, 這次我們啟動訓練模型的程序方法是必須從終端機開始。首先, 在計算機上打開一個終端機,并輸入下面的指令:
cd~/.local/share/ov/pkg/isaac_sim-2021.1.1/
這個的意思是切換目錄到前面提到的 Isaac Sim 的 Asset 套件包的安裝位置。
然后修改“python_samples/jetbot/road_environment.py” 這只程序,將道路圖塊的路徑 改到我們剛剛放的地方,如下
# 1=I2=L 3=T, 4=X
self.tile_usd= {
0: None,
1: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44336p01/p44336p01.usd","offset": 180},
2: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44342p01/p44342p01.usd","offset": 180},
3: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44341p01/p44341p01.usd","offset": 180},
4: {"asset": nucleus_server +"/Library/Props/Road_Tiles/Parts/p44343p01/p44343p01.usd","offset": 180},
} # list of tiles that can be spawned
3.1. 確保 GPU 的記憶題足夠訓練模型
筆者的開發環境所用的筆電有的顯卡是RTX 3070,但即便是擁有8G的內存還是無法負荷默認的模型訓練參數,所以我們會做以下的調整,縮小模型訓練時的吞吐量,雖然會模型學習的會比較慢,但至少確保能夠正常運作。
我們修改“python_samples/jetbot/jetbot_train.py” , 這只程序是我們用來訓練的主程序。 里面有一個地方是可以設定batch size 的大小,這個會決定模型每次訓練的吞吐量,以筆者的8G顯卡為例,可以設定的最大 batch size 大概是1024。修改如下:
ifargs.loaded_checkpoint == "":
model = PPO(
"CnnPolicy",
env,
verbose=1,
tensorboard_log=args.tensorboard_dir,
policy_kwargs=policy_kwargs,
device="cuda",
n_steps=args.step_freq,
batch_size=1024,
n_epochs=50,
learning_rate=0.0001,
)
另外,在開始訓練前,建議關掉所有的 Isaac Sim 的軟件,因為那都會重復占用到 GPU 的內存,我們只要保留由終端機執行訓練程序所叫起的 Isaac Sim 就好。
一切準備就緒后我們就可以執行下面的指令來開始訓練了。
./python.shpython_samples/jetbot/jetbot_train.py
上面的指令會自動叫出仿真的圖形化界面,如果讀者覺得暫時不需要花費算力去畫出模擬的3D圖,可以在后面加上 headless 來關閉圖形化界面,等訓練完一段時間后,再開啟圖形化界面確認模型的訓練的效果也是可以的。
./python.shpython_samples/jetbot/jetbot_train.py --headless
4. 強化學習的訓練機制
熟悉深度學習的讀者一定知道在讓模型去做學習的時候,能否給模型一個好的回饋是學習成敗的關鍵,例如以寵物分類問題來說,我們會給模型看到哪些圖片是貓,哪些圖片是狗,藉此來讓模型去學習。但是對于學習自動駕駛來說,機器人可以做到決策其實復雜度更高,比如說 Jetbot 可以隨著時間變化行走的方向跟速度,至于要怎么判斷機器人走得好不好,也許我們可以透過機器人的中心點到道路中間的距離來判斷,另外,機器人的行走速度可能也是一個我們希望優化的量,好比說我們會希望機器人過彎的時候會懂得抄近路,而不是一味地死守道路中線。
當我們搞定好模型在學習這個問題的回饋之后,我們就可以來看一下具體模型的學習策略。對于強化學習的問題而言,我們沒有辦法馬上知道模型此刻學的行為好或不好,比如說 Jetbot 可能在直線上可以走得很順,但是一直到轉彎處直接跑出界才發現其實它不會轉彎。在這個范例程序中,我們主要會用以下的技術來幫助模型的學習:
1.使用 Open AI 所提出的 ProximalPolicy Optimization (PPO) 技術來做有效的強化學習,簡單說就是在每一次的訓練回合中,都會先生成一個固定模型參數的代打,下去我們的模擬環境跑各種的測試,然后我們再利用這些測試所搜集的數據來生成一個數據集,回過頭更新我們之前的模型。其中的精妙之處在于我們不會輕易的將我們正在學的模型一直丟到測試環境中去驗證,因為這樣會導致模型在學習上很不穩定,同時也沒有效率,變成說每次剛更新完的模型走一步測試后,這個資料就只用那么一次而已。
2.使用 Issac Sim 的 DomainRandomization 機制來加強模型的韌性。如果讀者仔細觀察機器人在學習的過程中其實場景是一直在變化的,我們的環境仿真程序不只會將我們前面的道路圖塊隨機拼湊成不同的環形道路外,道路周遭的背景跟物品也都會隨機生成,為的就是盡可能的讓機器人適應不同點情況,達到我們真正想要它學習的任務。
5. 檢視模型訓練的結果
以筆者的經驗,模型都需要經過兩萬多次以上的回合后,Jetbot 在道路上的行為才會收斂到我們所想象的自動駕駛,像是筆者的計算機(Intel i7 CPU + RTX 3070 GPU)大概會需要模型跑個一天的訓練才能達到 一個可以接受的表現。
那如果是想要看看我們模型的表現如何,可以先停掉訓練的程序,釋放出可用的 GPU ,然后執行下面的程序
./python.shpython_samples/jetbot/jetbot_train.py --eval
程序會自動挑選目前為止訓練最好的模型參數,然后套用在 Jetbot 跑道路模型的仿真上,如下,讀者是否都能夠看到自己訓練的 Jetbot 都能夠沿著道路跑一遍自動駕駛呢?
審核編輯:湯梓紅
-
機器人
+關注
關注
211文章
28693瀏覽量
208652 -
NVIDIA
+關注
關注
14文章
5080瀏覽量
103822 -
Sim
+關注
關注
2文章
247瀏覽量
40103 -
python
+關注
關注
56文章
4809瀏覽量
85074
原文標題:NVIDIA Isaac Sim 強化學習實作 – 讓 Jetbot 自己學會道路駕駛!
文章出處:【微信號:易心Microbit編程,微信公眾號:易心Microbit編程】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
深度強化學習實戰
將深度學習和強化學習相結合的深度強化學習DRL
基于Omniverse的NVIDIA Isaac Sim現已發布公測版
![基于Omniverse的<b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> <b class='flag-5'>Sim</b>現已發布公測版](https://file.elecfans.com/web2/M00/02/9E/poYBAGDRigKAchczAATtu-Z94Xk181.png)
NVIDIA Isaac Sim 2022.1版本的亮點及功能
NVIDIA AI機器人開發— NVIDIA Isaac Sim入門
NVIDIA 公開課 | AI 機器人開發第二講 — Isaac Sim 高階開發
CES | 用 NVIDIA Isaac Sim 2022.2 模擬未來智能機器人
強化學習與智能駕駛決策規劃
使用 ROS 2 MoveIt 和 NVIDIA Isaac Sim 創建逼真的機器人模擬
![使用 ROS 2 MoveIt 和 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> <b class='flag-5'>Sim</b> 創建逼真的機器人模擬](https://file1.elecfans.com/web2/M00/8E/65/wKgZomTGbIyAQVlkAAAjG11vbpo868.png)
Omniverse 中文課程系列 7:使用 Isaac Sim 實現機器人仿真入門
![Omniverse 中文課程系列 7:使用 <b class='flag-5'>Isaac</b> <b class='flag-5'>Sim</b> 實現機器人仿真入門](https://file1.elecfans.com/web2/M00/90/59/wKgZomTYlemAAbOAAAAU7W1B0mk390.png)
使用 NVIDIA Isaac 仿真并定位 Husky 機器人
![使用 <b class='flag-5'>NVIDIA</b> <b class='flag-5'>Isaac</b> 仿真并定位 Husky 機器人](https://file1.elecfans.com//web2/M00/B9/59/wKgaomWKpnqAE94PAABi0iEB4eg780.jpg)
評論