建立具備物理屬性且可於 Isaac Sim 沿用的四輪車 usda
如果資源 (asset) 是吻合 USD 格式的,它就可以被 Omniverse 解析和任意使用,概念上是這樣。但如果操作者是對 3D 開發陌生的職員,要實現順暢操作可能會沒有辦法很理所當然,但如果真的把步驟湊齊了,也還是會覺得沒那麼複雜。
因為業務需求接觸 Omniverse 這套模擬工具,在對電腦模擬、GPU 運算、電腦 3D 視覺都很陌生的背景之下,經過頻繁的比對文件、驗證和實作,在此分享我對這個工具截至目前能分享的心得。
業務需求是交通相關主題,幸運的是 Nvidia 有提供簡易外觀但屬性完整的四輪車模型。會基於這份檔案:
- 修改
- 引入使用
- 確保方向一致
保留一台車
- 從 window/examples/physics examples 中找到內建的 ackermann steering 範例,按下 Load scene 後可以看到有三組沒有車身只有四顆輪子的四輪車。

- 把 car_1 和 car_2 刪除

- 另存成 .usda 檔案 (存在哪裡都可以)

- 用 vscode 打開 (或自己習慣的編輯器),會看到所有元件的屬性,包含四輪車的。從這個檔案上下左右比對,可以猜出屬性的關聯和綁定關係。

- 在 isaac sim 開啟新專案,檢查剛剛輸出的 usda 檔案可不可以重新匯入到 isaac sim 的視窗
方法 a:import(不能用 import 的,不支援 usd 格式)
方法 b:open(可以,會跟儲存成 usda 時的狀態一模一樣)

方法 c:先建立一個 xform 再用 add reference 的方式匯入,看起來可行。

方法 d:用程式碼的方式,方向不一致。
1 | geom = UsdGeom.Xform.Define(stage, path) |

這時候如果再建立一個 xform 再用 add reference 的方式匯入,方向是正確的
回頭看 ackermann steering 匯入後的環境,是 Y up。目前推測使用內建的 add reference(方法 c) 會自動轉換,但如果是自己的程式碼就需要自己轉換。
所以要去哪裡轉換?把心思放回 ackermann steering 的 source code。在匯入前環境是 Z up,匯入後才被轉換成 Y up。
確實有 gYZXAxes = AxesIndices(1, 2, 0) ,但要如何訂正?
有兩個方法:把 stage 改成 Y up 或把 veh.usda 改成 Z up,選一個適用專案的即可 (譬如其它需要匯入的模型預設是 Z up)
解法 1:把 stage 改成 Y up
1 | from pxr import UsdGeom |
解法 2:讓 veh.usda 是 Z up
這邊用的方法是到 ackermann steering 的 source code 找到 create4WheeledCarsScenario,把參數 axes 由 AxesIndices(1, 2, 0) 改成 AxesIndices(2, 1, 0)。修改後要重新啟動 isaac-sim 才會生效,這個方法只適用在這個範例,但我也是透過這段 trace 才找到 UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.y)
存檔後即可解決使用方法 d 匯入模型但方向不一致的情形。