feat(k1): complete primary acquisition lifecycle

This commit is contained in:
DCCONSTRUCTIONS
2026-07-17 23:03:59 +03:00
parent 9d51080d2e
commit aa3680948f
66 changed files with 6093 additions and 544 deletions
+45
View File
@@ -24,6 +24,12 @@ class MetricsSnapshot(TypedDict):
mqtt_to_publish_p95_ms: float | None
decode_publish_ms: float | None
trajectory_poses: int
device_elapsed_seconds: float | None
device_route_distance_meters: float | None
device_speed_meters_per_second: float | None
device_pgo_progress: int | None
modeling_reports: int
modeling_decode_errors: int
class BridgeMetrics:
@@ -44,6 +50,12 @@ class BridgeMetrics:
self._pose_times: deque[int] = deque()
self._latencies_ms: deque[float] = deque(maxlen=512)
self._decode_publish_ms: float | None = None
self._device_elapsed_seconds: float | None = None
self._device_route_distance_meters: float | None = None
self._device_speed_meters_per_second: float | None = None
self._device_pgo_progress: int | None = None
self._modeling_reports = 0
self._modeling_decode_errors = 0
def received(self, payload_bytes: int) -> None:
with self._lock:
@@ -81,6 +93,33 @@ class BridgeMetrics:
with self._lock:
self._preview_dropped += 1
def acquisition_telemetry(
self,
*,
elapsed_seconds: float,
route_distance_meters: float,
speed_meters_per_second: float,
pgo_progress: int,
) -> None:
values = (elapsed_seconds, route_distance_meters, speed_meters_per_second)
if any(not math.isfinite(value) or value < 0 for value in values):
return
if pgo_progress < 0:
return
with self._lock:
self._device_elapsed_seconds = elapsed_seconds
# This is the device's current scan generation. FW 3.0.2 resets
# ScanTime and MoveDistance together; carrying an earlier project's
# route across that boundary would be false precision.
self._device_route_distance_meters = route_distance_meters
self._device_speed_meters_per_second = speed_meters_per_second
self._device_pgo_progress = pgo_progress
self._modeling_reports += 1
def modeling_decode_error(self) -> None:
with self._lock:
self._modeling_decode_errors += 1
def snapshot(self) -> MetricsSnapshot:
now_ns = time.monotonic_ns()
with self._lock:
@@ -106,6 +145,12 @@ class BridgeMetrics:
"mqtt_to_publish_p95_ms": _rounded(p95),
"decode_publish_ms": _rounded(self._decode_publish_ms),
"trajectory_poses": self._trajectory_poses,
"device_elapsed_seconds": _rounded(self._device_elapsed_seconds),
"device_route_distance_meters": _rounded(self._device_route_distance_meters),
"device_speed_meters_per_second": _rounded(self._device_speed_meters_per_second),
"device_pgo_progress": self._device_pgo_progress,
"modeling_reports": self._modeling_reports,
"modeling_decode_errors": self._modeling_decode_errors,
}