Unity を検索

よりリアルなロボットシミュレーションへ。Unity 2021.2 ベータ版での物理演算の新機能

2021年8月20日 カテゴリ: テクノロジー | 9 分 で読めます
Simulation of a blue robotics machine on a green graph background
Simulation of a blue robotics machine on a green graph background

Unity 2021.2 ベータ版では、物理演算機能のユーザビリティが改善され、新しいユースケースを実現可能にするとともに、ロボット工学分野でのオーサリングのしやすさと、デバッグのしやすさを実現しています

アーティキュレーションボディの改良

ArticulationBody コンポーネントは、ロボットハンド、マニピュレーター、モバイルロボットなどに不可欠なキネマティックチェーンを高精度にシミュレーションできることから、ロボットシミュレーションの中核となっているコンポーネントです。ユーザーからのフィードバックに耳を傾け、パフォーマンスとユーザビリティを向上させるために複数の変更を行いました。

ArticulationBody コンポーネントのプロパティが見やすく整理されました。質量に関するパラメーターが 1 つのビジュアルブロックに表示されるようになり、次にアンカーに関するパラメーター、そしてドライブに関するパラメーターが表示されるようになりました。これらの変更は、Unity 2021.1 と 2020.3 にバックポートされています。

Image showing the articulation body dialog box with a grey background and white text.

ArticulationBody エディターでは、通常の反復ジョイントと同じジョイントツールが使えるようになりました。これにより、エディター全体で一貫した体験が得られます。その上、すべてのジョイントの制限とアンカーを視覚的に編集することも可能です。

Gif of the Prismatic Joint movement shown with a silver and blue robotic arm simulation

ジョイントツールは、ArticulationBody のすべてのジョイントタイプをサポートしています。これは、以前は利用できなかった Prismatic Joint の編集ができるように拡張されたためです。こちらのフォーラムスレッドでより詳細な情報を探したり、フィードバックを提供したりすることができます。

Gif of collision detection mode demonstrated with a blue and silver robotic arm simulation

ArticulationBody に新しい設定が追加され、衝突検出モードを選択できるようになりました。Rigidbody と同等の連続的衝突検出モードがすべてサポートされています。特定のユースケースでは必要な機能と判断されたため、Unity 2021.1 および 2020.3 にもバックポートされました。例えば、ヒューマノイドキャラクターの歩行を制御する機械学習モデルを学習させるためには、足の連続的な衝突検知を可能にする必要があります。そうしないと、モデルは足が地面に重なった部分で発生する、侵入してきたボディを押し戻すインパルスを利用して前進する方法を学習してしまい、正常に計算した場合よりはるかに早く前進したり、場合によっては飛び上がったりしてしまいます。

ArticulationBody.AddForce のバリエーションが Rigidbody.AddForce のものに合わせて追加されました。力、加速度、インパルスを直接加えることができます。これにより、Rigidbody から ArticulationBody への既存のコードの移行が容易になります。 

境界条件や特殊なケースを明示することで、ドキュメントのわかりやすさを向上させました。今回のリリースでは、ArticulationBody コンポーネントの新しいページを用意しました。 

ユーザーからのフィードバックに基づき、ArticulationBody コンポーネントのすべての C# 向けプロパティの測定単位もドキュメントに記載しました。例として、mass をご覧ください。

エディターの改良

一般的な物理演算周りのパイプラインをより使いやすくし、様々な利用形態に対応できるよう、より大きな柔軟性を持たせるためにリソースを投入しています。クリエイターがより多くの機能を使えるようになって自分の分野をより深く理解し、そうすることによってより正確な結果が得られるようにシミュレーションを設定できるようになったことで、より高度なシミュレーションが可能になったと考えています。

また、物理デバッガーでは、Isolation モードと Context モードの両方でプレハブが適切にサポートされるようになりました。これにより、シーンの他の部分を表示せずにプレハブのプロパティのみを観察することができ、分割統治法に基づく設計原理をより広い範囲に適用できるようになります。

Gif of the collision detection system with an objects simulation

物理演算のレイヤーは、衝突検出システムのパフォーマンスを最適化するために不可欠なツールです。よくあることですが、特にレイヤー数の多い大規模なシーンでは、最初はすべての衝突検出を無効にしておき、その後で必要なものだけを有効にするとよいでしょう。この使い方をパターン化できるように、物理演算の設定ですべてのレイヤー間の衝突検出をトグルする新しいボタンが追加されました。これは、多くのレイヤーが存在する大規模なプロジェクトで、一部のレイヤーにインタラクションを限定することでパフォーマンスを向上させることができる場合に便利です。

Matrix of the collision layers that have been added to the physics profiler with a grey background and white text

また、Physics プロファイラーに追加のメトリクスが追加されました。より多くのグラフが表示されるようになり、テキスト領域には現在のシミュレーションに関するデータがより多く表示されるようになりました。新たに追加されたのは、物理クエリの総数、アーティキュレーションボディの数、そして最後のフレームで同期されたトランスフォームの数です。

Profiler Modules dialog box that includes metrics of a particular project

また、カスタムのプロファイラーモジュールを作成し、特定のプロジェクトに必要なメトリクスのみを含めることもできます。

Image of Physics detailed dialog box that shows the memory usage metric

最後に、メモリ使用量もメトリクスとして利用できるようになりました。

メインスレッドからの物理クエリのチェーン

物理演算のバッチクエリは、物理演算クエリ(レイキャストなど)のパフォーマンスを向上させるための方法で、通常はメインスレッドのみで実行するのに対し、利用可能なすべてのコアで実行するようになっています。

パフォーマンスを最大限に向上させるためには、バッチ処理されたクエリの結果に依存するコードを C# ジョブそのものにしておくのが理想的です。しかし、コライダーへのヒットが Unity コンポーネント(RaycastHit.collider)として報告されるということがこれを妨げていました。どの Unity コンポーネントもメインスレッドからは利用できないため、バッチ処理されたクエリの採用にはかなり制限がありました。

これに対応するため、ヒットしたコライダーのインスタンス ID を公開するようにしました。インスタンス ID はメインスレッド以外でも自由に使用できるので、クエリジョブをチェーンさせても問題なくなりました。

パッチ摩擦の改善

パッチ摩擦モードは、Unity のデフォルトの摩擦シミュレーションモードです。パフォーマンスを高めるためにシミュレーションの精度をある程度犠牲にしていますが、限られた計算予算の中で妥当な結果が得られるように調整することは可能です。

物理演算の設定で、改良されたパッチ摩擦モードが使えるようになりました。1 つの接触ペアに 2 つ以上の摩擦のアンカーが発生した場合、そこで発生する摩擦力が解析モデルで予測されるよりも最大で 2 倍強くなるという問題を解決します。

たとえば下に示した画像では、動摩擦について異なる計算をしているキューブが平面上を滑っていきます。赤いキューブは、理論的に予測される最終的な位置を示しています。青いキューブは通常のパッチ摩擦を使用しており、目標までのおよそ半分の距離を滑って止まります。緑色のキューブは、改良された新しいパッチ摩擦を使用しており、予測された値にかなり近い値になっています。

Gif showing the improved patch friction mode with red green and blue cubes

接触の修正

新しい接触修正 API が利用可能になりました。こちらのフォーラムのスレッドでフィードバックを集めています。これにより、接触に対する物理エンジンの反応をカスタマイズすることができます。どの接触ペアについても、接触点の変更、ソルバーが適用するインパルスの制限、ターゲットの速度の微調整などが可能です。他にも、任意のコライダーに穴を開けたり、粘着性のある接触点を作成したり、物理演算で動くさまざまなベルトコンベアーを作成したりと、多様な使い方ができます。下に示した例で、左側の球体は平面との接触点を無視しているため、平面を突き抜けて落下します(領域によって反応を切り替えることもできます)。右側では、キューブが 2 つの傾斜した面で跳ね返っていますが、回転はしていません。これは接触した時の反応で、回転しないようにカスタマイズしたためです。

Gif showing the contact modification API with a circle and cube

シミュレーションに命を吹き込む

ここまで紹介した改善点により、ユーザーは Unity を使って、よりリアルな結果を与えるシミュレーションを行うことができます。これらの改善点の多くは、コミュニティからの提案やフィードバックに基づいて行われました。皆さんもぜひ、議論に参加してください。Unity でロボット工学を始めたい方は、まず Unity Robotics Hub にあるサンプルやデモをチェックされることをおすすめします。

2021年8月20日 カテゴリ: テクノロジー | 9 分 で読めます