# シミュレーションの実行と再生

目次

- シミュレーションの開始
- シミュレーションの一時停止
- シミュレーションの終了
- 時間範囲の設定
- 実時間との同期
- シミュレーション結果の記録
- デバイス状態の記録
- シミュレーション結果の再生
- 進行中のシミュレーションの表示
- シミュレーション結果の出力先

## シミュレーションの開始

シミュレーションを開始するには、 シミュレーションプロジェクトの作成 を行った上で、以下の操作を行います。

1. 対象となるシミュレータアイテムをアイテムツリービュー上で選択する
2. シミュレーション開始ボタンを押す

1の操作は、シミュレータアイテムがひとつしか存在しない場合は必要ありません。この場合、実行すべきシミュレーションはひとつしかないので、それを特定する操作は必要ないからです。

一方で、プロジェクトは複数のシミュレータアイテムを含むこともできます。これは、シミュレーションアイテムやそのパラメータを複数用意して各々シミュレーションを行い、結果を比較するといった場合に有用です。その場合は、実行するシミュレーションを特定するために、シミュレータアイテムを選択しておく必要があります。

注釈

対象となるシミュレータアイテムの特定については、以下で説明する一時停止や終了の操作についても同様ですので、覚えておいて下さい。いずれにしても、シミュレータアイテムがひとつしか存在しない場合は、気にしなくてOKです。

2の操作については、シミュレーションバーのボタンを用いて行います。通常は以下の「シミュレーション開始ボタン」を用いてシミュレーションを開始します。

このボタンでシミュレーションを開始すると、 初期状態の設定 で登録しておいた初期状態の位置・姿勢からシミュレーションを開始します。

シミュレーションの開始には、以下の「シミュレーション再始動ボタン」を用いることもできます。

この場合、開始ボタンとは異なり、登録されている初期状態ではなく、現在のモデルの状態からシミュレーションが開始されます。

## シミュレーションの一時停止

以下の一時停止ボタンを押すことにより、実行中のシミュレーションを一時停止することができます。

もう一度このボタンを押すか、前述の「シミュレーション再始動ボタン」を押すと、一時停止していたシミュレーションが再開されます。

## シミュレーションの終了

以下の「シミュレーション終了ボタン」を押すと、シミュレーションが終了します。

この場合、一時停止とは異なり、シミュレーションに関わる全ての要素（コントローラ等も含む）の終了処理が（可能な限り）行われます。このため、終了した時と完全に同じ状態からの再開はできません。（「シミュレーション再始動ボタン」によって、終了時の位置・姿勢からシミュレーションを開始することはできますが、これは初期位置・姿勢がそうなるというだけで、それ以外の要素は初期化された状態でシミュレーションがやり直されることになります。）

一方で、終了処理によってシミュレーションの実行のために使われていたリソースも解放されますし、初期化された状態からシミュレーションをやり直すことも可能となります。従って、シミュレーションを再開する必要がない場合は、終了の操作を行うようにしてください。

## 時間範囲の設定

シミュレーションを終了するタイミングについて、シミュレータアイテムの「時間範囲」プロパティで設定することができます。以下の項目から選択します。

- 無制限

> 終了時間を指定しません。明示的な終了操作が行われるまでシミュレーションを続けます。デフォルトではこの設定になっています。

- 能動制御期間

> コントローラが能動的に制御を行っている間シミュレーションを続けます。全てのコントローラが制御を終えた時に、シミュレーションを終了します。

- 指定時間

> 「時間長」プロパティで指定した時間だけシミュレーションを行います。

- タイムバー範囲

> タイムバーの範囲だけシミュレーションを行います。

※ ここで指定する時間は、シミュレータ内の仮想世界における時間です。

時間範囲の設定が「無制限」以外のときは、対応するタイミングでシミュレーションが自動的に終了します。この場合、明示的な終了操作は必要ありません。もちろん、明示的な終了操作によって、シミュレーションを途中で終了させることも可能です。

時間範囲の設定が「無制限」のときは、明示的な終了操作を行うまでシミュレーションが継続します。

## 実時間との同期

一般的に、シミュレーションを行っている仮想世界の時間の進み方は、実世界での進み方とは異なります。仮想世界の時間の進みはシミュレーションの計算時間に依存するもので、実世界より速くなることも遅くなることもあるからです。

そうは言っても、仮想世界の時間の進みを実時間の進みに合わせたい場合があります。その方がシミュレーションの進行状況を把握しやすいというのがひとつの理由です。また、シミュレーションと実世界との間でインタラクションを行う場合にも、その方が適しています。例えば、シミュレーション中のロボットを実世界のオペレータが操作する場合、時間の進みがあっている方が、実際のロボットを操作しているのに近い感覚が得られます。

Choreonoidでは、仮想世界と実世界の時間の進み合わせることを「実時間同期」と呼んでいます。これはシミュレータアイテムの「実時間同期」プロパティで有効にすることが可能です。デフォルトはTrueで有効になっています。通常はこの設定でシミュレーションを行うのが分かりやすくてよいでしょう。

ただし、実時間同期は、計算時間が実時間より早い場合にのみ有効な設定であることに注意して下さい。計算時間が実時間よりも遅い場合は、同期の設定をどちらにしても、シミュレーション時間の進み方は変わりません。遅い計算時間を早くすることは不可能だからです。

逆に計算時間が実時間よりも早い場合には、実時間同期を無効にすることで、シミュレーションの進行を実時間より速くすることも可能となります。シミュレーションにかける時間を短縮したい場合には、そちらの設定を試してみて下さい。

## シミュレーション結果の記録

シミュレーション結果は時系列データとして記録することができ、これを結果の再生や解析に用いることができます。

この機能は、シミュレータアイテムのプロパティである「記録モード」を用いて設定します。モードは以下から選択します。

- 全て

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

- 末尾

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

- オフ

> 記録を行いません。シミュレーション結果を確認できるのは、シミュレーション実行中のみとなります。

デフォルトのモードは「全て」となっています。結果の再生や解析はシミュレーションの全期間に渡って行えるに越したことはないので、通常は記録モードとしてこれを選択しておきます。

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

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

- 長時間のシミュレーションをする
- システムのメモリ容量が十分でない
- 全ての期間の記録は必須ではないが、問題が生じた時の解析のため、直近の記録は残しておきたい

といった状況で用いるとよいでしょう。

注釈

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

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

## デバイス状態の記録

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

## シミュレーション結果の再生

シミュレーション結果の記録を有効にしている場合、それをアニメーションとして再生することが可能です。再生の仕方は、以下のとおりです。

1. 対象となるシミュレータアイテムをアイテムツリービュー上で選択する
2. タイムバーを操作する

タイムバーの操作については、再生ボタンを押せば一定の速度でのアニメーション表示ができますし、タイムスライダ等を操作することで、任意の箇所を再生することも可能です。詳しくは 時間軸の操作 を参照してください。

## 進行中のシミュレーションの表示

シミュレーション結果の記録を有効にしている場合、進行中のシミュレーションの表示についても、上記の再生機能を用いて、「記録中のデータの再生」というかたちで行われます。ただし、進行中のシミュレーションと、終了済みのシミュレーション結果とでは、再生に関する挙動で多少異なる点があります。具体的には以下のようになります。

1. シミュレーション開始時には、再生に関する追加の操作は必要ありません。シミュレータアイテムの選択をあらためて行ったり、タイムバーを操作しなくても、結果表示のアニメーションが開始します。
2. シミュレーション中は、シミュレータアイテムの選択が外れた場合でも、アニメーションが継続します。これは他のシミュレータアイテムを選択するか、アニメーション停止の操作を行うまで続きます。
3. シミュレーションバーの「シミュレーション開始ボタン」や「シミュレーション再始動ボタン」を押すことで、進行中のシミュレーションの再生を再開できます。
4. タイムバーの設定で「進行中の更新に同期」がオンの場合、シミュレーション中は常にその最新の状態を再生します。

なお、アニメーションを停止させても、シミュレーション自体は継続する点に注意してください。4の操作をすることで、継続中のシミュレーションの表示を復活させることができます。通常の操作で再生を復活させる場合、4の設定が関わってきますので、ご注意ください。

注釈

タイムバーの「進行中の更新に同期」がオフの場合、シミュレータ内部のシミュレーションの進行と、その結果を表示するアニメーションの進行は、必ずしも一致しません。その場合、進行中のシミュレーションに対してインタラクティブな操作を行っても、反応がすぐに返ってこない場合がありますので、注意が必要です。これについては、「進行中の更新に同期」をオンにしておけば問題ありません。デフォルトではオンになっています。

## シミュレーション結果の出力先

各モデルの動作軌道は、対応するボディアイテムの小アイテムの位置に、”シミュレータアイテム名 - モデル名” という名前で出力されます。

例えば シミュレーションプロジェクトの作成 で作成したプロジェクトでは、シミュレーション開始後にbox1モデルの下に以下のように”AISTSimulator-box1”というアイテムが出力されます。

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

ここで”Floor”モデルは静的モデルであるため、動作軌道は出力されません。

出力されるアイテムの型は、 シーケンスデータ で紹介した「ボディモーションアイテム」です。ボディモーションアイテムは複合アイテムとして定義されていて、以下のようにサブアイテムが構成されています。

+ AISTSimulator-box1
+ Joint
+ Cartesian

ここでJointには関節角軌道が格納され、Cartesianにはリンクの位置姿勢の軌道が格納されます。それぞれ、MultiValueSeqアイテム、MultiSE3Seqアイテムとなっています。

さらに、デバイスの状態も記録している場合は、そのデータが以下のように”Devices”に出力されます。

+ AISTSimulator-box1
+ Joint
+ Cartesian
+ Devices

Devicesの型はMultiDeviceStateSeqアイテムです。

このようにして出力されたデータは、それぞれ所定の型を有するプロジェクトアイテムに過ぎません。従って、それぞれのアイテム型に対して有効な操作は、シミュレーション結果に対してもそのまま利用することができます。具体的な例として、アイテムが有する軌道データをファイルへ保存し後で読み込み直したり、グラフビューで軌道を可視化するといったことも可能です。

また、動作軌道の再生についても、これらのアイテムを選択してタイムバーを操作することによっても行えます。ただしその場合は選択したアイテムしか軌道が再生されません。シミュレーションが複数の動的モデルを有する場合、シミュレーション全体を再生するためには、全てのモデルの動作軌道アイテムを選択しておく必要があります。ただしそのようなことをしなくても、既に説明したように、対応するシミュレータアイテムさえ選択しておけば、シミュレーション全体が再生対象となります。