強化学習のための物理シミュレーション情報収集
PyBullet
調べれば調べるほど、様々な機能が実装されていると感じる老舗シミュレータ。
※ Python API の PyBullet は少しつらいし、コマンド発行方式に隠蔽されていて実装を探しにくい。
MuJoCo
DeepMindの買収により無償化。
OSS化されるらしいが、現時点ではまだヘッダーのみの公開
Brax
2021年公開のGoogle製の新シミュレータ
JAXベースでGPU・TPUでの並列演算志向
C. D. Freeman et al., "Brax -- A Differentiable Physics Engine for Large Scale Rigid Body Simulation", NeurIPS (2021)
書いた記事
ブログに書いた非公式チュートリアル(仮)
Brax Composer
experimental だけど、部品を組み合わせて複雑な Env
を組み上げる仕組み。期待。
issue
新しいこともあり、いくつか気になる issue がある。
衝突周りの挙動が怪しい。
精緻なシミュレーションが必要な場合にはまだ向かないかも。
ODEの積分には、Sympletic Euler を利用している。
(積分精度が少し心配)
名目上はクラスを分けており、差し替えることができそうな設計になっているが、 step()
の実装をみるとRunge-Kuttaなどの他のアルゴリズムへの対応はそれなりの改修が必要そうに見える。
Version 0.0.11 で、シミュレーションのアルゴリズムを変更
インパルスベース → 位置ベース。
詳細はこちら(後で読む)
告知ツイートに対する reply に速度面での10%程度の劣化が見られるとの反応あり。
速度を犠牲に精度の向上ということだろうか。要調査
以下の関数がPosition Baseなロジックとして追加された部分だと思われる。
position_apply()
_position_contact()
コメントから察するに、球対称な慣性にしか対応していない?
# only spherical inertias for now
SPAIEN
個人的にはこの中では一番知らない。
教えてくれてた友人の話では、チュートリアルが良いらしい。
勉強も兼ねてシミュレータ書いてみる。
※ まだ他人が利用できるレベルのコードではない。
参考情報
力学の公式 (剛体の回転・拘束力など) の参考
Quaternionの計算
角速度のEulerの運動方程式を直接数値積分すると発散しやすいので、角運動量の保存・トルクによる変化を利用するほうが良い。
(実装していて角運動量が保存しなくて困っていたので、先人の知見から裏取りができた。)
実装するために参考にした JAX情報
@jax.jit
は、外側の関数だけにつければ良いが、内側の関数につけていても変わらない
(@jax.jit
された関数を @jax.jit
した関数から呼び出せる。)
@jax.jit
の中では boolean インデックスによる動的なサイズの配列は使えない。
(jax.where
で True
/ False
の両方の結果を計算してマージすることが代案。
mask
も提案されているがドキュメントが見つからず詳細不明。)
@jax.jit
/ @jax.vmap
の入出力にカスタムのコンテナを利用する方法
(flatten / unflatten の操作を登録する)
Tiny Differentiable Simulator
Google製で、PyBulletの公式サイトで紹介されていた。
(PyBulletもGoogleが開発を主導している?)
E. Heiden et al., "NeuralSim: Augmenting Differentiable Simulators with Neural Networks", ICRA (2021)
- 微分可能
- C++ ヘッダーのみライブラリで、Pythonバインディングがある
- (CUDA以外の)依存ライブラリなし
- (追記) zero dependencies と書いてあるが、third partyフォルダにコードが沢山
- 強化学習・ロボティクス向け
ODEの積分には、semi-implicit Euler を採用