#概要
「TOPPERS/箱庭デモ ETロボコンシミュレータ」で,ETロボコン競技者向けのシミュレータを開発してきました.
ですが,現状のシミュレータ,乗り越えるべきチャレンジングな課題が2つあります.
- PCスペックが低いとシミュレーションが成り立たない.
- マイコンシミュレータ(athrill)のデバッグと同期してUnity側が停止してくれない.
この問題,箱庭WGで仕組み検討している時間同期機構を拡充することで一挙に解決できないかと模索していましたが,意外に簡単に解決できましたので,情報共有します.
なお,箱庭WGで検討中の時間同期の仕組みについては,6/12(金)に開催さ入れるTOPPERSカンファレンス2020の箱庭WGセッションでオンライン説明しますので,興味のある方はぜひご参加ください!
#この問題をどう見るか(what)
箱庭WGで開発してきた ETロボコン向けシミュレータ,Unityとマイコンシミュレータ時間同期機構,実は前提とする条件があります.
-
前提条件
-
マイコンシミュレータ(athrill)のシミュレーション時間速度はUnityのシミュレーション時間に比べて十分早いこと.
-
時間同期方法
-
この条件を前提として,athrillは,Unity側のシミュレーション時間を見て,自分のシミュレーション時間がUnityよりも進んでいることを検出した場合,athrillのシミュレーション時間の進む速度を遅くすることで,Unity側と時間同期をはかります.
こうやっておけば,athrill側で勝手に時間同期が行われるのですが,PCスペックが低い場合やathrill上で動作するアプリケーションの処理負荷が高い場合は,前提条件が崩れてしまい,時間同期できなくなってしまいます.
自分は,マイコンシミュレータ開発者だったので,athrill側の同期機構ばかりに注力していたのが問題の根源でした.前提をとっぱらって,Unity側にも時間同期の仕組みを入れれば,いろんな問題が一挙に解決するだろうと思い至ったわけです.
#どうやって解決に導くべきか(how)
やりたいこと(what)は以下です.
- PCスペックが低いとシミュレーションが成り立たない問題を解決したい.
- マイコンシミュレータ(athrill)のデバッグと同期してUnity側が停止しさせる.
その解決方法は,先述の通り,Unity側にも時間同期機構を入れることで一挙に上記内容の対応ができるようになるはずです.
1 については,athrillのシミュレーション時間をUnity側が見て,自分のシミュレーション時間が進んでいる場合は,そのシミュレーション時間を止めちゃうことで解決できそうです.
2 についても,1の対応が出来てしまえば,athrill側がデバッグ状態に入れば,athrillのシミュレーション時間の進み幅は一気に遅くなる(人が操作する速度)になりますので,こちらも解決できそうです.
というわけで,Unity側のシミュレーション時間を制御する方法を調べてみることにしました.
#Unityのシミュレーション時間
Unityのシミュレーション時間に関しては,Unity公式サイトや先駆者の方の記事が参考になるかともいますので,リンク集のみを以下にまとめます.
#対応方法
そういうわけで,Unity側の物理シミュレーション時間は,以下をおさえておけば自分(プログラマ)が制御できることが分かったわけです.
- Physics.autoSimulation を false にする
- 物理シミュレーション時間は,Physics.Simulate(Time.fixedDeltaTime)で進める
上記を抑えた上での,Unity側のプログラムの変更ポイントは以下でした.
① Unityのシミュレーション時間とathrillのシミュレーション時間との差分時間の許容最大時間を定義する
public long maxDiffTime = 10000; /* usec */
②差分時間が,許容時間内である場合のみ,物理シミュレーション時間を進める
if (this.diff_time > -this.maxDiffTime)
{
this.unity_simtime += this.delta_time;
:
(ロボット制御処理)
:
Physics.Simulate(Time.fixedDeltaTime);
}
上記対応した Unityパッケージを以下で公開しました.
#デモ
とりあえず,TOPPERS箱庭版ETロボコンシミュレータをデバッグする風景をデモしてみます.
操作内容としては,以下になります.
- デバッグ状態で,Unityとathrillを停止状態にする.
- athrillのシミュレーション時間を 10000クロック進めて止める
- しばらく進めて,強制デバッグモードに遷移させる(qコマンド押下)
- cpu コマンド,CPUレジスタ状態を確認する.
- シミュレーションを継続する.
これで,やりたかったこと(what)は一通りできたと思えたので,今日はこれまで.