new GPR
This commit is contained in:
@@ -74,11 +74,13 @@ _WEB_LIVE_SCHEMA = [
|
||||
("gpr_visible_x_max_m", "Visible window", _GPR_MODES, _dual("_gpr_visible_x_max_m", "_legacy_gpr_visible_x_max_m")),
|
||||
("gpr_visible_z_min_m", "Visible window", _GPR_MODES, _dual("_gpr_visible_z_min_m", "_legacy_gpr_visible_z_min_m")),
|
||||
("gpr_visible_z_max_m", "Visible window", _GPR_MODES, _dual("_gpr_visible_z_max_m", "_legacy_gpr_visible_z_max_m")),
|
||||
("gpr_look_angle_deg", "Motion", ("legacy_gpr",), _attr("_legacy_gpr_look_angle_deg")),
|
||||
("gpr_motion_mode", "Motion", ("gpr",), _attr("_gpr_motion_mode")),
|
||||
("gpr_look_angle_deg", "Motion", _GPR_MODES, _dual("_gpr_look_angle_deg", "_legacy_gpr_look_angle_deg")),
|
||||
("gpr_direction_sign", "Motion", ("gpr",), _attr("_gpr_direction_sign")),
|
||||
("gpr_apply_freq_phase_correction", "Motion", ("legacy_gpr",), _attr("_legacy_gpr_apply_freq_phase_correction")),
|
||||
("gpr_reference_mode", "Motion", ("legacy_gpr",), _attr("_legacy_gpr_reference_mode")),
|
||||
("ignore_socket_speed", "Motion", ("legacy_gpr",), _attr("_legacy_gpr_ignore_socket_speed_enabled")),
|
||||
("gpr_speed_m_s", "Motion", ("legacy_gpr",), _attr("_legacy_gpr_speed_m_s")),
|
||||
("ignore_socket_speed", "Motion", _GPR_MODES, _dual("_gpr_ignore_socket_speed_enabled", "_legacy_gpr_ignore_socket_speed_enabled")),
|
||||
("gpr_speed_m_s", "Motion", _GPR_MODES, _dual("_gpr_speed_m_s", "_legacy_gpr_speed_m_s")),
|
||||
]
|
||||
_WEB_LIVE_GETTERS = {field: getter for field, _group, _modes, getter in _WEB_LIVE_SCHEMA}
|
||||
|
||||
@@ -93,7 +95,6 @@ _NON_WIDGET_LIVE_FIELDS = frozenset({
|
||||
"reprocess_current_result",
|
||||
"history_command",
|
||||
"history_command_seq",
|
||||
"gpr_direction_sign",
|
||||
})
|
||||
|
||||
# Display toggles: GUI-only rendering choices (kept in the GUI profile, not the live
|
||||
|
||||
@@ -293,6 +293,11 @@ class AppWindowConfigProfileIOMixin:
|
||||
self._gpr_range_comp_power,
|
||||
self._gpr_angle_comp_power,
|
||||
self._gpr_score_mode,
|
||||
self._gpr_motion_mode,
|
||||
self._gpr_look_angle_deg,
|
||||
self._gpr_direction_sign,
|
||||
self._gpr_ignore_socket_speed_enabled,
|
||||
self._gpr_speed_m_s,
|
||||
self._gpr_max_detected_objects_to_draw,
|
||||
self._gpr_draw_top_m_objects,
|
||||
self._gpr_start_freq_mhz,
|
||||
@@ -453,6 +458,13 @@ class AppWindowConfigProfileIOMixin:
|
||||
self._gpr_range_comp_power.setValue(float(gui_state.processing.gpr.range_comp_power))
|
||||
self._gpr_angle_comp_power.setValue(float(gui_state.processing.gpr.angle_comp_power))
|
||||
self._set_combo_current_text(self._gpr_score_mode, gui_state.processing.gpr.score_mode)
|
||||
self._set_combo_current_text(self._gpr_motion_mode, gui_state.processing.gpr.motion_mode)
|
||||
self._gpr_look_angle_deg.setValue(float(gui_state.processing.gpr.look_angle_deg))
|
||||
self._gpr_direction_sign.setValue(float(gui_state.processing.gpr.direction_sign))
|
||||
self._gpr_ignore_socket_speed_enabled.setChecked(
|
||||
bool(gui_state.processing.gpr.ignore_socket_speed_enabled)
|
||||
)
|
||||
self._gpr_speed_m_s.setValue(float(gui_state.processing.gpr.speed_m_s))
|
||||
self._gpr_max_detected_objects_to_draw.setValue(
|
||||
int(gui_state.processing.gpr.max_detected_objects_to_draw)
|
||||
)
|
||||
|
||||
@@ -223,9 +223,14 @@ class AppWindowConfigStateBuildersMixin:
|
||||
output_positions=self._default_gpr_output_positions_from_config(config),
|
||||
min_depth_m=2.0,
|
||||
max_depth_m=14.0,
|
||||
range_comp_power=0.28,
|
||||
angle_comp_power=0.10,
|
||||
range_comp_power=0.1,
|
||||
angle_comp_power=0.0,
|
||||
score_mode="combined",
|
||||
motion_mode="int_minus",
|
||||
look_angle_deg=0.0,
|
||||
direction_sign=1.0,
|
||||
speed_m_s=0.0,
|
||||
ignore_socket_speed_enabled=False,
|
||||
max_detected_objects_to_draw=5,
|
||||
draw_top_m_objects=2,
|
||||
start_freq_mhz=3000.0,
|
||||
@@ -347,6 +352,11 @@ class AppWindowConfigStateBuildersMixin:
|
||||
range_comp_power=float(self._gpr_range_comp_power.value()),
|
||||
angle_comp_power=float(self._gpr_angle_comp_power.value()),
|
||||
score_mode=self._gpr_score_mode.currentText(),
|
||||
motion_mode=self._gpr_motion_mode.currentText(),
|
||||
look_angle_deg=float(self._gpr_look_angle_deg.value()),
|
||||
direction_sign=float(self._gpr_direction_sign.value()),
|
||||
speed_m_s=float(self._gpr_speed_m_s.value()),
|
||||
ignore_socket_speed_enabled=bool(self._gpr_ignore_socket_speed_enabled.isChecked()),
|
||||
max_detected_objects_to_draw=int(self._gpr_max_detected_objects_to_draw.value()),
|
||||
draw_top_m_objects=int(self._gpr_draw_top_m_objects.value()),
|
||||
start_freq_mhz=float(self._gpr_start_freq_mhz.value()),
|
||||
|
||||
@@ -234,6 +234,48 @@ def build_processing_group(owner) -> QGroupBox:
|
||||
owner._gpr_score_mode.addItems(["peak", "combined"])
|
||||
owner._set_combo_current_text(owner._gpr_score_mode, gpr_live_defaults.score_mode)
|
||||
|
||||
owner._gpr_motion_mode = QComboBox()
|
||||
owner._gpr_motion_mode.addItems(["int_minus", "int_focus"])
|
||||
owner._set_combo_current_text(owner._gpr_motion_mode, gpr_live_defaults.motion_mode)
|
||||
owner._gpr_motion_mode.setToolTip(
|
||||
"Intra-sweep speed correction before the IFFT. int_minus: full correction; "
|
||||
"int_focus: focusing residual only (no net Z shift)."
|
||||
)
|
||||
|
||||
owner._gpr_look_angle_deg = QDoubleSpinBox()
|
||||
owner._gpr_look_angle_deg.setDecimals(2)
|
||||
owner._gpr_look_angle_deg.setRange(-90.0, 90.0)
|
||||
owner._gpr_look_angle_deg.setSingleStep(0.5)
|
||||
owner._gpr_look_angle_deg.setValue(float(gpr_live_defaults.look_angle_deg))
|
||||
owner._gpr_look_angle_deg.setToolTip(
|
||||
"Radar look angle vs the range axis (deg). Used by intra-sweep motion correction."
|
||||
)
|
||||
|
||||
owner._gpr_direction_sign = QDoubleSpinBox()
|
||||
owner._gpr_direction_sign.setDecimals(0)
|
||||
owner._gpr_direction_sign.setRange(-1.0, 1.0)
|
||||
owner._gpr_direction_sign.setSingleStep(2.0)
|
||||
owner._gpr_direction_sign.setValue(float(gpr_live_defaults.direction_sign))
|
||||
owner._gpr_direction_sign.setToolTip(
|
||||
"Motion direction along range: +1 (later frequencies deeper) or -1 (shallower)."
|
||||
)
|
||||
|
||||
owner._gpr_ignore_socket_speed_enabled = QCheckBox("Ignore socket speed")
|
||||
owner._gpr_ignore_socket_speed_enabled.setChecked(bool(gpr_live_defaults.ignore_socket_speed_enabled))
|
||||
owner._gpr_ignore_socket_speed_enabled.setToolTip(
|
||||
"When checked, use the speed below for motion correction instead of the "
|
||||
"value streamed over the locator socket."
|
||||
)
|
||||
|
||||
owner._gpr_speed_m_s = QDoubleSpinBox()
|
||||
owner._gpr_speed_m_s.setDecimals(3)
|
||||
owner._gpr_speed_m_s.setRange(-100.0, 100.0)
|
||||
owner._gpr_speed_m_s.setSingleStep(0.05)
|
||||
owner._gpr_speed_m_s.setValue(float(gpr_live_defaults.speed_m_s))
|
||||
owner._gpr_speed_m_s.setToolTip(
|
||||
"Radar speed (m/s) used by intra-sweep motion correction when 'Ignore socket speed' is on."
|
||||
)
|
||||
|
||||
owner._gpr_max_detected_objects_to_draw = QSpinBox()
|
||||
owner._gpr_max_detected_objects_to_draw.setRange(0, 10_000)
|
||||
owner._gpr_max_detected_objects_to_draw.setValue(int(gpr_live_defaults.max_detected_objects_to_draw))
|
||||
@@ -317,6 +359,11 @@ def build_processing_group(owner) -> QGroupBox:
|
||||
("Range comp power", owner._gpr_range_comp_power),
|
||||
("Angle comp power", owner._gpr_angle_comp_power),
|
||||
("Score mode", owner._gpr_score_mode),
|
||||
("Motion mode", owner._gpr_motion_mode),
|
||||
("Look angle deg", owner._gpr_look_angle_deg),
|
||||
("Direction sign", owner._gpr_direction_sign),
|
||||
owner._gpr_ignore_socket_speed_enabled,
|
||||
("Speed m/s", owner._gpr_speed_m_s),
|
||||
("Render mode", owner._gpr_render_mode),
|
||||
("Min visible score", owner._gpr_min_visible_score),
|
||||
("Max detected objects", owner._gpr_max_detected_objects_to_draw),
|
||||
@@ -524,6 +571,11 @@ def build_processing_group(owner) -> QGroupBox:
|
||||
owner._gpr_range_comp_power.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_angle_comp_power.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_score_mode.currentTextChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_motion_mode.currentTextChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_look_angle_deg.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_direction_sign.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_ignore_socket_speed_enabled.toggled.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_speed_m_s.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_start_freq_mhz.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_stop_freq_mhz.valueChanged.connect(owner._on_processing_live_settings_changed)
|
||||
owner._gpr_background_subtract_enabled.toggled.connect(owner._on_processing_live_settings_changed)
|
||||
|
||||
@@ -288,6 +288,36 @@ def gui_profile_from_dict(payload: dict[str, Any]) -> GuiProfileModel:
|
||||
gui.processing.gpr.score_mode,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
motion_mode=_optional_string(
|
||||
gpr_object,
|
||||
"motion_mode",
|
||||
gui.processing.gpr.motion_mode,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
look_angle_deg=_optional_float(
|
||||
gpr_object,
|
||||
"look_angle_deg",
|
||||
gui.processing.gpr.look_angle_deg,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
direction_sign=_optional_float(
|
||||
gpr_object,
|
||||
"direction_sign",
|
||||
gui.processing.gpr.direction_sign,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
speed_m_s=_optional_float(
|
||||
gpr_object,
|
||||
"speed_m_s",
|
||||
gui.processing.gpr.speed_m_s,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
ignore_socket_speed_enabled=_optional_bool(
|
||||
gpr_object,
|
||||
"ignore_socket_speed_enabled",
|
||||
gui.processing.gpr.ignore_socket_speed_enabled,
|
||||
"gui.processing.gpr",
|
||||
),
|
||||
max_detected_objects_to_draw=_optional_int(
|
||||
gpr_object,
|
||||
"max_detected_objects_to_draw",
|
||||
@@ -425,6 +455,8 @@ def gui_profile_from_dict(payload: dict[str, Any]) -> GuiProfileModel:
|
||||
raise ValueError("gui.processing.gpr.render_mode must be one of: heatmap, objects_only")
|
||||
if gui.processing.gpr.score_mode not in {"peak", "combined"}:
|
||||
raise ValueError("gui.processing.gpr.score_mode must be one of: peak, combined")
|
||||
if gui.processing.gpr.motion_mode not in {"int_minus", "int_focus"}:
|
||||
raise ValueError("gui.processing.gpr.motion_mode must be one of: int_minus, int_focus")
|
||||
if gui.processing.legacy_gpr.mode not in {"point", "extended"}:
|
||||
raise ValueError("gui.processing.legacy_gpr.mode must be one of: point, extended")
|
||||
if gui.processing.legacy_gpr.render_mode not in {"heatmap", "objects_only"}:
|
||||
@@ -550,6 +582,11 @@ def gui_profile_to_dict(model: GuiProfileModel) -> dict[str, Any]:
|
||||
"range_comp_power": gui.processing.gpr.range_comp_power,
|
||||
"angle_comp_power": gui.processing.gpr.angle_comp_power,
|
||||
"score_mode": gui.processing.gpr.score_mode,
|
||||
"motion_mode": gui.processing.gpr.motion_mode,
|
||||
"look_angle_deg": gui.processing.gpr.look_angle_deg,
|
||||
"direction_sign": gui.processing.gpr.direction_sign,
|
||||
"speed_m_s": gui.processing.gpr.speed_m_s,
|
||||
"ignore_socket_speed_enabled": gui.processing.gpr.ignore_socket_speed_enabled,
|
||||
"max_detected_objects_to_draw": gui.processing.gpr.max_detected_objects_to_draw,
|
||||
"draw_top_m_objects": gui.processing.gpr.draw_top_m_objects,
|
||||
"start_freq_mhz": gui.processing.gpr.start_freq_mhz,
|
||||
|
||||
@@ -58,9 +58,17 @@ class GuiGprStateModel:
|
||||
output_positions: str = ""
|
||||
min_depth_m: float = 2.0
|
||||
max_depth_m: float = 14.0
|
||||
range_comp_power: float = 0.28
|
||||
angle_comp_power: float = 0.10
|
||||
range_comp_power: float = 0.1
|
||||
angle_comp_power: float = 0.0
|
||||
score_mode: str = "combined"
|
||||
motion_mode: str = "int_minus"
|
||||
# Intra-sweep motion-correction inputs. Sweep time is derived from acquisition
|
||||
# metadata; speed comes from the socket unless `ignore_socket_speed_enabled`,
|
||||
# in which case `speed_m_s` from here is used.
|
||||
look_angle_deg: float = 0.0
|
||||
direction_sign: float = 1.0
|
||||
speed_m_s: float = 0.0
|
||||
ignore_socket_speed_enabled: bool = False
|
||||
max_detected_objects_to_draw: int = 5
|
||||
draw_top_m_objects: int = 2
|
||||
start_freq_mhz: float = 3000.0
|
||||
|
||||
@@ -31,10 +31,14 @@ class ProcessingLiveConfig:
|
||||
gpr_output_positions: list[int] | None = None
|
||||
gpr_min_depth_m: float = 2.0
|
||||
gpr_max_depth_m: float = 14.0
|
||||
gpr_range_comp_power: float = 0.28
|
||||
gpr_angle_comp_power: float = 0.10
|
||||
gpr_range_comp_power: float = 0.1
|
||||
gpr_angle_comp_power: float = 0.0
|
||||
gpr_comp_power: float = 0.2
|
||||
gpr_score_mode: str = "combined"
|
||||
# Backprojection intra-sweep speed-correction mode: "int_minus" (full
|
||||
# correction) or "int_focus" (focusing residual only). Mirrors Python
|
||||
# Horns_motion_3libre.py MOTION_CORRECTION_MODE.
|
||||
gpr_motion_mode: str = "int_minus"
|
||||
gpr_max_detected_objects_to_draw: int = 5
|
||||
gpr_draw_top_m_objects: int = 2
|
||||
gpr_speed_m_s: float = 0.0
|
||||
@@ -108,6 +112,7 @@ class ProcessingLiveConfig:
|
||||
"gpr_angle_comp_power": float(self.gpr_angle_comp_power),
|
||||
"gpr_comp_power": float(self.gpr_comp_power),
|
||||
"gpr_score_mode": str(self.gpr_score_mode),
|
||||
"gpr_motion_mode": str(self.gpr_motion_mode),
|
||||
"gpr_max_detected_objects_to_draw": int(self.gpr_max_detected_objects_to_draw),
|
||||
"gpr_draw_top_m_objects": int(self.gpr_draw_top_m_objects),
|
||||
"gpr_speed_m_s": float(self.gpr_speed_m_s),
|
||||
|
||||
Reference in New Issue
Block a user