リモートホストでのシミュレーションのライブ再生¶
概要¶
ログの記録と再生 で解説しているワールドログファイルの「ライブ再生」機能を利用すると、あるChoreonoid上で実行中のシミュレーションを、別のChoreonoid上でリアルタイムに再生・観察することができます。さらに、ログファイルをホスト間でリアルタイムに同期させることで、これを異なるホスト間で行うことも可能です。リモートで実行中のシミュレーションの監視や、離れた場所でのシミュレーション状況の共有などに活用できます。本ページではその方法を解説します。
ライブ再生の仕組み¶
ワールドログファイルアイテムの通常の再生では、既存のログファイルをタイムバーの時刻に沿って読み込んで再生し、ファイルの最後に到達したら再生が終了します。
一方「ライブ再生モード」では、常にファイルの最後を読み込むようにし、タイムバーの時刻もそこに同期します。またファイルの最後まで読み込んでもそこで再生を停止せず、ファイルの更新があるのを待ちます。この挙動により、シミュレーションが実行中でログファイルも更新中となっている場合には、常にそのシミュレーションの最新の状態が再生されることになります。
ライブ再生は、ワールドログファイルアイテムのコンテキストメニューから「ライブ再生の開始」を実行することで開始できます。停止する場合は、タイムバーの再生停止ボタンを押します。
同一ホスト上での確認¶
まずは同一ホスト上でライブ再生を試してみましょう。ワールドログファイルアイテムを導入したプロジェクトを用意し、同じPC上で2つのChoreonoidを起動して、そのプロジェクトをそれぞれ読み込みます。そして一方でシミュレーションを実行し、もう一方でライブ再生を開始すると、ライブ再生側のシーンがシミュレーション側のシーンと同期することを確認できるかと思います。
この際、以下の2点に注意してください。
再生側のプロジェクトには、再生対象となるモデル(ボディアイテム)が読み込まれている必要があります。ワールドログファイルアイテムだけを含む空のプロジェクトでは再生できません。ログにはモデル自体は含まれていないためです。必ずしも記録側と同一のプロジェクトである必要はありませんが、同じモデルが同じ並びで読み込まれている必要があります。同じプロジェクトを両方で読み込むのが確実です。
ワールドログファイルアイテムの「タイムスタンプ接尾辞」プロパティはfalseにしておくとよいです。これがtrueだと、ログファイルの名前に記録開始時刻が自動で付与されるため、2つのChoreonoidの間で対象のログファイルを一致させるのが難しくなってしまいます。
ログファイルのリモートホストへの同期¶
異なるホスト間でライブ再生を行うには、シミュレーション側のログファイルを再生側のホストへリアルタイムに同期させる必要があります。sshfs等の一般的なネットワークファイルシステムでは、ファイルの更新内容が必ずしもリアルタイムには反映されず、うまく機能しない場合があります。そこでChoreonoidでは、指定したファイルをリアルタイムで同期させるための専用コマンドとして "choreonoid-sync-logfile" を用意しています。
このコマンドの実体はChoreonoidソースの "misc/script/sync-logfile.sh" というシェルスクリプトです。ChoreonoidのCMake設定で INSTALL_SYNC_LOGFILE_COMMAND を ON にしてビルド・インストールすると、Choreonoidのbinディレクトリに "choreonoid-sync-logfile" という名前のコマンドとしてインストールされます。(このオプションはメニュー形式のCMake設定ツールでは通常表示されず、Advanced Modeに切り替えることで表示されます。)
このコマンドは、コピー元(シミュレーションを実行する側)のホストで以下のように実行します。
choreonoid-sync-logfile ログファイル ユーザ名@ホスト名 [リモートファイル]
リモートファイルの指定を省略した場合は、ログファイルと同じパスが使用されます。実行すると、まずファイル全体がリモートホストへコピーされ、以後はファイルへの追記分が逐次リモートへ転送されて、リモート側のファイルがリアルタイムに同期されます。通信にはsshを使用しているので、sshで接続できるホストであればどこでも同期できます。
なお、実行時にログファイルがまだ存在しない場合は、ファイルが作成されるまで待機してから同期を開始します。このため、先に同期コマンドを起動して待機させておき、その後シミュレーションを開始する、という段取りも可能です。
例えば "Tank.log" というログファイルが "~/choreonoid/Tank.log" にあって、"~/choreonoid" ディレクトリで
./build/bin/choreonoid-sync-logfile Tank.log user@remotehost choreonoid/Tank.log
などとして実行すると、リモートホストの "~/choreonoid/Tank.log" が同期されることになります。
リモートホストでの再生¶
ログファイルの同期を開始したら、リモートホスト側でも同じログファイルを読み込むプロジェクトを起動して、ライブ再生を開始しておきます。これで、シミュレーション側で実行している内容が、リモート側で再生されるようになります。
ライブ再生側の読み込みの挙動は、ワールドログファイルアイテムの「ライブ再生読込時間間隔(ミリ秒)」「ライブ再生読込タイムアウト」の各プロパティで調整することができます。
なお、この仕組みはログファイルさえ同期できればよいので、choreonoid-sync-logfileコマンドを複数実行して複数のホストへ同期を行うことで、複数のリモートホストで同時に再生することも可能です。
ログ再生用アーカイブの活用¶
前述のとおり、再生側にも記録側と同じモデル構成のプロジェクトが必要となります。再生側のホストでモデル一式を事前に用意するのは手間がかかりますし、モデルや配置の食い違いによる間違いも起こりがちです。
そこで、 ログの記録と再生 で解説している「ログ再生用アーカイブとしてプロジェクトを保存」の機能を組み合わせると、この準備を確実に行うことができます。具体的には以下の手順となります。
シミュレーション側のホストで、対象プロジェクトのワールドログファイルアイテムに対して「ログ再生用アーカイブとしてプロジェクトを保存」を実行する
保存されたアーカイブのzipファイルを再生側のホストへ転送する
再生側のホストで、転送したzipファイルを読み込む(zipファイルと同じディレクトリに内容が展開され、その中の再生用プロジェクトが読み込まれます)
シミュレーション側のホストでchoreonoid-sync-logfileコマンドを起動する(同期先は、再生側で展開されたディレクトリ内のログファイルのパスとします)
再生側でライブ再生を開始し、シミュレーション側でシミュレーションを開始する
アーカイブには再生に必要な全てのモデルファイルが含まれているため、再生側でモデルを個別に用意する必要がなく、モデル構成の食い違いも起こりません。転送するのはzipファイル1個だけなので、転送の自動化も容易です。
なお、アーカイブはログファイルがまだ記録されていない状態でも(確認の上で)保存でき、その場合は空のログファイルがアーカイブに含められます。これを利用して、シミュレーションの実行前に上記の手順1〜3を済ませてアーカイブを配布しておき、手順4のログファイル転送で空のログファイルを充填していく、という段取りが可能です。準備時間中にアーカイブの配布まで終えておきたい場合に便利です。