時刻と実行
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 を直接供給しません。