添加 LiDAR-IMU 外参标定流水线与说明文档
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,109 @@
|
||||
"""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())
|
||||
Reference in New Issue
Block a user