feat: add passive K1 local surface replay
This commit is contained in:
@@ -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())
|
||||
Reference in New Issue
Block a user