見出し画像

Isaac Sim Physics 入門

「Isaac Sim」の「Physics」についてまとめました。

・IsaacSim 5.1


1. Isaac Sim Physics

ロボットシミュレーションを触り始めると、避けて通れないのが「Physics」(物理)です。「Isaac Sim」では、3Dモデルをステージ上に配置しただけでは、「落ちる」「ぶつかる」「回転する」といった物理的な挙動は起きません。そうした挙動をシミュレーション上で成立させるには、各オブジェクトに「Rigid Body」「Collider」「Joint」などの物理設定を与える必要があります。はじめてそこで、見た目だけではない「物理世界」として振る舞うようになります。

「Isaac Sim」の物理シミュレーションは、内部ではおおむね次の流れで動いています。

(1) USD に記述された物理属性を読み取る
(2) それに対応する物理オブジェクトが PhysX 側に生成される
(3) シミュレーションの各タイムステップごとに PhysX が状態を更新する
(4) 更新結果がが USD に書き戻される

2. シミュレーション時間 と 実時間

「Isaac Sim」を使うとき、まず区別しておきたいのが「シミュレーション時間」と「実時間」です。

・シミュレーション時間 : 仮想世界で何秒進んだか
・実時間 : 現実のPCで何秒経ったか

2-1. シミュレーション時間

シミュレータ内部で進む仮想世界の時間です。物理エンジンは設定された dt ごとに状態を更新し、そのたびにシミュレーション時間が加算されます。これはロボット制御の周期や、センサデータのタイムスタンプをそろえる基準になります。重要なのは、この時間が必ずしもPCの時計と一致しないことです。

2-2. 実時間

PCの時計で流れる現実の時間です。こちらは、実際に計算や描画にどれだけ時間がかかったかを表します。たとえば現実で1秒経過しても、計算負荷が軽ければシミュレーション内では1秒以上進められることがありますし、逆に負荷が重ければ1秒未満しか進まないこともあります。「Isaac Sim」では、レンダリング負荷を下げたりフレームレート制限を外したりすることで、実時間より速くシミュレーションを進める加速実行も可能です。

3. レンダリングフレームレート と タイムステップ

次に区別しておきたいのは、「レンダリングフレームレート」と「タイムステップ」です。どちらもシミュレーションに関するの進行に関する設定です。

・レンダリングフレームレート : 画面表示の更新頻度
・タイムステップ : 物理世界の更新粒度

3-1. レンダリングフレームレート

「レンダリングフレームレート」は、1秒間に何回画面を描き直すかを表す値です。いわゆる FPS であり、画面表示の滑らかさやカメラ画像の更新頻度に関係します。「Isaac Sim」では、ステージの「TimeCodes per second」などの設定を通じて、レンダリング側の時間の進み方を扱います。

「レンダリングフレームレート」は、「Stage」の「Layer Metadata」で調整できます。

(1) 「Layer」タブで「Root Layer」を選択
(2) 「Properties」パネルで 「Time Codes Per Second」を設定。

3-2. タイムステップ

タイムステップ」(1秒あたりのステップ数)は、1回の物理計算でシミュレーション時間をどれだけ進めるかを表します。たとえば dt = 1/60 なら、物理計算を1回行うたびにシミュレーション時間は約 0.0167 秒進みます。dt を小さくすると、より細かい刻みで物理を計算できるため精度は上がりやすくなりますが、そのぶん計算負荷は増えます。逆に dt を大きくすると計算は軽くなる一方で、物理挙動の精度は落ちやすくなります。

「タイムステップ」は、「Physics Scene」の「Time Steps Per Second」 で設定します。「Stage」内に「Physics Scene」が存在しない場合、デフォルト値(60) が使用されます。

(1) 「Create → Physics → Physics Scene」を選択。
(2) 「Stage」タブで「Physics Scene」を選択。
(3) 「Properties」パネルで 「Time Steps Per Second」 を設定。

4. Rigid Body

4-1. Rigid Body

Physics の最小単位として重要なのが「Rigid Body」(剛体) です。「Rigid Body」を追加すると、その要素は重力や外力の影響を受けるようになります。

「剛体」とは、力を受けても形が変わらないものとして扱う物体です。 物理シミュレーションでは、現実の物体のような「たわみ」や「変形」を細かく計算すると非常に重くなるため、多くの物体をまず剛体として扱います。

4-2. Rigid Body の使用例

「Rigid Body」の使用例は、次のとおりです。

・Xformの追加
「Xform」とは、位置・回転・拡大縮小といった変換情報を持つ Prim(USDの基本オブジェクト)のことです。Isaac Sim や USD では、まず Xform を親として置き、その下にメッシュや物理設定をぶら下げる形がよく使われます。つまり Xform は、オブジェクトをシーン内のどこに置き、どう向け、どういう階層で管理するかを表すための入れ物になります。

(1) メニュー「Create → Physics → Ground Plane」を選択。

(2) メニュー「Create → Xform」でXformを追加。

(3) XformのTranslateに[0,0,10]を指定。

(4) 「Stage」で「Xform」を選択し、「Property」の「Add → Physics → Rigid Body」を選択。

・Cubeの追加

(1) メニュー「Create → Mesh → Cube」でCubeを追加し、「Xform」下にドラッグ。

(2) 「Cube」のTranslateに[0,0,0.5]を指定。

・実行
画面左側にあるPlayボタン(▶)をクリックします。
キューブは地面を突き抜けて落下します。

5. Collider

5-1. Collider

「Rigid Body」を付けただけでは、床に止まりません。落下はするのに、そのまま地面をすり抜けます。なぜなら、衝突判定を有効にする「Collider」がまだ付いていないからです。

つまり、

・Rigid Body : 動くための設定
・Collider : 衝突判定の設定

です。

5-2. Collider の使用例

「Collider」の使用例は、次のとおりです。

・Colliderの追加

(1) Cubeを選択し、「Property」で「Add → Physics → Collider」を選択。

(2) メニュー「Create → Mesh → Cube」でCubeを追加し、Translateに[0,0,3]、Scaleに [2,2,0.01] を指定。

(3) 平らなCubeを選択し、「Property」で「Add → Physics → Collider」を選択。

(4) 実行
Cubeが落下して平らなCubeと衝突します。

・平らなCubeの高さの変更

(1) Xformを選択し、Translateに[0,0,80] を指定。

(2) 実行。
Cubeが落下しますが平らなCubeを突き抜けます。

この問題は次の「CCD」で解決します。

6. CCD

6-1. CCD

Physics で実務的にかなり重要なのが「CCD(Continuous Collision Detection) です。離散時間のシミュレーションでは、物体が速すぎると、あるステップでは足場の上、次のステップでは足場の下、という状態になり、衝突を取り逃すことがあります。いわゆる“すり抜け”です。

この問題への代表的な対処が「CCD」です。
「Isaac Sim」では、Physics Scene 側と Rigid Body 側の両方で CCD を有効にすることで、移動区間を掃引して衝突検出できます。

6-1. CCD の使用例

・CCDの有効化

(1) メニュー「Create → Physics → Physics Scene」でPhysics Sceneを追加。

(2) Physics Sceneを選択し、「Physics → Scene」の「Enable CCD」をON。

(3) Xformを選択し、「Physics → Rigid Body」の「Enable CCD」をON。

(4) 実行。
Cubeが落下して平らなCubeと衝突します。

7. Approximation

7-1. Approximation

Isaac Sim における Approximation は、見た目のメッシュをそのまま衝突判定に使うのではなく、どの形で近似してColliderを作るかを指定する設定です。

Torucsにデフォルトの Collider を付けると、穴があるように見えても Convex Hull として扱われるため、穴に落ちません。Convex Hull は処理効率のよい近似ですが、厳密ではありません。

より形状に近づけたいときは「Convex Decomposition」が使えます。複数の凸形状で近似する方式で、精度は上がりますがコストも増えます。

・Convex Hull : Mesh全体を1つの凸包で包む方式
・Convex Decomposition : Meshを複数の凸形状に分解して近似する方式

実運用では、まず次の順で考えるのが無難です。

・まずは単純な Collider で動かす
・問題が出た箇所だけ精度を上げる
・精度を上げすぎて全体を重くしない

7-2. Approximation の使用例

・Convex Hull

(1) Xformを選択し、Translateに[0,0,10] を指定。

(2) 平らなCubeの削除。

(3) メニュー「Create → Mesh → Torus」でTorusを追加し、Transform = [0, 0, 3.0]、Scale = [5.0, 5.0, 5.0] を指定。

(4) Torusを選択し、「Property」の「Add → Physics → Rigid Body With Colliders Preset」を選択。

(5) 実行。
Cubeはトーラスの穴に落下しません。

・Convex Decomposition

(1) Torusを選択し、「Property」の「Approximation」に「Convex Decomposition」を指定。

(2) 実行。
Cubeはトーラスの穴に落下します。

8. Physics Material

8-1. Physics Material

衝突は「めり込まない」だけではありません。「反発」(restitution) と「摩擦」(friction) によって、跳ね返り方や滑り方が変わります。これらのパラメータは「Physics Material」で設定します。

つまり、落ちる・ぶつかるだけでなく、

・よく滑る床
・滑りにくいタイヤ接地
・よく跳ねる物体
・ほとんど跳ねない部品

といった違いを表現したい場合は、「Rigid Body」より「Physics Material」の調整 が効いてきます。

8-2. Physics Material の使用例

(1) 「5. Collider」の平らなCubeの状態に戻す。

(2) メニュー「Create → Physics → Physics Material」を選択し、「Rigid Body Material」をONにして「OK」をクリック。

・Rigid Body Material
Rigid Bodyに適用する Physics Material で、摩擦や反発係数などの接触特性を設定

・Deformable Body Material (deprecated)
変形する物体に適用する Material ですが、現在は非推奨の設定

・PBD Particle Material
粒子ベースで表現する流体や布などに適用する Physics Material

(3) PhysicsMaterialを選択し、「Restitution = 1.0」を指定。

・Static Friction
物体が静止している状態から滑り出そうとするときの摩擦の強さ

・Dynamic Friction
物体がすでに滑っている途中で受ける摩擦の強さ

・Restitution
衝突したときにどの程度はね返るかを表す値

(4) 平らなCubeを選択し、「Physics materials on selected models」で「/World/PhysicsMaterial」を指定。

(5) 実行。
Cubeがバウンドします。

9. Joint

9-1. Joint

「Isaac Sim」の「Joint」は、2つの Rigid Bodyの間に「どの方向に、どれだけ動けるか」という拘束を与えるための機能です。ロボットの腕や車輪のように、複数のRigid Bodyを回転・直動でつなぐときに使います。

9-2. Joint の使用例

・Jointの追加

(1) 「Xform - Cube」のセットを2つ配置。

(2) StageでCtrlで2つのRigid Body (今回はXform)を選択してから右クリック「Create → Physics → Joints → Revolute Joint」を選択。
「Revolute Joint」が生成され、「Property」には Body 0 と Body 1 が設定されます。ここで大事なのは、UI で「Joint」を作ると、「Joint Frame」の位置は「2番目に選択した Rigid Body」のポーズに合わせて置かれることです。つまり、「Joint」をどこに置きたいかを意識して、2番目に選ぶ「Rigid Body」を決める必要があります。

(3) 「Revolute Joint」を選択し、「Property」で「Axis」と「Limits」を確認。

・Axis : どの軸まわりに回転するか
・Lower Limit / Upper Limit : 上限と下限(度)

(4) 実行
2つのCubeは距離を一定に保ちます。

・Driveの追加
Joint を自動で動かしたい場合は、「Drive」を追加します。

(1) 「Revolute Joint」を選択し、「Property」で「Add → Physics → Angular Drive」を選択。

・Angular Drive : 回転関節
・Linear Drive : 直動関節

(2) 「Revolute Joint」を選択し、「Property」の「Drive」を以下のように設定。

(3) 実行。
200度回転します。

・Target Position : 200.0
・Target Velocity : 0.0
・Damping : 100
・Stiffness : 1000

・Max Force
Drive が関節を動かすために出せる力またはトルクの上限

・Target Position
Position Drive のときに、その Joint を最終的に到達させたい目標角度または目標位置

・Target Velocity
Velocity Drive のときに、その Joint に出したい目標の回転速度または移動速度

・Damping
速度のずれに応じて効くゲインで、動きをなめらかにしつつ振動やオーバーシュートを抑える役割がある

・Stiffness:位置のずれに応じて効くゲインで、関節を目標位置へ強く引き戻す“ばね”のような役割がある

「Joint」は 2つの Rigid Body を選んで作り、軸・可動範囲・Drive を設定して動かす と覚えると使いやすいです。

関連



いいなと思ったら応援しよう!