{
  "schema": "aiinfra_jetson_sensor_sync_record",
  "schema_version": "1.0",
  "generated_at": "2026-09-01",
  "last_verified": "2026-09-01",
  "scope": "Jetson／ROS 2 多相機與多感測器的時間基準、同步、掉幀與訊息年齡驗收紀錄；不是相容性清單、本站實測或安全認證。",
  "rules": [
    "空白、null、UNKNOWN、NOT_TESTED 與 unavailable 都不是 0，也不是通過。",
    "硬體同步、相同 header.stamp、ROS 2 message_filters 配對與低訊息年齡是不同證據，不能互相代替。",
    "先固定硬體、韌體、JetPack／L4T、ROS 2、RMW、QoS、時鐘來源、同步方法與負載，再比較結果。",
    "通過門檻、測試時長、允許掉幀、允許時間偏差與失敗後處置必須在測試前由專案依任務風險定義。",
    "本範本不把一般相機、ROS 2 topic 或 AI 模型當成安全控制器。"
  ],
  "result_values": ["NOT_TESTED", "PASS", "FAIL", "INCONCLUSIVE"],
  "evidence_stages": [
    {
      "id": "capture",
      "name": "擷取層",
      "question": "每個感測器實際產生了幾筆資料，硬體 frame number 與 sensor timestamp 是否連續？"
    },
    {
      "id": "publish",
      "name": "發布層",
      "question": "driver／SDK／ROS 2 publisher 實際發布幾筆，header.stamp 來自哪個時鐘？"
    },
    {
      "id": "pairing",
      "name": "配對層",
      "question": "ExactTime／ApproximateTime 或自訂配對實際配成幾組，最大跨感測器偏差是多少？"
    },
    {
      "id": "recording",
      "name": "錄製層",
      "question": "rosbag2／儲存實際留下幾筆，transport 與 recorder loss 是否可追查？"
    },
    {
      "id": "replay",
      "name": "重播層",
      "question": "重播後的 frame、timestamp、順序與下游資料關聯是否仍符合門檻？"
    }
  ],
  "required_record_fields": [
    "test_id",
    "recorded_at",
    "environment",
    "jetson_module",
    "carrier_board",
    "jetpack_l4t",
    "ros_distro",
    "rmw",
    "sensor_count",
    "sensor_models",
    "interfaces",
    "target_rate_hz",
    "clock_source",
    "sync_method",
    "timestamp_origin",
    "publisher_stamp_source",
    "qos_profile",
    "test_duration_minutes",
    "expected_samples",
    "captured_samples",
    "published_samples",
    "paired_samples",
    "recorded_samples",
    "replayed_samples",
    "max_pairwise_skew_us",
    "p95_message_age_ms",
    "max_inter_frame_gap_ms",
    "result",
    "acceptance_thresholds",
    "evidence_location",
    "limitations"
  ],
  "metric_definitions": {
    "max_pairwise_skew_us": "同一預期事件或配對組內，不同感測器時間戳的最大差值；必須記錄配對規則與時鐘來源。",
    "p95_message_age_ms": "接收端觀測時間減去訊息 header.stamp 的第 95 百分位；跨時鐘時必須先證明時鐘可比較。",
    "max_inter_frame_gap_ms": "同一路資料連續兩筆時間戳或到達時間的最大間隔；欄位必須註明採用哪一種時間。",
    "expected_samples": "依目標率與有效測試時間預先計算的筆數，不含啟動、暖機或明確排除區間。"
  },
  "example_record": {
    "test_id": "replace-me",
    "recorded_at": "2026-09-01T00:00:00+08:00",
    "environment": "real-robot",
    "jetson_module": "replace-me",
    "carrier_board": "replace-me",
    "jetpack_l4t": "replace-me",
    "ros_distro": "replace-me",
    "rmw": "replace-me",
    "sensor_count": null,
    "sensor_models": "replace-me",
    "interfaces": "replace-me",
    "target_rate_hz": null,
    "clock_source": "UNKNOWN",
    "sync_method": "UNKNOWN",
    "timestamp_origin": "UNKNOWN",
    "publisher_stamp_source": "UNKNOWN",
    "qos_profile": "replace-me",
    "test_duration_minutes": null,
    "expected_samples": null,
    "captured_samples": null,
    "published_samples": null,
    "paired_samples": null,
    "recorded_samples": null,
    "replayed_samples": null,
    "max_pairwise_skew_us": null,
    "p95_message_age_ms": null,
    "max_inter_frame_gap_ms": null,
    "result": "NOT_TESTED",
    "acceptance_thresholds": "replace-me before testing",
    "evidence_location": "replace-me",
    "limitations": "Example only; replace every version, method and measured field."
  },
  "source_urls": [
    "https://nvidia-isaac-ros.github.io/v/release-4.1/robots/sensor_mounting_rig/thor_devkit_realsense_rig_assembly.html",
    "https://docs.ros.org/en/humble/Concepts/Intermediate/About-Quality-of-Service-Settings.html",
    "https://orbbec.github.io/OrbbecSDK_ROS2/zh/source/camera_devices/6_benchmark/diagnostic_tools.html",
    "https://forums.developer.nvidia.com/t/synchronize-when-publish-camera-data-multi-camera/352687"
  ]
}
