Open25

強化学習のための物理シミュレーション情報収集

山田(ymd)山田(ymd)

PyBullet

調べれば調べるほど、様々な機能が実装されていると感じる老舗シミュレータ。
※ Python API の PyBullet は少しつらいし、コマンド発行方式に隠蔽されていて実装を探しにくい。

https://pybullet.org/
https://github.com/bulletphysics/bullet3

山田(ymd)山田(ymd)

MuJoCo

DeepMindの買収により無償化。
OSS化されるらしいが、現時点ではまだヘッダーのみの公開

https://mujoco.org/

https://github.com/deepmind/mujoco

https://deepmind.com/blog/announcements/mujoco

山田(ymd)山田(ymd)

Brax

2021年公開のGoogle製の新シミュレータ
JAXベースでGPU・TPUでの並列演算志向

https://github.com/google/brax

C. D. Freeman et al., "Brax -- A Differentiable Physics Engine for Large Scale Rigid Body Simulation", NeurIPS (2021)

https://nips.cc/Conferences/2021/DatasetsBenchmarks/AcceptedPapers
https://arxiv.org/abs/2106.13281

山田(ymd)山田(ymd)

ODEの積分には、Sympletic Euler を利用している。
(積分精度が少し心配)

名目上はクラスを分けており、差し替えることができそうな設計になっているが、 step() の実装をみるとRunge-Kuttaなどの他のアルゴリズムへの対応はそれなりの改修が必要そうに見える。

https://github.com/google/brax/blob/1baf25d5a713bd5dbc8588a004a5754723626bd0/brax/physics/system.py#L46
https://github.com/google/brax/blob/1baf25d5a713bd5dbc8588a004a5754723626bd0/brax/physics/system.py#L220

山田(ymd)山田(ymd)

https://github.com/google/brax/blob/main/docs/release-notes/v0.0.11.md

Version 0.0.11 で、シミュレーションのアルゴリズムを変更
インパルスベース → 位置ベース。

詳細はこちら(後で読む)
https://matthias-research.github.io/pages/publications/PBDBodies.pdf

告知ツイートに対する reply に速度面での10%程度の劣化が見られるとの反応あり。
https://twitter.com/viktor_m81/status/1504658577893429250

速度を犠牲に精度の向上ということだろうか。要調査

山田(ymd)山田(ymd)

勉強も兼ねてシミュレータ書いてみる。
※ まだ他人が利用できるレベルのコードではない。

https://gitlab.com/ymd_h/phyjax

山田(ymd)山田(ymd)

参考情報

力学の公式 (剛体の回転・拘束力など) の参考

https://physics-htfi.github.io/


Quaternionの計算
https://qiita.com/drken/items/0639cf34cce14e8d58a5


角速度のEulerの運動方程式を直接数値積分すると発散しやすいので、角運動量の保存・トルクによる変化を利用するほうが良い。

http://cedec.cesa.or.jp/2008/archives/file/pg07.pdf

(実装していて角運動量が保存しなくて困っていたので、先人の知見から裏取りができた。)

山田(ymd)山田(ymd)

実装するために参考にした JAX情報

@jax.jit は、外側の関数だけにつければ良いが、内側の関数につけていても変わらない
(@jax.jit された関数を @jax.jit した関数から呼び出せる。)
https://github.com/google/jax/discussions/5199#discussioncomment-219142


@jax.jit の中では boolean インデックスによる動的なサイズの配列は使えない。
(jax.whereTrue / False の両方の結果を計算してマージすることが代案。
mask も提案されているがドキュメントが見つからず詳細不明。)
https://github.com/google/jax/issues/2765


@jax.jit / @jax.vmap の入出力にカスタムのコンテナを利用する方法
(flatten / unflatten の操作を登録する)
https://jax.readthedocs.io/en/latest/jax-101/05.1-pytrees.html#custom-pytree-nodes

山田(ymd)山田(ymd)

Tiny Differentiable Simulator

Google製で、PyBulletの公式サイトで紹介されていた。
(PyBulletもGoogleが開発を主導している?)

https://github.com/google-research/tiny-differentiable-simulator

E. Heiden et al., "NeuralSim: Augmenting Differentiable Simulators with Neural Networks", ICRA (2021)
https://arxiv.org/abs/2011.04217

  • 微分可能
  • C++ ヘッダーのみライブラリで、Pythonバインディングがある
  • (CUDA以外の)依存ライブラリなし
    • (追記) zero dependencies と書いてあるが、third partyフォルダにコードが沢山
  • 強化学習・ロボティクス向け