Skip to content

時刻と実行

Fibril Simulation は、wall-clock ではなく fixed physics grid を simulation-visible ordering の基準にします。 Device period や latency を設定するときは、nominal time と実際に処理される physics boundary を分けて考えます。

Physics grid の基準

MuJoCo model の option.timestep は一回の SimulationInstance::step() が進める時間です。 たとえば 2 ms timestep の run では、physics boundary は 0 ms、2 ms、4 ms のように並びます。

schedule が 7 ms period を要求しても 7 ms は physics boundary ではありません。 そのため Fibril は schedule ごとに quantization policy を持ちます。

next_boundary

next_boundary は nominal deadline 以降で最初の physics boundary に実行を量子化します。 2 ms grid 上の 7 ms deadline は 8 ms boundary で実行されます。

nominal deadline 自体は失われません。 次回の deadline は前回の量子化結果から 7 ms を加えるのではなく、元の periodic schedule から計算されるため、量子化誤差が period の drift にはなりません。

strict

strict は schedule が physics grid に正確に載ることを要求します。 grid に載らない period または phase は Plan construction で拒否されます。

actuator application のように boundary の一致そのものが contract になる処理では strict を使います。

Acquisition と latency

sensor 系 Device は acquisition と delivery を別の時刻として持ちます。 period_s は acquisition schedule、latency_s は acquisition された sample が delivery されるまでの requested transport latency です。

delivery deadline も physics grid に量子化されるため、requested latency と実際の delivery boundary は一致しない場合があります。 trace では nominal acquisition、actual acquisition、requested delivery deadline、actual delivery を区別して記録できます。

EpisodeTime と SessionTime

一つの run には EpisodeTime と SessionTime があります。 EpisodeTime は episode reset でゼロへ戻りますが、SessionTime は host session の間で単調増加します。

ROS /clock は SessionTime を公開します。 episode reset によって ROS time が過去へ戻らないようにするためです。

Episode seed の扱い

runtime.episode_seed は run-local randomness の基準値です。 標準 Component の noise stream は Component ID と stream name を組み合わせて分離されるため、別 Component の追加によって既存 Component の乱数列を順番依存でずらしにくい構成になっています。

同じ Plan から明示的な seed を指定して新しい Instance を作ることもできます。 replay、parameter sweep、テストで seed を固定したい場合に使います。

Execution mode の違い

Manifest の runtime.mode は host 側の実行用途を示します。

  • unbounded:wall-clock pacing を要求しません。
  • realtime_paced:real-time pacing を行う host 向けです。
  • deterministic_ci:CI や deterministic test 向けです。
  • rendered:rendering を伴う host 向けです。
  • operator_training:operator training host 向けです。

mode が変わっても SimulationInstance の simulation-visible phase ordering は変わりません。 wall-clock pacing は host concern として runtime lifecycle の外側に置かれます。

completed boundary の derived-state 再計算や lazy forward は runtime implementation の contract です。 詳細は Runtime lifecycle を参照してください。

realtime_paced の live host でも physics step を進めるのは SimulationHost の execution-owner thread です。 ROS executor は completed boundary の immutable output を配送し、wall timer から physics step を直接供給しません。