110 lines
3.1 KiB
Python
110 lines
3.1 KiB
Python
"""One-click synthetic reproduce: generate → calibrate → report → pytest."""
|
||
|
||
from __future__ import annotations
|
||
|
||
import argparse
|
||
import subprocess
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
|
||
def _repo_root() -> Path:
|
||
return Path(__file__).resolve().parents[1]
|
||
|
||
|
||
def _run(cmd: list[str], cwd: Path) -> None:
|
||
print("+", " ".join(cmd), flush=True)
|
||
completed = subprocess.run(cmd, cwd=str(cwd), check=False)
|
||
if completed.returncode != 0:
|
||
raise SystemExit(completed.returncode)
|
||
|
||
|
||
def main(argv: list[str] | None = None) -> int:
|
||
parser = argparse.ArgumentParser(
|
||
description="Generate synthetic LiDAR–IMU data, run calibration, show report, run tests."
|
||
)
|
||
parser.add_argument(
|
||
"--mode",
|
||
choices=["rotation_only", "full_se3"],
|
||
default="rotation_only",
|
||
)
|
||
parser.add_argument("--skip-pytest", action="store_true")
|
||
args = parser.parse_args(argv)
|
||
|
||
root = _repo_root()
|
||
session = root / "examples" / "synthetic_session"
|
||
imu = session / "imu.csv"
|
||
lidar = session / "lidar"
|
||
calib_out = session / "out"
|
||
config = root / "config" / "vehicle_installation.template.yaml"
|
||
|
||
print("=== 1/4 generate synthetic session ===", flush=True)
|
||
_run([sys.executable, str(root / "tools" / "generate_synthetic_session.py")], cwd=root)
|
||
|
||
print("=== 2/4 run calibration ===", flush=True)
|
||
_run(
|
||
[
|
||
sys.executable,
|
||
"-m",
|
||
"imu_lidar.cli",
|
||
"run",
|
||
"--vehicle-config",
|
||
str(config),
|
||
"--imu",
|
||
str(imu),
|
||
"--lidar",
|
||
str(lidar),
|
||
"--output",
|
||
str(calib_out),
|
||
"--mode",
|
||
args.mode,
|
||
"--time-offset-search-s",
|
||
"0.5",
|
||
"--min-pair-rotation-deg",
|
||
"2.0",
|
||
"--min-pair-translation-m",
|
||
"0.05",
|
||
"--max-iterations",
|
||
"1",
|
||
],
|
||
cwd=root,
|
||
)
|
||
|
||
print("=== 3/4 show report ===", flush=True)
|
||
_run(
|
||
[
|
||
sys.executable,
|
||
str(root / "tools" / "show_calibration_report.py"),
|
||
"--summary",
|
||
str(calib_out / "summary.json"),
|
||
"--truth-meta",
|
||
str(session / "meta.json"),
|
||
"--plot",
|
||
str(calib_out / "report_preview.png"),
|
||
],
|
||
cwd=root,
|
||
)
|
||
|
||
if args.skip_pytest:
|
||
print("=== 4/4 pytest skipped ===", flush=True)
|
||
else:
|
||
print("=== 4/4 pytest ===", flush=True)
|
||
_run([sys.executable, "-m", "pytest", "-q"], cwd=root)
|
||
|
||
print("\nDone.")
|
||
print(" INPUT")
|
||
print(f" IMU CSV : {imu}")
|
||
print(f" LiDAR dir : {lidar}")
|
||
print(f" vehicle YAML: {config}")
|
||
print(" OUTPUT")
|
||
print(f" directory : {calib_out}")
|
||
print(f" T : {calib_out / 'T_IMU_lidar.json'}")
|
||
print(f" δt : {calib_out / 'time_offset.json'}")
|
||
print(f" summary : {calib_out / 'summary.json'}")
|
||
print(f" preview PNG : {calib_out / 'report_preview.png'}")
|
||
return 0
|
||
|
||
|
||
if __name__ == "__main__":
|
||
raise SystemExit(main())
|