RangeSensorのシミュレーションをすると使用メモリが増え続ける

sample/simplecontroller/AizuSpiderVisionSensors.cnoidなど,Rangesensorのシミュレーションを実行し続けると使用メモリが増え続け,PC自体がフリーズしてしまいます.

sampleプロジェクトをそのまま実行したのですが,これは想定された挙動なのでしょうか?
何か設定項目の見落としがあるのでしょうか?

よろしくお願いします

ご指摘ありがとうございます。

このサンプルでは、視覚センサについてシミュレーション中に発生する全てのセンシングデータをログに記録する設定となっていました。以下の条件を満たすことでそのような設定となります。

  • GLVisionSimulatorアイテムのプロパティ「ビジョンデータの記録」がtrue
  • シミュレータアイテムのプロパティ「デバイス状態の記録」がtrue
  • シミュレータアイテムのプロパティ「記録モード」が「全て」

AizuSpiderモデルはカメラ5つに加えてLRFも備えており、それらの画像や距離データを各センサのフレームレート分全て記録していくと、データ量も大きくなり、どんどんメモリを消費してしまいます。ログの場合記録は無圧縮で行われるということもあります。

通常はGLVisionSimulatorアイテムの「ビジョンデータの記録」をfalseとして、視覚センサの画像データや距離データ等は記録しないようにします。記録といっても、Choreonoidのプレイバック機能で後で再生できるというもので、これをオフにしても、シミュレーション中にデータがシミュレートされないというわけではありません。画像データ等は主にロボットのコントローラの方で使用するものなので、プレイバック用に記録していなくても特に問題はありません。

というわけで、

sampleプロジェクトをそのまま実行したのですが,これは想定された挙動なのでしょうか?

に関しては、プロジェクトの設定としては想定された挙動です。このサンプルでは作成した時にたまたまプレイバックをしたい事情があったので、このような設定になっていました。ただ、ご指摘のようにメモリの消費が激しく、実行し続けると落ちてしまうことになるので、この設定はやめておこうと思います。

本来メモリが足りなくなってきたらそこでシミュレーションを一旦停止するといった機能があればよいのですが、そこまでは作り込めておりません。この点は今後改善したいところですが、自身のプロセスで実際に使って良いメモリ量を知る方法とか、知ったところでいろいろとnewしているとどこでどうメモリを消費するか分からなかったりしますので、実現はなかなか難しい気がしています。(何かよい方法をご存知の方いらっしゃいましたら教えてください。)

このサンプルの修正方法としては、「ビジョンデータの記録」をfalseにすると、ロボットの動作軌道や他のセンサの状態などはログに保存されて、プレイバックもできますが、ビジョンデータだけプレイバックができなくなります。ただしこのサンプルではプレイバック用のデータを可視化することでLRFの計測結果を表示しており、その表示がされないことになってしまいます。

一方、「記録モード」を変更するという手もあります。これを「末尾」にすると、ログがリングバッファモードとなり、「時間長」に設定した分だけ記録されるようになります。例えば時間長に60を設定すると、最後の60秒(=1分)だけログが記録されるようになります。時間長をメモリ容量に応じて調整することで、ある程度ログも残しつつ、落ちるのを防ぐことができます。

それかログは必要ないがLRF等の可視化はしたいということでしたら、記録モードを「オフ」にしてもよいです。

このあたりのところは、マニュアルの以下の項目をご参照ください。
http://choreonoid.org/ja/manuals/latest/simulation/execution-and-playback.html#simulation-result-recording
http://choreonoid.org/ja/manuals/latest/simulation/vision-simulation.html#gl

丁寧な回答ありがとうございます。

マニュアルを参考に色々試してみます。