feat(perception): qualify world-frame motion tracking

This commit is contained in:
DCCONSTRUCTIONS
2026-07-24 11:17:10 +03:00
parent 23181c867b
commit e6dd8c2cf1
8 changed files with 1828 additions and 0 deletions
+4
View File
@@ -37,9 +37,11 @@ from .jobs import (
from .lab_instances import (
PublishedIntegratedLabInstance,
PublishedTemporalLabInstance,
PublishedWorldMotionLabInstance,
publish_e21_lab_instance,
publish_e22_lab_instance,
publish_e23_lab_instance,
publish_e24_lab_instance,
publish_integrated_lab_instance,
)
from .live_perception import (
@@ -119,6 +121,7 @@ __all__ = [
"IntegratedPerceptionOverlayStore",
"PublishedIntegratedLabInstance",
"PublishedTemporalLabInstance",
"PublishedWorldMotionLabInstance",
"IntegratedPerceptionResult",
"LiveReplayQualificationResult",
"MultiratePerceptionArtifact",
@@ -150,6 +153,7 @@ __all__ = [
"publish_e21_lab_instance",
"publish_e22_lab_instance",
"publish_e23_lab_instance",
"publish_e24_lab_instance",
"publish_integrated_lab_instance",
"validate_multirate_perception_qualification_result",
"prepare_recorded_qualification_slice",
+113
View File
@@ -33,6 +33,7 @@ from .temporal_stability import (
_quality_metrics,
build_temporal_stability_result,
)
from .world_motion import WorldMotionBuild, build_world_motion_result
@dataclass(frozen=True, slots=True)
@@ -50,6 +51,14 @@ class PublishedTemporalLabInstance:
build: TemporalStabilityBuild
@dataclass(frozen=True, slots=True)
class PublishedWorldMotionLabInstance:
binding: LabSessionBinding
job: CameraComputeJob
result: IntegratedPerceptionResult
build: WorldMotionBuild
def publish_integrated_lab_instance(
*,
repository_root: Path,
@@ -477,6 +486,110 @@ def publish_e23_lab_instance(
)
def publish_e24_lab_instance(
*,
repository_root: Path,
source_result_root: Path,
profile_path: Path,
benchmark_path: Path,
lab_session_id: str,
lab_id: str,
display_name: str,
) -> PublishedWorldMotionLabInstance:
"""Derive and publish a bounded world-frame motion-tracking LAB run."""
root = repository_root.expanduser().resolve(strict=True)
jobs_root = root / ".runtime" / "compute-jobs"
results_root = root / ".runtime" / "compute-experiments" / "e10" / "worker-results"
packs_root = root / ".runtime" / "compute-experiments" / "e10" / "lidar-packs"
source_path = source_result_root.expanduser().resolve(strict=True)
source_document = _read_object(source_path / "result.json", source_path)
identity = source_document.get("identity")
if not isinstance(identity, dict) or not isinstance(identity.get("job_id"), str):
raise SessionIntegrityError("E24 source has no job identity")
source = validate_integrated_perception_result(
jobs_root / identity["job_id"],
source_path,
packs_root,
)
if not source.accepted:
raise SessionIntegrityError("E24 source result is not accepted")
lab_job = _publish_lab_job(source.job, jobs_root, lab_session_id)
lab_pack = _publish_lab_pack(source, lab_job, packs_root, lab_session_id)
build = build_world_motion_result(
source=source,
lab_job=lab_job,
lab_pack=lab_pack,
results_root=results_root,
profile_path=profile_path,
benchmark_path=benchmark_path,
)
validated = validate_integrated_perception_result(
lab_job.job_root,
build.result_root,
packs_root,
)
if not validated.accepted:
failed = [
name for name, accepted in build.report["acceptance"]["checks"].items() if not accepted
]
raise SessionIntegrityError(
f"E24 world-motion artifact acceptance failed: {', '.join(failed)}"
)
store = SessionStore(root)
source_lab = store.get_lab_instance(source.job.session_id)
source_session_id = (
source.job.session_id if source_lab is None else source_lab.source_session_id
)
publish_lab_replay_cache(
store.data_dir,
source_session_id=source_session_id,
lab_session_id=lab_session_id,
timeline_start_ns=round(validated.timeline_start_seconds * 1_000_000_000),
timeline_end_ns=round(validated.timeline_end_seconds * 1_000_000_000),
)
metrics = build.report["metrics"]
binding = store.publish_lab_instance(
session_id=lab_session_id,
source_session_id=source_session_id,
display_name=display_name,
lab_id=lab_id,
result_kind="e24-world-motion",
result_id=validated.result_id,
source_result_id=source.result_id,
config_sha256=build.profile_sha256,
run_created_at_utc=validated.created_at_utc,
duration_seconds=(validated.timeline_end_seconds - validated.timeline_start_seconds),
include_recorded_media=False,
provenance={
"schema_version": "missioncore.e24-lab-publication/v1",
"storage_mode": "bounded-world-frame-tracking-and-immutable-source-replay",
"source_result_id": source.result_id,
"source_lab_session_id": (None if source_lab is None else source_lab.session_id),
"source_payloads_mutated": False,
"coordinate_frame": "k1-map",
"lookahead_frames": 0,
"benchmark_sha256": build.benchmark_sha256,
"benchmark_passed": metrics["benchmark"]["passed"],
"benchmark_passed_events": metrics["benchmark"]["passed_events"],
"benchmark_total_events": metrics["benchmark"]["total_events"],
"world_motion_processing_p95_ms": metrics["runtime"][
"world_motion_frame_processing_ms"
]["p95"],
"peak_tracks": metrics["runtime"]["peak_tracks"],
"navigation_or_safety_accepted": False,
},
)
return PublishedWorldMotionLabInstance(
binding=binding,
job=lab_job,
result=validated,
build=build,
)
def _validate_e23_inputs(
worker_root: Path,
source_report_path: Path,
File diff suppressed because it is too large Load Diff
@@ -22,6 +22,7 @@ from k1link.compute import (
publish_e21_lab_instance,
publish_e22_lab_instance,
publish_e23_lab_instance,
publish_e24_lab_instance,
publish_integrated_lab_instance,
)
from k1link.device_plugins.xgrids_k1.analyze import (
@@ -581,6 +582,80 @@ def publish_e23_lab(
)
@lab_app.command("publish-e24")
def publish_e24_lab(
result: Annotated[
Path,
typer.Option(
exists=True,
file_okay=False,
readable=True,
resolve_path=True,
help="Accepted full-session integrated result used as the E24 source.",
),
],
profile: Annotated[
Path,
typer.Option(
exists=True,
dir_okay=False,
readable=True,
resolve_path=True,
help="Bounded E24 world-motion profile.",
),
],
benchmark: Annotated[
Path,
typer.Option(
exists=True,
dir_okay=False,
readable=True,
resolve_path=True,
help="Operator-anchored E24 motion benchmark.",
),
],
session_id: Annotated[
str,
typer.Option("--session-id", help="New immutable LAB session id."),
],
lab_id: Annotated[
str,
typer.Option("--lab-id", help="LAB marker, for example 'LAB E24'."),
],
display_name: Annotated[
str,
typer.Option("--display-name", help="Operator-facing saved-session title."),
],
) -> None:
"""Build and publish a bounded world-frame motion-tracking run."""
repository_root = Path(__file__).resolve().parents[4]
try:
published = publish_e24_lab_instance(
repository_root=repository_root,
source_result_root=result,
profile_path=profile,
benchmark_path=benchmark,
lab_session_id=session_id,
lab_id=lab_id,
display_name=display_name,
)
except (OSError, SessionIntegrityError, RuntimeError, ValueError) as exc:
console.print(f"[red]E24 LAB publication failed:[/red] {exc}")
raise typer.Exit(code=2) from exc
metrics = published.build.report["metrics"]
console.print(
"[green]E24 LAB instance published.[/green] "
f"session={published.binding.session_id}; "
f"source={published.binding.source_session_id}; "
f"result={published.binding.result_id}; "
f"benchmark={metrics['benchmark']['passed_events']}/"
f"{metrics['benchmark']['total_events']}; "
f"p95={metrics['runtime']['world_motion_frame_processing_ms']['p95']:.3f}ms; "
"source_payloads_mutated=false"
)
@app.command("serve")
def serve_console(
port: Annotated[