アーキテクチャ
Fibril Simulation は、physics engine、deterministic runtime、virtual hardware、integration を一つの package に集約しません。 active-state ownership と依存方向を package boundary で固定することで、headless test と ROS integration が同じ runtime contract を共有できるようにしています。
主要 abstraction
SimulationBuilder は mutable construction object です。
Component contribution と extension contribution を同じ capability registry に集約し、MuJoCo binding と global invariant を一度だけ解決した後に immutable SimulationPlan を生成します。
SimulationPlan は run 間で共有できる resolved blueprint です。
現在の Plan inspection schema は 2.2 で、model source、scenario reference、Component、resolved actuator assembly、resolved extension identity、capability-local binding、kernel schedule、Device-local acquisition schedule、authority、provenance などを公開します。
SimulationInstance は一つの run に属する mutable state を所有します。
Plan を共有しても mjData、queue、RNG、ActuatorDriver state、domain state、clock、trace は Instance 間で共有されません。
Runtime と integration の分離
fibril_sim_core、fibril_sim_mujoco、fibril_sim_runtime は reusable runtime 層です。
fibril_sim_models はその runtime contract を利用する reusable-model 層で、standard Component、physical model、MuJoCo model plugin、共有 profile / preset を提供します。
これらの package は ROS 2、ament index、pluginlib を直接必要としません。
その理由は「ROS を使わない方が軽いから」だけではありません。
reusable runtime が integration framework の callback model や resource lookup に依存すると、headless test と production integration で実行 contract が分岐するためです。
依存方向は fibril_sim_models -> fibril_sim_mujoco -> fibril_sim_core を基本とし、fibril_sim_mujoco から standard model package へ逆依存させません。
runtime は model の種類を知らず、model 側が binding、read view、Interaction、body-wrench contribution などの runtime primitive を組み合わせます。
fibril_sim_runtime の SimulationRuntime は、一つの run に対する SimulationHost と SimulationServer の lifetime を ROS 2 から独立して所有します。
SimulationHost は mutable SimulationInstance の owner thread を持ちます。
SimulationServer と SimulationConnection は、typed ExternalInput、DeviceOutput、completed-frame timing、render observation、control を same-host IPC で公開する実行境界です。
transport は iceoryx2 で実装しますが、client-facing API から transport primitive は隠します。
compatible simulated driver、viewer、recorder は同じ connection boundary を使うため、ROS callback や GUI thread から mutable simulation state を直接操作しません。
ROS 2 は Host 内部 transport ではなく、production API と simulation observation の integration graph としてその外側に置きます。
ament resource resolution、pluginlib loading、standard ament-backed SimulationPlan composition は fibril_sim_ament が担当します。
ROS message、/clock、rosbag2 は fibril_sim_ros が担当します。
このため標準 ROS frontend は構築済み Plan から SimulationRuntime を生成する薄い adapter に留まります。
Component と Extension
Component は一つの Manifest declaration から Device、actuator endpoint、ActuatorDriver、prescribed state などの runtime capability を生成する再利用単位です。
standard Component は fibril_sim_models に置きます。
fibril_sim_models は Component だけを意味しません。
finite compliant attachment や tire force/slip law のような reduced-order physical model、fibril_sim.position_pid / fibril_sim.tire_contact のような MuJoCo model plugin、model と同じ ownership を持つ generic profile / MJCF preset も同じ reusable-model layer に置きます。
そのため fibril_sim_mujoco は concrete model plugin 名や command semantics を解釈しません。
plugin-backed actuator は runtime では PluginDefined として inspection され、fibril_sim_models の actuator-semantics adapter が既知の reusable plugin contract を Position / Velocity / Effort semantics へ解決します。
同様に construction-time calibration は plugin_attribute という generic named-plugin-instance target を使い、runtime に position_pid 固有 parameter kind を追加しません。
robot 固有 geometry、mounting、installed-unit calibration、competition threshold は application 側に残します。
SimulationExtension は application 固有の capability を追加する boundary です。 extension は Declare と Configure の二段階 lifecycle を持ち、Component type や domain semantics を core package の enum に追加せず composition できます。
competition rule や game semantics を standard Component に取り込むと、reusable virtual hardware と application policy の依存方向が逆転します。 そのため domain-specific behavior は extension 側に置きます。
Deterministic runtime の実行順序
一回の SimulationInstance::step() は固定された 13 phase を同じ順序で実行します。
execution mode は wall-clock pacing を変えられますが、この simulation-visible ordering は変えません。
外部 thread からの input は mailbox に enqueue され、ExternalInputCommit でだけ可視になります。
controller output も同じ ExternalInput boundary を通るため、SIL 用の in-process controller だけが別の runtime ordering を持つ構造を作りません。
Reproducibility の範囲
Fibril Simulation は input ordering、schedule、named RNG、Plan provenance、semantic trace を固定して deterministic replay を構成します。 一方、異なる platform 間の全 floating-point bit pattern が常に一致するという D3 bitwise reproducibility は contract に含めません。
数値比較は scope と tolerance を明示し、semantic equivalence と numerical closeness を分けて診断します。