実装は 核計算ロジックから外側に向かって積み上げる:
各ステップ完了時に git-conventions に従ってコミット・PR を作成する./implement <ステップ> でコーディング → テスト → リファクタの自動パイプラインを通す.
| Step | 名前 | 成果物 | 依存 |
|---|---|---|---|
| 1 | 均一性評価モジュールの移植 | uniformity.py, evaluation/zones.py, evaluation/radial.py + テスト | なし |
| 2 | YAML スキーマ定義 | scene/schema.py + バリデーションテスト | Step 1 |
| 3 | ジオメトリ層 | geometry/loader.py, geometry/transforms.py + テスト | Step 2 |
| 4 | シーン構築 + 最小レンダー | scene/builder.py, scene/lights.py, scene/materials.py, scene/sensors.py, render/runner.py, render/output.py | Step 3 |
| 5 | render CLI | cli/render.py + 統合テスト | Step 4 |
| 6 | evaluate CLI + 可視化 | cli/evaluate.py, evaluation/roi.py, evaluation/visualize.py | Step 1, 5 |
| 7 | 3D 照度ビューア(キャリブ調査ツール) | visualize/baker.py, visualize/viewer.py, cli/visualize.py | Step 4, 5 |
| 8 | 基準設計のキャリブレーション | configs/scene_baseline.yaml, configs/meshes/*.stl, キャリブ報告 | Step 5, 6, 7 |
| 9 | 設計バリエーション比較 | バリエーション YAML 複数 + 比較レポート | Step 8 |
各ステップは /implement <Step> で実装する./implement 内の確認ポイント
(GUIDE_02 エージェント運用ルール 準拠)に加え,Step 固有の人間関与は以下のとおり.
| Step | 事前準備(人間) | Phase 1 後の確認 | Step 完了の判断 |
|---|---|---|---|
| 1〜3 | なし | テスト結果の目視 | テスト全通過 |
| 4 | なし | レンダリング PNG の目視確認(光が物理的に妥当か) | 最小シーンが完走 |
| 5 | なし | CLI 入出力の確認 | コマンドが期待動作 |
| 6 | SmTIAS-Evaluation の実測 PNG | 実測と評価結果の数値一致を確認 | 既知値と一致 |
| 7 | なし | sm-visualize の 3D 表示確認(LED 位置・照度分布の目視) | minimal scene で照度分布が解析解と数 % 以内 |
| 8 | Fusion 360 → STL,LED 配置,材料初期値 | 実測との突合.パラメータ調整判断(反復) | 許容範囲内で一致.数値を本ファイルに記録 |
| 9 | 改良案の Fusion 360 → STL(複数) | 各バリエーションの結果評価と採用候補の選定 | 比較表完成.最低 1 案がベースライン改善 |
人間の本格的な介入は Step 7 以降.それ以前は AI 主導で進められる.
SmTIAS-Evaluation/src/uniformity.py を src/sm_tias_lightsim/uniformity.py にコピーhttps://github.com/rintoHasegawa/SmTIAS-Evaluation)evaluation/zones.py:3 ゾーン分析(中心 d<0.33 / 中間 / 周辺 d≥0.66)evaluation/radial.py:放射状プロファイルuv run pytest tests/test_uniformity.py が通るuv add pydantic pyyamlscene/schema.py:SPEC_02_シーン定義仕様 のトップレベル構造を Pydantic モデルで定義ValidationError を投げるgeometry/loader.py:trimesh で STL 読込.頂点・面・単位タグを保持geometry/transforms.py:mm → m 変換等scene/lights.py:YAML 光源定義 → Mitsuba emitterscene/materials.py:YAML 材料 → Mitsuba BSDFscene/sensors.py:YAML センサ → Mitsuba sensorscene/builder.py:上記を統合.YAML 全体 → Mitsuba scene dictrender/runner.py:variant 設定 + mi.render 実行.輝度配列を返すrender/output.py:HDR 配列 → PNG / luminance.npy 出力@pytest.mark.slow)cli/render.py:sm-render --scene <yaml> --output <dir> を実装pyproject.toml の [project.scripts] に登録(sm-render = "sm_tias_lightsim.cli.render:main")uv run sm-render --scene tests/fixtures/minimal.yaml --output /tmp/test/ が動くevaluation/roi.py:image_pixel 型 ROI 抽出(最初は矩形のみ.scene_face は後回し可)evaluation/visualize.py:輝度マップ / ヒストグラム / 放射プロファイル / ゾーンマップを matplotlib で出力cli/evaluate.py:sm-evaluate --image <png> --config <yaml> --output <dir> を実装uv add pyvistavisualize/baker.py:直接照度ベイク(各 face 中心 → emitter への shadow ray + cosine 項 + 距離減衰)visualize/viewer.py:PyVista プロッタ(メッシュ着色 + LED 球/矢印 + センサ視錐台 + 座標軸)cli/visualize.py:sm-visualize CLIsm-visualize がインタラクティブウィンドウを開き,評価板の照度分布が解析解と数 % 以内で一致するconfigs/scene_baseline.yaml に記述sm-render → sm-evaluate で指標を算出sm-render → sm-evaluate で評価Step 7 で実数値を見てから確定する.それまでの仮置き:
| 指標 | 実測値(参考) | 仮置き許容範囲 |
|---|---|---|
| CoV | 0.0426 | ±0.005 |
| 中心/周辺比 | 1.064 | ±0.02 |
| 勾配 (%) | 6.23 | ±1.5 |
確定値は Step 7 完了時に本表を上書きする.
現時点では未着手.Step 9 完了後に必要性を判断する.
現行の Mitsuba 版は YAML 手書き + CLI 駆動が中心で,「光源配置を試行錯誤する」「結果を直感的に確認する」操作性は弱い.Step 7 で PyVista 3D ビューアを入れたが,これは結果の確認に限る.LED の配置・形状・配光プロファイル自体を GUI で試したい段階になったら Blender アドオン版を別パッケージとして追加する.
| 層 | Blender + bpy 版での担当 |
|---|---|
| 3D 表示・LED 配置・マテリアル編集 | Blender 標準 GUI |
| 物理レンダリング | Cycles(モンテカルロパストレース) |
| 評価指標(CoV / 3 ゾーン / 放射プロファイル / ROI) | 現行の uniformity.py, evaluation/*.py を import で再利用 |
| 評価結果の表示 | 自作の bpy.types.Panel(Blender サイドバーに CoV 等を表示) |
| 配光プロファイル | IES ファイル直接読込(Blender 標準サポート) |
.ies)をそのまま読み込める.Mitsuba 版では自作実装が必要Cycles の Light.energy(W)と評価面の実 lx の対応は,Mitsuba 版の Step 8 で確定した数値を真値として 1 回校正する.具体的には:
これで以降は Blender 版でも物理的に妥当な数値が出る.
src/sm_tias_lightsim/ # 現行(Python パッケージ) src/sm_tias_lightsim_blender/ # Step 10 候補(Blender アドオン) ├── __init__.py # bpy.types.AddonPreferences 登録 ├── panels.py # サイドバー UI(評価ボタン・CoV 表示) ├── operators.py # 「評価実行」「YAML エクスポート」等 └── render_runner.py # Cycles 起動 + 結果取得
評価層(uniformity.py, evaluation/*.py)は Mitsuba に非依存なので コード変更なしで再利用 できる.
Step 9 完了時点で以下を確認して着手判断する:
いずれも該当しないなら Mitsuba 版で運用継続.