他プロセスから操作可能なUnity物理シミュレーション環境作った

はじめに

ディープラーニングで物体検出など使えるようになってくるとシミュレーション環境で動かしたいと思うのだが、よさそうなSWが見つからなかった。それなら作ればいいじゃないかということで作った。

実際に動いている画面は以下の通り。

youtu.be

制御画面は以下のような感じ。サンプルでは白線を検出して、白線に沿って走行する。とりあえず他プロセスにリアルタイムで映像が取り込めるというところまでで、ディープラーニングは動かしていない(実装はしてある)。

youtu.be

ソースコードは以下。

github.com

個人的に物理エンジンなんかは敷居が高いものと考えていたが、使ってみると案外サクサクできた。Unity触ったことない、なんて人も30分もあれば使えるようになっているのでぜひ使ってみてほしい。「Unity簡単やん!」となって世界が広がる、はず。

アーキテクチャ

ざっくりとしたアーキテクチャは以下の通り。シミュレータから位置や速度情報やカメラの映像を受け取り、コントローラーが、受けとった情報からステアリング角度やアクセルを計算して送信する。シミュレータはそれを受けて操作をし、また情報を送信する。プロトコルはソケット通信とMMAPを使用しており、低遅延でのシミュレーションおよび制御ができる。

追記:ソケット通信で映像を転送するスクリプト追加しました。

構成要素としては以下の通り。

  • Controller:画像処理等を行って操作量を決定する。
  • Sumilator:シミュレーション環境
    • Agent:エージェント。実際に動作を行うもの。車など。
    • Environment:環境。エージェントが動作する空間。街など。

はじめの方は物理シミュレーション(Unity)側にPython環境を組み込むことを考えていたが、2つの環境を分離しソケット通信やMMAPといった一般的なプロセス間通信で接続することで、双方の環境の管理が楽にできるようになった。また、Python側もソケット通信やMMAPが使えればいいので、PythonでなくてもC++Javaなどでも実装可能となっている。

開発記録とか(今後も更新予定)

Unity開発

実験記録

方針

基本的にはエージェントのUnity パッケージとコントローラのサンプルコードのセットで作っていく。

最後に

もし使っていただけて、感想、要望、バグ報告、気軽にいただけると嬉しいです。環境に関しては無数に考えられるので、いろんな環境でテストできるようにするために環境共有してくれると嬉しいです。アセットストアで販売なんかもOK。