ログの記録と再生

概要

Choreonoidでは、シミュレーション結果を物理計算の1ステップ(フレーム)ごとに記録することができ、記録した結果は1ステップ単位の分解能で任意の時刻の状態を再生することができます。

記録の方法には、大きく分けて以下の2つがあります。

  1. メモリ上への記録

シミュレータアイテムが標準で備える記録機能です。各ボディモデルの挙動が「ボディモーションアイテム」に記録されます。記録した結果はそのまま再生・解析に利用でき、必要に応じて個別にファイルへ保存することもできます。

  1. 外部ファイルへの記録(ワールドログファイル)

「ワールドログファイルアイテム」を用いて、シミュレーションの進行中に外部ファイルへログを逐次記録する機能です。シミュレーションが途中でクラッシュした場合でもそれまでのログが残り、プロジェクトを終了・再起動した後でもログを再生できます。

本ページではこれらの記録機能と、記録した結果の再生方法について解説します。

メモリ上への記録

記録モード

メモリ上への記録は、シミュレータアイテムの「記録モード」プロパティで設定します。モードは以下から選択します。

  • 全て

シミュレーション開始時から終了時までの全ての期間の結果を記録します。

  • 末尾

シミュレーション終了前の一定期間を記録します。その期間を超える古い部分は記録が破棄されます。期間は「時間長」プロパティで設定します。

  • オフ

記録を行いません。シミュレーション結果を確認できるのは、シミュレーション実行中のみとなります。この場合でも、シミュレーション結果は随時モデルに反映されますので、シミュレーションの経過を確認することは可能です。ただし、結果を後で再生したり解析したりすることはできなくなります。

シミュレーション結果の記録にはそのためのメモリ領域が必要です。シミュレーション対象の物体が増えたり、シミュレーション時間が長くなってくると、その分使用するメモリ量も増えていきます。シミュレーション結果の記録で使用するメモリが空き容量を超えた場合、シミュレーションの途中でChoreonoidが落ちてしまう可能性がありますので、注意が必要です。

そのような事態を避けるためのモードとして、「末尾」が用意されています。このモードでは、指定した時間長を超えた場合、時間的に古い部分から記録を破棄することで、使用するメモリ量を一定範囲内に抑えます。システムのメモリ容量を考慮した時間長を設定しておけば、長時間シミュレーションする場合でも、メモリ不足でシステムが落ちることがなくなります。このような安全性を考慮して、デフォルトのモードは「末尾」となっています。

一方で「全て」のモードでは、シミュレーション開始時からの全ての期間について、結果の再生や解析を行うことができます。記録に必要なメモリ量が問題とならない場合は、こちらのモードを使用するとよいでしょう。

注釈

長時間のシミュレーションの全期間を記録したい場合は、本ページで後述するワールドログファイルを用いて、結果を随時ファイルに書き出して記録することも可能です。この場合、メモリ容量が十分でなくても、ファイルシステムに十分な空き領域があればOKです。

記録内容

記録は物理計算の1ステップごとに行われます。すなわち、記録データのフレームレートはシミュレーションのタイムステップに対応するフレームレートと同一です。各フレームには以下の内容が記録されます。

  • リンクの位置姿勢

各リンクの位置と姿勢です。「全リンク位置の記録」プロパティがfalseの場合はルートリンクの位置姿勢のみが記録され、他のリンクの位置姿勢は再生時に関節変位からの順運動学計算で再現されます。

  • 関節変位

各関節の変位(関節角度・並進量)です。

  • デバイス状態

センサやライト等の各デバイスの状態です。「デバイス状態の記録」プロパティが有効なときに記録されます(次項参照)。

また「干渉データの記録」プロパティを有効にすると、シミュレーション中に検出された物体間の干渉データも記録されます。こちらはワールドアイテムの子アイテムの位置に「シミュレータアイテム名-collisions」という名前のアイテムとして記録され、再生時に干渉箇所の表示に利用できます。

これらのプロパティについては シミュレータアイテム共通のプロパティ も参照してください。

デバイス状態の記録

シミュレーション結果として記録される要素の基本となるのは、モデルの物理的な動きを再生するのに必要な動作軌道データ(リンク位置姿勢・関節変位)です。これに加えて、「デバイス状態の記録」プロパティをtrue(デフォルト)としておくと、デバイスの状態の変化についても記録されます。これにより、センサの状態変化や、デバイスのオン・オフ等の操作内容も再生することが可能となります。ただしその分記録に必要なメモリ量や処理のオーバーヘッドも増えますので、必要に応じて切り替えて使うようにしてください。

ボディモーションアイテム

記録が有効な場合、シミュレーションを開始すると、仮想世界中の各ボディモデルに対して記録先となる「ボディモーションアイテム(BodyMotionItem)」が生成されます。このアイテムは「シミュレータアイテム名-ボディ名」という名前で、対応するボディアイテムの子アイテムとして配置されます(コントローラアイテムを使用している場合はコントローラアイテムの下に配置されます)。

例えば シミュレーションプロジェクトの作成 で作成したプロジェクトでシミュレーションを行うと、アイテムツリーは以下のようになります。

[ ] - World
[/]   + box1
[ ]     + AISTSimulator-box1
[/]   + Floor
[ ]   + AISTSimulator

ここで "AISTSimulator-box1" がbox1モデルの挙動を記録したボディモーションアイテムです。上述のリンク位置姿勢・関節変位・デバイス状態の時系列データがこのアイテムに格納されます。

同じシミュレータアイテムでシミュレーションを再度実行すると、既存のボディモーションアイテムに上書きで記録されます。なお、このアイテムは一時アイテムという扱いになっており、プロジェクト保存の対象にはなりません。記録結果を残したい場合は、次に述べるファイル保存を行ってください。

ボディモーションアイテムのファイル保存

ボディモーションアイテムは、個別にファイルへ保存することができます。対象のアイテムを選択した状態で、メインメニューの「ファイル」-「名前を付けて選択アイテムを保存」を実行し、ファイル形式として「ボディモーション」を選択して保存します。ファイルは標準ボディモーションファイル形式(拡張子 .seq)のテキストファイルとなります。この形式の詳細は 標準ボディモーションファイル形式 で解説しています。

保存したファイルは、メインメニューの「ファイル」-「読み込み」-「ボディモーション」で読み込むことができます。読み込んだアイテムを対象のボディアイテムの子アイテムとして配置すれば、記録時と同様に再生することができます。

注釈

ファイルに保存されるのはリンク位置姿勢と関節変位(および追加の軌道データ)で、デバイス状態はファイル保存の対象外となります。

再生の方法

記録した結果の再生は、以下の手順で行います。

  1. 再生対象のアイテムをアイテムツリービュー上で選択する(またはチェックを入れる)

  2. タイムバーを操作する

タイムバーの再生ボタンを押すとアニメーションとして再生され、タイムスライダや時刻入力を操作すると任意の時刻の状態が表示されます。記録は1ステップごとに行われているので、スライダ操作によってフレーム単位で状態を確認することもできます。タイムバーの操作の詳細は 時間軸の操作 を参照してください。

再生対象として選択するアイテムには、以下のような選択肢があります。

  • シミュレータアイテムを選択する

そのシミュレータアイテムによるシミュレーション結果のログがどこに記録されているかはシミュレータアイテム自身が把握しています。このため、シミュレータアイテムを選択して再生すると、そのシミュレーションに含まれる全てのボディの全ての動き(および干渉データ)がまとめて再生されます。シミュレーション全体を再生する場合はこの方法が最も簡単です。

  • ボディモーションアイテムを個別に選択する

ボディモーションアイテムを選択して再生すると、その親にあたるボディアイテムに再生が適用されます。この場合、選択したアイテムに対応するボディのみが再生の対象となります。特定のモデルだけ動きを確認したい場合や、ファイルから読み込んだボディモーションを再生する場合はこの方法を用います。

なお、進行中のシミュレーションの表示も、この再生機能によって「記録中のデータの再生」というかたちで実現されています。詳細は 進行中のシミュレーションの表示 を参照してください。

ワールドログファイル

メモリ上への記録とは別に、「ワールドログファイルアイテム(WorldLogFileItem)」を用いると、シミュレーションの進行中に外部ファイルへログをインクリメンタルに(逐次)記録することができます。この方法には以下の利点があります。

  • シミュレーションが途中でクラッシュしても、それまでの動きはファイルに保存されており、再生できる

  • プロジェクトを終了させて再起動しても、ログを維持できる

  • メモリ容量による記録期間の制限を受けない(ファイルシステムの空き容量まで記録できる)

記録の方法

ワールドログファイルアイテムはメインメニューの「ファイル」-「新規」-「ワールドログファイルアイテム」で生成し、ワールドアイテム(またはシミュレータアイテム)の子アイテムとして配置します。そして「ログファイル」プロパティに記録先のログファイルのパスを設定します。ファイル名は任意ですが、".log" といった拡張子をつけておくと分かりやすくなります。

この状態でシミュレーションを開始すると、シミュレーションの進行と並行して、各フレームのリンク位置姿勢・関節変位・デバイス状態がログファイルへ逐次書き出されます。特別な終了操作は必要ありません。

ワールドログファイルアイテムでは以下のプロパティが利用できます。

プロパティ

デフォルト値

意味

ログファイル

記録先のログファイルのパスです。

実際のログファイル

実際に読み書きされるログファイルのパスです(表示のみ)。タイムスタンプ接尾辞が有効な場合はその内容が反映されます。

タイムスタンプ接尾辞

false

trueにすると、記録開始時の日時がファイル名に接尾辞として付与されます。シミュレーションごとに別のファイルとして記録を残したい場合に使用します。

記録フレームレート

0

ログファイルへの記録フレームレートです [Hz]。0の場合はシミュレーションの全フレームが記録されます。値を指定すると、そのレートに間引いて記録され、ファイルサイズを抑えることができます。

ライブ再生読込時間間隔(ミリ秒)

10

ライブ再生(後述)においてログファイルの新規データを読み込む時間間隔です。

ライブ再生読込タイムアウト

0.0

ライブ再生においてデータの追加が途絶えたとみなすまでのタイムアウト時間です [s]。0の場合はタイムアウトしません。

再生の方法

ワールドログファイルアイテムの再生も他のログと同様で、アイテムを選択(またはチェック)してタイムバーを操作します。ログファイルから各時刻の状態が読み出され、仮想世界の全ボディに適用されます。

ログファイルの情報はプロジェクトに保存されるので、プロジェクトを終了・再起動した後でも、ログファイルが残っていればそのまま再生できます。ただし「タイムスタンプ接尾辞」を有効にして記録した場合は、実際のログファイル名に記録開始時刻が付与されているため、プロジェクトを読み込み直しただけではログファイルが読み込まれません。この場合は、タイムスタンプ接尾辞を一旦falseにした上で、「ログファイル」プロパティに記録されたときの実際のファイル名を設定してください。記録結果を確実に残して再生したい場合は、後述のログ再生用アーカイブを利用するのが確実です。また、既存のログファイルをメインメニューの「ファイル」-「読み込み」-「ワールドログ」で読み込んで再生することも可能です(この場合、記録時と同じモデル構成のワールドアイテムの下に配置する必要があります)。

コンテキストメニューの「ライブ再生の開始」を実行すると、現在書き込みが行われている最中のログファイルを追いかけながら再生する「ライブ再生」を行うこともできます。これを用いると、例えば別プロセスで実行中のシミュレーションの様子を、ログファイルを介して別のChoreonoid上で観察するといったことが可能です。異なるホスト間でこれを行う方法も含めて、詳細は リモートホストでのシミュレーションのライブ再生 で解説しています。

ログ再生用アーカイブ

ワールドログファイルによる再生は、記録時と同じモデルが読み込まれていることが前提となります。このため、後になってモデルファイルが変更・移動されると、記録時と同じ結果を再生できなくなる可能性があります。

これに備えて、ワールドログファイルアイテムのコンテキストメニューにある「ログ再生用アーカイブとしてプロジェクトを保存」を実行すると、ログ再生専用のプロジェクトをアーカイブとして保存することができます。アーカイブはひとつのzipファイル(ログ再生アーカイブパック)として保存され、その中に、再生用のプロジェクトファイルとともに、シミュレーションしたときの全てのモデルファイルとログファイルがコピー・格納されます。モデルファイルは元のファイルがそのままコピーされ、メッシュファイルやテクスチャ画像などモデルが参照しているファイルも、元のディレクトリ構造を保った形で全て含められます(URDF等のROSパッケージ形式のモデルについては、パッケージ判別用のpackage.xmlファイルも含められ、"package://" 形式の参照がROS環境の無い環境でも解決されるようになっています)。なお、アーカイブは再生専用であるため、シミュレーションの実行にのみ関わるアイテム(コントローラアイテムやシミュレータアイテム等)は、保存されるプロジェクトから取り除かれます(ログ再生時にも機能することを宣言しているアイテムは残されます)。これにより、元のモデルファイルがその後どうなっても、アーカイブされたプロジェクトを開くだけで、将来にわたって同じ結果を再生することができます。ファイルひとつで受け渡しできるので、シミュレーション結果を成果物として保存・共有したい場合に有用な機能です。

zip形式のアーカイブは、メインメニューの「ファイル」-「プロジェクトの読み込み」で、ファイルタイプを「プロジェクトパックファイル (*.zip)」とすることにより、zipファイルを直接指定して開くことができます。Choreonoid起動時のコマンドライン引数にzipファイルを指定して読み込むことも可能です。いずれの場合も、zipファイルと同じディレクトリに内容が展開された上で、その中の再生用プロジェクトが読み込まれます。展開先と同名のディレクトリが既に存在する場合、ダイアログからの読み込みでは上書きするかどうかの確認が表示され、コマンドラインからの読み込みではエラーとなり読み込みは行われません。アーカイブの中身のファイルを直接確認したい場合は、この展開されたディレクトリを参照できます(zipファイルを手動で展開して確認しても同じです)。

zipファイルから読み込んだプロジェクトを閉じる際(別のプロジェクトを読み込む時やChoreonoidを終了する時)には、展開先ディレクトリの後始末が行われます。展開先ディレクトリの内容に展開時から変化がない場合は、全ての内容がzipファイル側に残っていることから、展開先ディレクトリは確認なしで自動的に削除されます。ディレクトリ内のファイルに変更や追加がある場合は、ディレクトリを維持するか削除するかを確認するダイアログが表示されます。これにより、ディレクトリを汚すことなくzip形式のアーカイブを利用できます。なお、展開先と同名のディレクトリが展開前から存在していた場合は、パックとは無関係のファイルが含まれている可能性があるため、削除の対象とはなりません。

ログファイルがまだ記録されていない(または空の)状態でも、確認の上でアーカイブを保存することは可能です。この場合、アーカイブには空のログファイルが含められます。これは、アーカイブを先に配布しておき、 リモートホストでのシミュレーションのライブ再生 のログファイル転送などによって後からログを充填する、といった使い方のためのものです。

なお、アーカイブの保存では、アーカイブ用の内容を構築するために現在のプロジェクトの構成が一時的に変更され、保存後に元のプロジェクトファイルの再読み込みによって復元されます。この再読み込みの際に、メモリ上に記録されたシミュレーション結果は失われるため、アーカイブ保存の実行時にはまずその旨を確認するダイアログが表示されます。また、復元にはプロジェクトファイルが必要となるため、プロジェクトが一度も保存されていない場合は、まず保存を促すダイアログが表示されます。プロジェクトファイルはあるものの未保存の変更がある場合は、変更を保存してから進めるかどうかを選択できます。保存せずに進めた場合でも、アーカイブには現在のプロジェクトの内容が反映されますが、アーカイブ保存後に復元されるプロジェクトは最後に保存した時点の状態となります。

ビジョンデータの扱い

視覚センサのシミュレーション で解説している視覚センサシミュレーションを使用している場合、シミュレートされたカメラ画像や距離データ等(ビジョンデータ)の記録については、以下の点に注意が必要です。

  • ビジョンデータを記録するかどうかは、GLビジョンシミュレータアイテムの「ビジョンデータの記録」プロパティで切り替えられます(デフォルトはfalse)。これを有効にすると、ビジョンデータもデバイス状態の一部としてメモリ上のログに記録され、再生時にセンサ画像等を確認できるようになります。

  • センサのオン/オフ等の状態パラメータは、ビジョンデータとは別に扱われます。こちらは他のデバイスと同様に、通常のデバイス状態としてログ記録・再生の対象となります。

  • ただし、ビジョンデータはデータサイズが巨大になるため、現状では外部ファイル(ボディモーションファイルおよびワールドログファイル)への保存には対応していません。ビジョンデータの記録・再生はメモリ上のログでのみ可能です。

記録内容のまとめ

各記録方法で記録・保存される内容を以下の表にまとめます。

記録内容

メモリ上の記録

ボディモーションファイル

ワールドログファイル

リンク位置姿勢

関節変位

デバイス状態

×

ビジョンデータ

○(要設定)

×

×

干渉データ

○(要設定)

×

×