-
Notifications
You must be signed in to change notification settings - Fork 0
キャリブレーション機能の作成 #41
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
キャリブレーション機能の作成 #41
Conversation
変更内容: - SensorDataProcessorを新規作成し、データのトリミング、nLoSフィルタリング、移動平均処理を実装 - AutoAntennaCalibrationUsecaseにデータ前処理機能を統合し、処理統計情報を収集 - 収集した統計情報を取得するメソッドを追加 これにより、センサーデータの品質向上と処理結果の分析が可能になります。
変更内容: - AntennaPositioningViewにデバイス追加のアラートを表示する機能を追加 - 新しいデバイス名を入力するためのテキストフィールドを実装 - デバイス名が空でない場合に新しいデバイスを追加するロジックを追加 - FloatingDeviceListPanelにアラート表示のバインディングを追加 これにより、ユーザーはアンテナ配置画面から新しいデバイスを簡単に追加できるようになります。
変更内容: - CalibrationCSVLoaderを新規作成し、CSVファイルからタグとアンテナの位置情報を読み込む機能を追加 - CalibrationResultVisualizationViewを新規作成し、キャリブレーション結果を視覚的に表示する機能を実装 - AntennaPositioningViewModelにキャリブレーション結果を表示するためのデータ構造とロジックを追加 - 各画面でのナビゲーションバーの表示モードを条件付きで適用する機能を追加 これにより、ユーザーはキャリブレーション結果を視覚的に確認できるようになります。
変更内容: - `View+NavigationBarTitleDisplayMode.swift`内のインデントを修正し、コードの可読性を向上 - 各画面でのナビゲーションバーの表示モードを一貫して適用するように修正 - `AntennaPositioningView`, `FieldSettingView`, `PairingSettingView`, `SensingManagementView`, `TrajectoryView`でのナビゲーションバー表示モードの適用を整理 これにより、コードの整合性が向上し、メンテナンスが容易になります。
ウォークスルーAutoAntennaCalibrationUsecase にセンサーデータ前処理を統合し、処理設定・生観測の保存・アンテナ/タグごとの処理統計を追加。CSVベースのキャリブレーション読込、SensorDataProcessor、結果可視化ビュー、ナビゲーション修飾子の共通化、および関連テストを導入。 変更
シーケンス図sequenceDiagram
autonumber
participant User as ユーザー
participant UI as AntennaPositioningView
participant VM as AntennaPositioningViewModel
participant Usecase as AutoAntennaCalibrationUsecase
participant Processor as SensorDataProcessor
participant Viz as CalibrationResultVisualizationView
User->>UI: キャリブレーション開始操作
UI->>VM: showCalibrationResultVisualization()
VM->>Usecase: collectDataFromSession(sessionId, tagId, applyPreprocessing:true)
Usecase->>Usecase: 観測をアンテナ/タグでグループ化し生観測を保存
alt applyPreprocessing == true
Usecase->>Processor: processObservations(observations)
Processor->>Processor: トリミング / NLOS フィルタ / 移動平均
Processor-->>Usecase: 処理済観測 + ProcessingStatistics
else
Usecase-->>Usecase: 生観測をそのまま使用、統計は未加工として記録
end
Usecase->>VM: キャリブレーション用観測と統計を返却
VM->>VM: CalibrationResultData を構築
VM-->>UI: showCalibrationResult = true, calibrationResultData
UI->>Viz: 可視化ビュー表示(タグ/初期/較正アンテナ位置・矢印)
Viz->>User: 2D ビジュアライゼーションを描画
推定レビュー実施量🎯 4 (複雑) | ⏱️ ~60 分
関連するプルリクエスト
詩
Pre-merge checks and finishing touches✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift (1)
312-321: 新しい状態もクリアしないと古い統計が残ります
clearData()/clearData(for:)がmeasuredDataByAntennaとcalibrationResultsしか初期化しておらず、今回追加されたrawObservationsByAntennaやprocessingStatisticsが残り続けてしまいます。この状態で再度キャリブレーションを走らせると、getProcessingStatistics()などが過去の統計値を返してしまい、扱うデータが不整合になります。新しい state も同時にクリアしてください。func clearData() { self.measuredDataByAntenna.removeAll() self.calibrationResults.removeAll() + self.rawObservationsByAntenna.removeAll() + self.processingStatistics.removeAll() print("🧹 キャリブレーションデータをクリアしました") } func clearData(for antennaId: String) { self.measuredDataByAntenna.removeValue(forKey: antennaId) self.calibrationResults.removeValue(forKey: antennaId) + self.rawObservationsByAntenna.removeValue(forKey: antennaId) + self.processingStatistics.removeValue(forKey: antennaId) print("🧹 \(antennaId) のデータをクリアしました") }
🧹 Nitpick comments (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
1-30: LGTM! プラットフォーム条件付きナビゲーションヘルパーの実装が優れています。このヘルパーにより、プラットフォーム固有のコードが効果的に抽象化され、コードベース全体で一貫性が保たれています。実装は明確で保守性が高いです。
オプション: コメントの明確化
より正確な説明にするため、以下の修正を検討してください:
-// iOS用のenum値を列挙型で定義 +// ナビゲーションバーのタイトル表示モードを表す列挙型(iOS用の値をラップ) enum NavigationBarTitleDisplayModeWrapper { case large case inline case automatic } extension View { - /// iOS専用のnavigationBarTitleDisplayModeを条件付きで適用する - /// macOSでは何もしない + /// プラットフォームに応じてナビゲーションバーのタイトル表示モードを適用 + /// - iOS: 指定されたdisplayModeを適用 + /// - その他のプラットフォーム: 何も変更しない @ViewBuilder func navigationBarTitleDisplayModeIfAvailable(UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (1)
4-10: オプション: ドキュメントコメントの簡素化を検討してください。コーディングガイドラインでは「コメントは必要最小限に留める(自己文書化を優先)」とされています。現在のドキュメントコメントは非常に詳細ですが、多くの情報はコードから明らかです。重要な部分(なぜその実装を選択したか、注意点など)にフォーカスすることを検討してください。
例:
-/// アンテナ位置設定画面 -/// -/// フロアマップ上でアンテナデバイスの位置と向きを設定するための画面です。 -/// - フローティングパネルでデバイスの追加・削除・管理 -/// - ドラッグ&ドロップでアンテナの配置 -/// - ダブルタップでアンテナの回転 -/// - キャリブレーション結果の可視化 +/// アンテナ位置設定画面 +/// ドラッグ&ドロップとダブルタップでアンテナの配置と回転を設定 struct AntennaPositioningView: View {コーディングガイドラインより
Also applies to: 153-159, 207-212, 266-273, 386-393, 525-531, 645-652
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (15)
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift(5 hunks)UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift(1 hunks)UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift(1 hunks)UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift(1 hunks)UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift(19 hunks)UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift(3 hunks)UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift(3 hunks)UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift(1 hunks)UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift(1 hunks)UWBViewerSystemTests/SensorDataProcessorTests.swift(1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.swift
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.swift: SwiftFormat(swift-format)ルールに従い、make formatでコード整形を行う
デバッグ用コードやコメントアウトされた古いコードなどの不要なコードは削除する
不要なimport文は削除する
デッドコードは削除し、コメントは必要最小限に留める(自己文書化を優先)
Files:
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swiftUWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swiftUWBViewerSystem/Domain/Utils/SensorDataProcessor.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swiftUWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swiftUWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swiftUWBViewerSystemTests/SensorDataProcessorTests.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swiftUWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift
**/*View.swift
📄 CodeRabbit inference engine (CLAUDE.md)
Viewのファイル名は「〜View.swift」とする
Files:
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swiftUWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swiftUWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
**/*ViewModel.swift
📄 CodeRabbit inference engine (CLAUDE.md)
ViewModelのファイル名は「〜ViewModel.swift」とする
Files:
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift
**/*Usecase.swift
📄 CodeRabbit inference engine (CLAUDE.md)
Usecaseのファイル名は「〜Usecase.swift」とする
Files:
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift
🧠 Learnings (4)
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Applies to **/*View.swift : Viewのファイル名は「〜View.swift」とする
Applied to files:
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swiftUWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: ViewModelはPublished/StateObjectでViewと双方向バインディングする
Applied to files:
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swiftUWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Clean Architecture + MVVMを採用する(データフロー: View→ViewModel→Usecase→Repository)
Applied to files:
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift
📚 Learning: 2025-09-23T15:18:09.790Z
Learnt from: CR
Repo: kajiLabTeam/UWBViewerSystem PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-09-23T15:18:09.790Z
Learning: Applies to Devices/**/*.swift : UWBデバイス関連の通信・制御ロジックはDevices/配下に配置する
Applied to files:
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift
🧬 Code graph analysis (11)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingViewModel.swift (1)
setSwiftDataRepository(69-74)UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
setRouter(32-34)
UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryViewModel.swift (1)
initialize(92-101)
UWBViewerSystem/Presentation/Scenes/SettingsTab/SettingsView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementViewModel.swift (2)
setSwiftDataRepository(45-48)initialize(62-66)UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
setRouter(32-34)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (2)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingViewModel.swift (1)
addAntenna(113-116)
UWBViewerSystem/Presentation/Scenes/SensingTab/SensingView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FloorMapView.swift (1)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)
gridBackground(109-132)
UWBViewerSystemTests/SensorDataProcessorTests.swift (1)
UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift (4)
filterNLOS(120-122)processObservations(60-71)calculateStatistics(192-211)applyMovingAverageToPoints(76-96)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (3)
UWBViewerSystem/Presentation/Components/View+NavigationBarTitleDisplayMode.swift (1)
navigationBarTitleDisplayModeIfAvailable(13-29)UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift (4)
setModelContext(102-110)loadMapAndDevices(155-165)addNewDevice(547-572)showCalibrationResultVisualization(935-999)UWBViewerSystem/Presentation/Router/SensingFlowNavigator.swift (1)
setRouter(32-34)
UWBViewerSystem/Domain/Usecase/AutoAntennaCalibrationUsecase.swift (1)
UWBViewerSystem/Domain/Utils/SensorDataProcessor.swift (2)
processObservations(60-71)calculateStatistics(192-211)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Run Swift Tests
🔇 Additional comments (9)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/PairingSettingPage/PairingSettingView.swift (1)
73-87: LGTM! 統一されたナビゲーション修飾子への移行が適切です。新しい
navigationBarTitleDisplayModeIfAvailableヘルパーの使用により、プラットフォーム固有のコードが適切に抽象化されています。alertとonAppearの適用も、SwiftUI のクロスプラットフォーム対応により問題ありません。UWBViewerSystem/Presentation/Scenes/SensingTab/SensingManagementPage/SensingManagementView.swift (1)
35-48: LGTM! プラットフォーム非依存のナビゲーション処理への移行が完了しています。新しいヘルパーの使用により、コードの保守性が向上しています。フォーマットの調整も適切です。
UWBViewerSystem/Presentation/Scenes/SensingTab/TrajectoryViewPage/TrajectoryView.swift (1)
22-30: LGTM! ナビゲーション修飾子の統一が適切に実装されています。他のビューファイルと一貫性のある変更で、問題ありません。
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)
362-363: LGTM! シート内のナビゲーション修飾子が統一されています。
AddAntennaSheet、SimpleAddAntennaSheet、EditAntennaSheetのすべてで新しいヘルパーが一貫して使用されており、ツールバーの構造も適切に整理されています。アンテナ作成ロジックは保持されています。Also applies to: 499-523, 552-553
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningView.swift (2)
30-35: LGTM! デバイス追加フローとキャリブレーション可視化の統合が適切です。新しいデバイス追加アラートとキャリブレーション結果シートの実装は、適切に構造化されており、ユーザーエクスペリエンスを向上させています。状態管理とバインディングの流れも正確です。
Also applies to: 106-147
51-53: FloatingDeviceListPanel のシグネチャ変更は正しく実装されています。検証結果:
FloatingDeviceListPanelの使用箇所はAntennaPositioningView.swift内の1箇所のみ- 新しい
showingAddDeviceAlertバインディングパラメータが正しく追加され、呼び出し箇所で正しく渡されている- コンポーネント定義で新しいバインディング(539-541行)が正しく定義されている
- コンポーネント内での実装(614-616行付近)で新しいバインディングが正しく使用されている
すべての変更が一貫性を持って実装されており、他に更新すべき箇所はありません。
UWBViewerSystem/Presentation/Scenes/FloorMapTab/AntennaPositioningPage/AntennaPositioningViewModel.swift (2)
18-27: LGTM! キャリブレーション可視化のための状態管理が適切に追加されています。
CalibrationResultData構造体は、タグ位置と初期/キャリブレーション後のアンテナ位置を保持するための明確な設計となっています。hasCalibrationData計算プロパティも適切です。Also applies to: 71-74
933-999: LGTM! キャリブレーション結果の可視化ロジックが正確に実装されています。座標変換(正規化座標から実世界座標への変換)が正しく処理されており、Y軸の反転(
1.0 - y)も適切に考慮されています。デフォルト位置の処理(フロアマップの中央に配置)も合理的です。UWBViewerSystemTests/SensorDataProcessorTests.swift (1)
1-298: LGTM! SensorDataProcessor の包括的なテストスイートが実装されています。テストカバレッジは優れており、以下の項目が適切にカバーされています:
- トリミング(通常ケースとデータ不足のエッジケース)
- 移動平均(通常ケースと大きなウィンドウサイズのエッジケース)
- nLoS フィルタリング(有効/無効の両方)
- 統計情報の計算
- エンドツーエンドの処理パイプライン
テストデータの生成も現実的で、アサーションも明確です。
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
Show resolved
Hide resolved
- CalibrationCSVLoader.swift: angleColumnIndexの境界チェックを追加し、配列アクセス前の検証を強化 - CalibrationResultVisualizationView.swift: calculateScale()の縦横比計算を修正し、要素がキャンバス外にレンダリングされる問題を解決 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (5)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (4)
3-10: ドキュメントコメントを簡潔にすることを検討してくださいコーディングガイドラインではコメントは必要最小限に留め、自己文書化を優先することが推奨されています。現在のドキュメントコメントは詳細すぎる可能性があります。構造体名とプロパティ名から機能が明確であれば、コメントを簡略化できます。
以下のように簡潔にすることを検討してください:
-/// キャリブレーション結果を可視化するビューコンポーネント -/// -/// Pythonの`visualize_calibration_result`関数と同等の機能を提供します。 -/// - タグの既知位置を青色のマーカーで表示 -/// - 初期アンテナ位置をオレンジ色の三角形で表示 -/// - キャリブレーション後のアンテナ位置を赤色の三角形で表示 -/// - アンテナの向きを矢印で表示 -/// - 初期位置からの移動を灰色の点線矢印で表示 +/// キャリブレーション結果を2D空間で可視化 struct CalibrationResultVisualizationView: View {As per coding guidelines
57-74: 冗長な境界チェックを削除できます
zipは既に短い方の配列の長さまでしか要素を返さないため、63-64行目の境界チェックは冗長です。zipの結果を反復処理する際、インデックスは常に両方の配列の範囲内にあることが保証されています。以下のように簡略化できます:
if self.showInitialPositions { ForEach( Array( zip(self.initialAntennaPositions.indices, self.calibratedAntennaPositions.indices) ), id: \.0 ) { initialIndex, calibratedIndex in - if initialIndex < self.initialAntennaPositions.count - && calibratedIndex < self.calibratedAntennaPositions.count - { - self.movementArrow( - from: self.initialAntennaPositions[initialIndex], - to: self.calibratedAntennaPositions[calibratedIndex], - scale: scale, - size: size - ) - } + self.movementArrow( + from: self.initialAntennaPositions[initialIndex], + to: self.calibratedAntennaPositions[calibratedIndex], + scale: scale, + size: size + ) } }
88-110: グリッド背景の重複を検討してください
FieldSettingView.swiftにも類似のグリッド背景実装があります。共通コンポーネントとして抽出することで、コードの重複を削減し、保守性を向上できます。ただし、実装の詳細(ピクセルベース vs 分割ベース)が異なるため、現状のままでも問題ありません。
162-162: ラベルオフセットの定数化を検討してくださいマジックナンバー(2, 3)を使用したオフセット計算が複数箇所にあります。定数として抽出することで可読性と保守性が向上します。
例:
private let tagLabelOffsetX: CGFloat = 1.0 // markerSize の倍数 private let tagLabelOffsetY: CGFloat = 1.0 private let initialAntennaLabelOffsetX: CGFloat = -3.0 // antennaSize の倍数 private let initialAntennaLabelOffsetY: CGFloat = -2.0 private let calibratedAntennaLabelOffsetX: CGFloat = 2.0 private let calibratedAntennaLabelOffsetY: CGFloat = -1.0そして使用箇所で:
.offset(x: self.markerSize * self.tagLabelOffsetX, y: self.markerSize * self.tagLabelOffsetY)Also applies to: 207-207, 255-255
UWBViewerSystem.xcodeproj/project.pbxproj (1)
421-424: プライバシー説明文をより具体的にすることを推奨します。Bluetooth、ローカルネットワーク、および位置情報の使用許可説明が追加されていますが、説明文がやや一般的です。ユーザーがなぜこれらの権限が必要なのかを理解しやすくするため、より具体的な説明を検討してください。
例:
NSBluetoothAlwaysUsageDescription: "UWB通信により近くのデバイスとの距離測定を行うために使用します"NSLocalNetworkUsageDescription: "ローカルネットワーク上のUWBデバイスと通信するために使用します"NSLocationWhenInUseUsageDescription: "UWBによる位置測定機能を利用するために使用します"現在の実装でも機能しますが、より詳細な説明はユーザーエクスペリエンスを向上させます。
Also applies to: 456-459
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
UWBViewerSystem.xcodeproj/project.pbxproj(2 hunks)UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift(1 hunks)UWBViewerSystem/Info.plist(0 hunks)UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift(1 hunks)
💤 Files with no reviewable changes (1)
- UWBViewerSystem/Info.plist
🚧 Files skipped from review as they are similar to previous changes (1)
- UWBViewerSystem/Domain/Utils/CalibrationCSVLoader.swift
🧰 Additional context used
📓 Path-based instructions (2)
**/*.swift
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.swift: SwiftFormat(swift-format)ルールに従い、make formatでコード整形を行う
デバッグ用コードやコメントアウトされた古いコードなどの不要なコードは削除する
不要なimport文は削除する
デッドコードは削除し、コメントは必要最小限に留める(自己文書化を優先)
Files:
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
**/*View.swift
📄 CodeRabbit inference engine (CLAUDE.md)
Viewのファイル名は「〜View.swift」とする
Files:
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift
🧬 Code graph analysis (1)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (1)
UWBViewerSystem/Presentation/Scenes/FloorMapTab/FieldSettingPage/FieldSettingView.swift (1)
gridBackground(109-132)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Run Swift Tests
🔇 Additional comments (4)
UWBViewerSystem/Presentation/Components/CalibrationResultVisualizationView.swift (3)
315-325: スケール計算が正しく修正されています過去のレビューコメントで指摘されたスケール計算の問題が適切に修正されています。現在の実装は:
- 幅と高さの両方のスケールを計算
- より制約の厳しい軸(最大値)を採用して縦横比を保持
- ゼロ除算を防ぐガード句を実装
これにより、要素が画面外にはみ出す問題が解決されています。
340-364: サポート型の実装が適切です
TagPosition、AntennaCalibrationPosition、Triangleの実装は明確で、必要なプロトコルに準拠しています。構造が簡潔で、各型の責務が明確です。
368-414: プレビュー実装が適切ですプレビューには適切なサンプルデータが含まれており、開発時の動作確認に役立ちます。初期位置とキャリブレーション後の位置の両方を表示することで、ビューの全機能を確認できます。
UWBViewerSystem.xcodeproj/project.pbxproj (1)
431-431: バンドル識別子の変更理由を説明してください。バンドル識別子が
net.harutiro.UWBViewerSystemからnet.harutiro.UWBViewerSystem3に変更されています(行431および466、Debug・Release両構成)。このバンドル識別子の変更により以下の影響が生じます:
- 既存のアプリケーションデータやインストールとの互換性が失われる
- プロビジョニングプロファイルやApp Store Connectの設定が無効になる可能性がある
- 「3」というサフィックスの追加理由が明確でない
このバンドル識別子の変更がプルリクエストの意図に沿ったものであるか、またはその必要性について確認が必要です。キャリブレーション機能の追加とは無関係に見えるため、この変更の目的を明確にしてください。
| COMBINE_HIDPI_IMAGES = YES; | ||
| CURRENT_PROJECT_VERSION = 1; | ||
| DEVELOPMENT_TEAM = HK6A3CR45M; | ||
| DEVELOPMENT_TEAM = 8V93G3Y2W5; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
開発チームIDの不整合を修正してください。
メインターゲット(UWBViewerSystem)の開発チームIDが8V93G3Y2W5に変更されていますが、プロジェクトレベルの設定(Line 322, 386)とテストターゲット(Lines 483, 501, 518, 534)ではまだHK6A3CR45Mのままです。この不整合により、コード署名やプロビジョニングプロファイルの問題が発生する可能性があります。
すべてのターゲットで同じ開発チームIDを使用することを推奨します。
以下のスクリプトを実行して、すべてのDEVELOPMENT_TEAM設定を確認してください:
Also applies to: 451-451
🏁 Script executed:
#!/bin/bash
# Description: すべてのDEVELOPMENT_TEAM設定を確認する
rg -n 'DEVELOPMENT_TEAM = ' UWBViewerSystem.xcodeproj/project.pbxprojLength of output: 311
開発チームIDの不整合を修正してください。
メインターゲット(UWBViewerSystem)の開発チームIDが8V93G3Y2W5に変更されていますが、プロジェクトレベル(行322, 386)とテストターゲット(行483, 501, 518, 534)ではHK6A3CR45Mのままです。この不整合はコード署名に失敗したり、テスト実行時にプロビジョニングプロファイルエラーを引き起こす可能性があります。
すべてのターゲットで同じ開発チームIDを統一することが必須です。
Summary by CodeRabbit
新機能
改善
テスト