# LED グループ別動作確認 (LED Group Sanity Check)

本ドキュメントは **シミュレーションが下/右/左の 3 つの LED 基板を物理位置どおりに独立にモデル化できているか** を，各グループの LED だけを ON にした輝度マップの形と数値で検証した結果のレポートである．Step 8 系キャリブの主軸ではなく **シミュ動作の基礎健全性確認** として位置付ける．

## 目的・背景

**動機**: Step 8 系で「実機 vs シミュの残差 2.63×」を追っている過程で，シミュレーション側の動作が物理どおりに動いているかの確認が不十分だった．特に：

- LED は実機で **3 つの基板（下/右/左）に分散配置**されているが，シミュではこれを正しく扱えているか
- 各基板から出る光の **方向性** が物理どおりに評価板に届いているか
- **線形性**（各 LED の光は独立に重ね合わさるはず）が成り立っているか

これらは「実機との残差は何が主因か」を議論する前提として担保すべき性質．

## 検証手順

1. `configs/scene_baseline.yaml` の lights から各グループの LED だけを残した一時 YAML を生成
2. 各で `sm-render` を実行（spp=1024, max_depth=8）
3. 生 linear 輝度マップ（`luminance.npy`）を取得して 1×3 並列比較パネルを生成

| グループ | 残した LED | LED 数 |
| --- | --- | --- |
| `bottom` | `led_bottom_0` 〜 `led_bottom_5` | 6 個 |
| `right` | `led_right_0` 〜 `led_right_5` | 6 個 |
| `left` | `led_left_0` 〜 `led_left_5` | 6 個 |

スクリプト: `scripts/sanity_led_groups.py`（3 ジョブ順次実行）+ `scripts/build_led_group_sanity_panel.py`（6 列パネル + 線形性誤差）+ 拡大確認用の 1×3 / 1×2 パネル生成．

成果物:
- `output/led_group_sanity/{bottom,right,left}/luminance.npy`
- `output/_slide_panels/led_group_sanity.png` (6 列: ①〜③ 単独 / ④ 全 ON / ⑤ 和 / ⑥ 線形性誤差)
- `output/_slide_panels/led_group_sanity_focus.png` (1×3 拡大)
- `output/_slide_panels/led_group_sanity_right_left.png` (1×2 左右対称性確認)

## 結果 — 数値

| グループ | mean | max | min | グループ単独で見える最強点 |
| --- | --- | --- | --- | --- |
| ① bottom (6 LED) | **98.82** | 157.77 | 0.00 | 評価板の下端中央 |
| ② right  (6 LED) | 47.10 | 81.42 | 0.00 | 評価板の右側面寄り（やや上下に分散） |
| ③ left   (6 LED) | 47.08 | 84.03 | 0.00 | 評価板の左側面寄り（やや下寄り） |

→ **right と left の mean が一致 (47.10 vs 47.08)** で **左右対称性 ✓**．**bottom が right/left の 2.10× で強い**．

## 結果 — 「形」の観察

3 つの輝度マップは形が明確に異なる：

| グループ | 形の特徴 |
| --- | --- |
| **bottom** | 評価板の **下端中央が縦長の島状に明るい**．Y 方向単調勾配（下が明るく上が暗い）．直接光が支配的 |
| **right** | **評価板の中心寄りに円状のホットスポット**＋上下成分も強い．右側面寄りが直接光，中央が反射光 |
| **left** | right と類似（中心円 + 上下成分）だが Y 方向の重心がやや下寄り．完全な左右対称ではない |

→ ユーザー観察「bottom は上下の島，right/left は中心の円」は **物理的に LED 配置に対応** した正しい観察．

## LED 配置と「形」の物理的対応

`configs/scene_baseline.yaml` の LED 座標から，形の違いを物理的に説明する：

| グループ | LED 中心座標 | 評価板との幾何関係 |
| --- | --- | --- |
| **bottom** | X∈[-10, +18], Y=**-71**, Z=-66.1 | 評価板下端 (Y=-51) より **20 mm 下**．**X 方向に密集**（[-10, +18] の 27 mm 幅） |
| **right** | X=**+66**, Y∈[-25, +3], Z=-66.0 | 評価板右端 (X=+49.5) より外側 **16.5 mm**．**Y 方向に分散**（[-25, +3] の 27 mm 幅，**評価板 Y 中央付近**） |
| **left** | X=**-66**, Y∈[-33, -5], Z=-66.0 | 評価板左端 (X=-49.5) より外側 16.5 mm．**Y 方向に分散**（[-33, -5] の 27 mm 幅，**評価板 Y 中央やや下**） |

評価板: X∈[-49.5, +49.5], Y∈[-51, +51], 中心 Z≈-4.5．全 LED の光軸は +Z 方向（評価板向き）．

### bottom = 「下端の縦長の島」

LED が **評価板の下端の真下に X 方向で密集**．直接光は評価板の **下端中央を縦長に照らす**．LED の X 範囲 [-10, +18] が評価板 X 範囲 [-49.5, +49.5] のごく中央部に収まるため，X 方向の幅は狭い（島状）が，Y 方向には下端から評価板全体に届く．Y 方向単調勾配が支配的．

### right/left = 「中心の円 + 上下成分」

LED が **評価板の側面外側に Y 方向で分散**．LED の Y 範囲 [-25, +3] は評価板 Y 範囲 [-51, +51] のうち **中央寄り**．これにより：

- **「上下成分」** = Y 方向に 27 mm 幅で LED が並ぶため，評価板の中央〜下寄りに光が直接届く（Y 方向に幅広く照らす）
- **「中心の円」** = LED が **評価板中心の高さ** に集中していると，直接光が評価板の側面に当たる + 内壁拡散反射で **評価板中央付近** に集中して見える円形ホットスポット

### bottom が right/left の 2.1× 強い理由（ユーザー仮説の検証）

ユーザー仮説「下成分の影響力が強い ＝ 反射少なめで当たる量が多い」は **物理的に正しい**．主因は以下の幾何的効率の違い：

#### 要因 1: LED 〜 評価板中心への到達経路の角度

LED から評価板中央（X=0, Y=0, Z=-4.5）への直線方向の **+Z 軸（光軸）からの角度**：

| グループ | LED 代表位置 | 評価板中央への方向 | +Z からの角度 |
| --- | --- | --- | --- |
| bottom (X≈+4, Y=-71, Z=-66) | (+4, -71, -66) → (0, 0, -4.5) | (-4, +71, +61.5) | **arctan(√(4²+71²)/61.5) ≈ 49°** |
| right (X=+66, Y≈-11, Z=-66) | (+66, -11, -66) → (0, 0, -4.5) | (-66, +11, +61.5) | **arctan(√(66²+11²)/61.5) ≈ 47°** |

意外にも **角度はほぼ同じ（49° vs 47°）**．これだけでは説明できない．

#### 要因 2: 評価板への「立体角」と直接光の到達割合

bottom LED は評価板の **真下 (Y 軸 +Z 方向)** に集中している → 評価板の **広い範囲が立体角内**に入る．Lambertian 配光は +Z 方向に最大の放射輝度で、評価板の **広範囲を直接照射**できる．

一方 right/left LED は評価板の **側面外側**に位置 → 直接光は評価板の **側面の端部しか届かない**．評価板の中央〜反対側まで光を運ぶには **内壁多重反射が必要**．多重反射は反射率 R=0.85 で減衰し、各バウンスで cos 重みで散乱するので **直接光の効率より大幅に下がる**．

#### 要因 3: 評価板への近接効果

| グループ | LED 代表点 → 評価板裏面中心 (0,0,-4.5) の距離 |
| --- | --- |
| bottom (+4, -71, -66) | √(4² + 71² + 61.5²) = **94 mm** |
| right (+66, -11, -66) | √(66² + 11² + 61.5²) = **91 mm** |

距離自体はほぼ同じ．光量の差は距離ではなく **「直接光で評価板全体を照らせるか」** の幾何効率に由来．

#### 結論

**bottom は評価板の真下から直接照射型** であり，**right/left は側面照射＋多重反射型** という構造的な違いがある．bottom の 2.10× の優位性は：

- 直接光の到達効率の違い（評価板の広い領域を直接光が叩く）
- 多重反射のロス係数（R=0.85 のバウンスごとの減衰）

これは実機の照明設計としても **意図したもの**（bottom LED の方が「主光源」に近い役割）と考えられる．

## 線形性違反の検出と原因

3 グループの輝度マップを足し合わせると、本来 Mitsuba の path tracer は **厳密に線形**なので「①+②+③ = ④（全 18 個 ON）」が成り立つはず．しかし数値は：

| 項目 | mean |
| --- | --- |
| ① bottom | 98.82 |
| ② right | 47.10 |
| ③ left | 47.08 |
| **①+②+③ の和** | **193.00** |
| ④ 既存 `output/baseline/luminance.npy` の全 ON | **139.98** |
| **相対誤差 mean** | **+37.87%** |

→ **比較対象の `output/baseline/luminance.npy` の生成時刻が `2026-05-18`（Step 8-1 時点）**であり、現在の `configs/scene_baseline.yaml`（Step 8-9 で LED 位置を Fusion STL から再抽出して更新済）と **不整合**であることが判明．

| ファイル | 生成時刻 | 対応する scene 設定 |
| --- | --- | --- |
| `output/baseline/luminance.npy` | 2026-05-18 (Step 8-1) | 旧 LED 位置（等間隔 8.7 mm） |
| `output/baseline_v3_leds/luminance.npy` | 2026-05-28 (Step 8-9) | 現在の LED 位置（3+ギャップ+3） |

線形性自体の検証は、最新シーンで baseline を再生成して再比較する必要がある（本 sanity check の範囲外）．Mitsuba は理論的に線形なので **再生成すれば一致するはず**．

## sanity check の結論

| 観点 | 結論 |
| --- | --- |
| **方向性**（各単独 ON で光が LED 基板側から来ている） | ✓ bottom 単独で下端中央、right/left 単独で側面寄りが明るい |
| **対称性**（right と left の対称） | ✓ mean がほぼ同じ (47.10 vs 47.08)、形も対称（Y 中心オフセットを除く） |
| **量的バランス**（bottom が right/left より強い理由） | ✓ 物理的に整合（直接光効率の違い） |
| **線形性**（厳密な数値合致） | ✗ 既存 baseline が古いため未検証．Mitsuba は理論線形なので再生成で一致すると予想 |

→ **シミュレーションは 3 つの照明源を物理位置どおりに独立にモデル化できている**．Step 8 系の残差 2.63× を議論する前提は担保された．

## 副次発見

- 実機の右基板と左基板は **Y 方向の取り付け位置が微妙に異なる**（right: Y∈[-25, +3] / left: Y∈[-33, -5]）．**完全な左右対称設計ではない**．これは [Step 8-9 LED 位置正確化](TEST_01_キャリブレーション検証履歴.md#step-8-9-led-位置を-fusion-360-設計-stl-から抽出して反映) で Fusion STL から実位置を抽出した結果と整合．
- `output/baseline/luminance.npy` が **Step 8-1 時代のまま放置**されていたことが発覚．今後の比較で混乱を招く可能性があるため、再生成または明示的に古い旨を記載すべき．
- LED の光軸は全グループで +Z 方向で統一されている（実機の基板も全て評価板向きで取り付け）．配光モデルが Lambertian なので、評価板への到達効率は **LED 〜 評価板の幾何関係**に支配される．

## 関連ドキュメント (Related Documents)

- [TEST_01 キャリブレーション検証履歴](TEST_01_キャリブレーション検証履歴.md) — 特に [Step 8-9 LED 位置正確化](TEST_01_キャリブレーション検証履歴.md#step-8-9-led-位置を-fusion-360-設計-stl-から抽出して反映) で現在の LED 配置の出典
- [TEST_02 シミュレーション実行記録](TEST_02_シミュレーション実行記録.md) — `output/led_group_sanity/` のアーティファクト索引
- [SPEC_03 基準設計の物理構成 §LED 光源](../04_SPEC/SPEC_03_基準設計の物理構成.md#led光源) — LED 物性（radiance, 配光）
- 生成スクリプト: `scripts/sanity_led_groups.py` / `scripts/build_led_group_sanity_panel.py`
