feat: add passive K1 local surface replay

This commit is contained in:
DCCONSTRUCTIONS
2026-07-25 22:47:12 +03:00
parent cfe17e49bb
commit 04a658b218
16 changed files with 2715 additions and 21 deletions
@@ -0,0 +1,79 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import json
from pathlib import Path
from k1link.compute import (
E10LidarFieldSource,
K1LocalSurfaceProfile,
K1LocalSurfaceV1,
build_k1_local_surface,
)
def _arguments() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description=(
"Build a passive, source-bound K1 rolling local-surface derivative "
"without firmware commands or a hardcoded sensor height."
)
)
parser.add_argument("source_pack", type=Path)
parser.add_argument("output_root", type=Path)
parser.add_argument("--local-radius-m", type=float, default=10.0)
parser.add_argument("--cell-size-m", type=float, default=0.45)
parser.add_argument("--surface-ttl-s", type=float, default=1.25)
parser.add_argument("--minimum-surface-cells", type=int, default=18)
parser.add_argument("--surface-band-m", type=float, default=0.16)
parser.add_argument("--obstacle-min-height-m", type=float, default=0.20)
parser.add_argument("--obstacle-max-height-m", type=float, default=3.5)
return parser.parse_args()
def main() -> int:
arguments = _arguments()
profile = K1LocalSurfaceProfile(
local_radius_m=arguments.local_radius_m,
cell_size_m=arguments.cell_size_m,
surface_ttl_s=arguments.surface_ttl_s,
minimum_surface_cells=arguments.minimum_surface_cells,
surface_band_m=arguments.surface_band_m,
obstacle_min_height_m=arguments.obstacle_min_height_m,
obstacle_max_height_m=arguments.obstacle_max_height_m,
)
source = E10LidarFieldSource(arguments.source_pack)
try:
output = build_k1_local_surface(
source,
arguments.output_root,
profile=profile,
)
finally:
source.close()
model = K1LocalSurfaceV1(output)
try:
print(
json.dumps(
{
"model_id": model.model_id,
"display_name": model.report["display_name"],
"source": model.report["source"],
"surface_model": model.report["surface_model"],
"occupancy_policy": model.report["occupancy_policy"],
"metrics": model.report["metrics"],
"anchors": model.report["anchors"],
"decision": model.report["decision"],
},
ensure_ascii=False,
indent=2,
)
)
finally:
model.close()
return 0
if __name__ == "__main__":
raise SystemExit(main())