18 — 建模擬場域時,物理參數要去哪裡找
建一個「看起來對」的場景只需要幾何。建一個物理上對的場景, 每個剛體都要有質量、慣量、摩擦、碰撞近似 —— 而這些幾乎不會跟著資產一起來。
這份記的是去哪找、每個來源實際給你什麼、以及查不到時怎麼估。 2026-07-31 為了查「後推式板車該多重」而整理,方法可套用到任何場域元件。
0. 先講最重要的一件事
PhysX 對未授權質量的預設是「網格體積 × 1000 kg/m³」—— 1000 是水的密度。
所以任何鋼構件如果沒有授權 physics:mass 或 physics:density,
會比真實輕約 7.9 倍(鋼 7850 / 水 1000)。
實例:現地場域那個場景的 push-back 板車自動算成 9.4 kg, 比它載的棧板(20 kg)還輕 —— 真實世界正好相反。用鋼密度重算是 73.6 kg。
這種錯不會有任何警告,場景照樣跑,只是行為不對 (太輕的東西被推一下就飛、堆疊不穩、求解器容易發散)。
1. 來源的優先順序
| # | 來源 | 給你什麼 | 不給你什麼 |
|---|---|---|---|
| 1 | 資產本身的 authored 值 | 若有,直接用 | 多數資產包沒有,見 §2 |
| 2 | 製造商規格書 / 型錄 | 尺寸、載重能力、材質 | 自重(tare weight)很少公布 —— 見 §3 陷阱 |
| 3 | 材料密度 × 幾何體積 | 可靠的估算 | 需要幾何正確,見 §4 |
| 4 | 同類產品的實測/秤重報告 | 真值 | 難找,且型號不一定對應 |
2. ⚠ 不要假設 NVIDIA 資產帶物理
2026-07-31 用 USD API 稽核(不是 grep,理由見 §5) NVIDIA Warehouse 資產包(24 GB):
| 資產 | prim 數 | RigidBody | authored mass | Collision |
|---|---|---|---|---|
WingPallet_A01(木棧板) |
9 | 0 | 0 | 0 |
HeavyDutyPalletTruck_A01(油壓拖板車) |
25 | 0 | 0 | 0 |
Rack_E02(層架) |
9 | 0 | 0 | 0 |
全部是純幾何 + 材質。 這是 digital twin(視覺)資產包,不是物理資產包。
⚠ 它們的 metersPerUnit = 0.01(公分制)。把它們放進公尺制場景時
父層會有 0.01 縮放 —— 算體積一定要用世界座標變換,
只用 local 頂點會錯 10⁶ 倍。
Isaac Sim 自己的機器人資產(
Isaac/Robots/…)通常有完整物理, 因為它們是要被模擬的。「資產包的用途」決定它有沒有物理 —— 視覺/場景佈置用的沒有,機器人/可互動物件才有。
工具:examples/audit_asset_physics.py
—— 給它一個 USD,列出哪些 prim 有 RigidBody/Mass/Collision API 與 authored 值。
3. ⚠ 規格書的最大陷阱:載重能力 ≠ 自重
查「push-back 板車多重」時,搜尋結果幾乎全部是:
每個 cart 承載 2,500 lbs / Steel King SK3600 每 cart 3,000 lb
每顆輪子額定 2,000 lb(四輪)
那些都是 capacity(能載多重),不是 tare weight(自己多重)。
製造商公布載重是因為那是客戶要的規格;自重對客戶沒意義,所以不公布。 要自重通常得直接跟廠商要規格 PDF,或用 §4 估。
同樣的混淆會出現在:堆高機(舉升能力 vs 車重)、輸送帶、AGV。 看到一個重量數字,先問「這是它能載的,還是它本身的」。
4. 查不到規格時:幾何 × 材料密度
這是最實用的路,而且可驗證、可覆盤。
質量 = 封閉網格的世界座標體積 × 材料密度
常用密度(kg/m³):
| 材料 | 密度 | 常見於 |
|---|---|---|
| 鋼 | 7850 | 貨架、板車、機構件 |
| 鋁 | 2700 | 輕型結構 |
| 木(松/合板) | 500~700 | 棧板 |
| 硬塑膠(HDPE) | 950 | 塑膠棧板、周轉箱 |
| 混凝土 | 2400 | 地面、配重 |
| 水 | 1000 | ← PhysX 的預設值,不要讓它留著 |
⚠ 體積要用世界座標算,而且要確認網格是封閉的 (不封閉的話有號體積無意義)。工具: 一支「幾何 × 材料密度」的估算腳本(未公開,做法見本節)。
⚠ 釐清「材料體積」還是「包絡體積」: - 焊接鋼構的網格若是實心桿件建模 → 體積 ≈ 材料體積 ✅ - 若碰撞近似是 convex hull → 體積 ≈ 包絡,會大幅高估
實例:板車網格體積 0.00938 m³ = 9.4 公升。 包絡大約 1.2 × 1.1 × 0.2 m ≈ 0.26 m³ —— 差 28 倍, 所以 0.00938 是材料體積,乘鋼密度得 73.6 kg 是合理的。
合理性檢核
估完一定要對真實世界做一次 sanity check:
- 板車 73.6 kg —— 四顆額定 1400~2000 lb 的輪子 + 焊接鋼構,量級對 ✅
- 若估出 9.4 kg → 比它載的棧板還輕,物理上說不通 ❌
「這個數字在真實世界說得通嗎」是最後一道關,不要跳過。
5. ⚠ 不要用 grep 判斷 usdc 有沒有某個屬性
usdc 是二進位。實測對 NVIDIA 資產 grep:
Mesh / points / material 抓得到
UsdGeom / xformOp 抓不到
部分有效 = 不能當判準。 一定要用 USD API 開。
同理,Usd.Stage.Open 需要 pxr,而 Isaac 容器裡核心 USD 只在 kit 執行期載入 ——
獨立 python 要自己設兩個環境變數:
USDLIB=$(ls -d /isaac-sim/extscache/omni.usd.libs-*/ | head -1)
export PYTHONPATH=${USDLIB}:$PYTHONPATH
export LD_LIBRARY_PATH=${USDLIB}bin:$LD_LIBRARY_PATH
/isaac-sim/kit/python/bin/python3 your_script.py
6. 建場域時的檢查清單
每加一個會被物理模擬的物件,逐項確認:
- [ ]
physics:mass或physics:density有授權(否則吃水的密度) - [ ] 質量數字對真實世界說得通(§4 的 sanity check)
- [ ] 慣量:多數情況讓 PhysX 從幾何算即可,但細長件要確認
- [ ] 碰撞近似:
convexHull會填滿凹處;薄件或有孔洞的要用sdf - [ ] 摩擦係數在物理範圍(μ > 1 代表咬合,一般 0.2~0.8)
- [ ]
metersPerUnit與父層縮放 —— 混用公分制資產時特別容易錯 - [ ] 驅動器的
maxForce是真實值(見下)
⚠ maxForce 也是物理參數。 位置控制配上近乎無限的力,
等於「無論多大阻力都推得動」—— 那不是機器,是運動學規定。
真實堆高機舉升 2.5 噸 ⇒ 約 25 kN;設 10⁶ N 是不物理的。
7. 這次的實例(可當範本)
| 物件 | 現況 | 應為 | 依據 |
|---|---|---|---|
| push-back 板車 | 9.4 kg(未授權 → 水密度) | ~73.6 kg | 網格體積 0.00938 m³ × 鋼 7850 |
| 木棧板 | 20 kg(authored) | 20~25 kg ✅ | 標準歐規/美規空棧板 |
叉齒 fork_liftA1 |
50 kg(authored) | 合理 ✅ | — |
z1/z2 驅動 maxForce |
10⁶ N | ~25 kN | 舉升 2.5 噸 |
| 叉齒↔棧板摩擦 | static 5.0 | 0.3~0.6 | μ>1 不物理 |
相關
-
參數查到之後怎麼填進 USD、貼在 prim 樹的哪一層,以及關節怎麼建:26 從規格表到會動的叉車(把本篇子頁的 VDI 2198 欄位逐欄對到 USD 屬性)
176.0 物理調參- 專案實例:內部調校專案的
docs/142(場景物理快照)、docs/144(保真度實驗設計)
子頁
- 用 VDI 2198 規格表取得堆高機的真實物理參數 —— 工業車輛(堆高機/前伸式/AGV)的規格是標準化且公開的。欄位編號對照表、 型錄沒列牽引力時的三條獨立推導、型號對不上時怎麼用功能等價去找。