You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.0 KiB
88 lines
3.0 KiB
import numpy as np
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# Add project root and ISOLATE paths
|
|
project_root = Path(__file__).parent.parent.parent
|
|
sys.path.append(str(project_root))
|
|
sys.path.append(str(project_root / 'scripts' / 'ISOLATE'))
|
|
|
|
try:
|
|
from scripts.ISOLATE.model_wrapper import ShenronRadarModel
|
|
print("✅ Model Import: SUCCESS")
|
|
except Exception as e:
|
|
print(f"❌ Model Import: FAILED ({e})")
|
|
sys.exit(1)
|
|
|
|
def verify_signal_flow(frame_idx=190):
|
|
print(f"\n--- 🛰️ Radar Lab Verification (Frame {frame_idx}) ---")
|
|
|
|
# 1. Initialize Engine
|
|
try:
|
|
model = ShenronRadarModel(radar_type='awrl1432')
|
|
print(f"✅ Engine Init: awrl1432 (Gain: {model.radar_obj.gain}dB)")
|
|
except Exception as e:
|
|
print(f"❌ Engine Init: FAILED ({e})")
|
|
return
|
|
|
|
# 2. Load Real LiDAR Data
|
|
lidar_path = project_root / 'Shenron_debug' / 'logs' / 'lidar' / f"frame_{frame_idx:06d}.npy"
|
|
if not lidar_path.exists():
|
|
print(f"❌ Lidar Data: NOT FOUND at {lidar_path}")
|
|
return
|
|
|
|
data = np.load(lidar_path)
|
|
# Pad to 7-col [x,y,z,int,cos,obj,tag] if old 6-col format
|
|
if data.shape[1] == 6:
|
|
padded = np.zeros((data.shape[0], 7), dtype=np.float32)
|
|
padded[:, 0:3] = data[:, 0:3]
|
|
padded[:, 4:7] = data[:, 3:6]
|
|
data = padded
|
|
print(f"✅ Lidar Data Loaded: {data.shape[0]} points")
|
|
|
|
# 3. Process Frame
|
|
try:
|
|
pcd = model.process(data)
|
|
print(f"✅ Signal Process: SUCCESS ({len(pcd)} detections)")
|
|
except Exception as e:
|
|
print(f"❌ Signal Process: FAILED ({e})")
|
|
return
|
|
|
|
# 4. Verify Metrology Extraction
|
|
try:
|
|
met = model.get_last_metrology()
|
|
keys = met.keys()
|
|
expected = ["rd_heatmap", "ra_heatmap", "threshold_matrix"]
|
|
|
|
status = True
|
|
for k in expected:
|
|
if k not in keys:
|
|
print(f"❌ Metrology Key Missing: {k}")
|
|
status = False
|
|
else:
|
|
val = met[k]
|
|
if np.max(val) <= 0:
|
|
print(f"❌ Metrology Data Null: {k} (Max: {np.max(val)})")
|
|
status = False
|
|
|
|
if status:
|
|
print("✅ Metrology Extraction: ALL KEYS VALID")
|
|
print(f" -> RD Heatmap: {met['rd_heatmap'].shape} (Peak Power: {np.max(met['rd_heatmap']):.2e})")
|
|
print(f" -> RA Heatmap: {met['ra_heatmap'].shape} (Peak Power: {np.max(met['ra_heatmap']):.2e})")
|
|
print(f" -> CFAR Threshold: {met['threshold_matrix'].shape} (Mean: {np.mean(met['threshold_matrix']):.2e})")
|
|
|
|
except Exception as e:
|
|
print(f"❌ Metrology Extraction: FAILED ({e})")
|
|
|
|
# 5. Verify Signal Metrics
|
|
try:
|
|
metrics = model.get_signal_metrics()
|
|
print(f"✅ Signal Metrics: {metrics}")
|
|
if metrics['peak_snr_db'] <= 0:
|
|
print("⚠️ WARNING: Very low SNR detected (< 0dB). Check gain.")
|
|
except Exception as e:
|
|
print(f"❌ Signal Metrics: FAILED ({e})")
|
|
|
|
if __name__ == "__main__":
|
|
verify_signal_flow(190)
|