添加 LiDAR-IMU 外参标定流水线与说明文档

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
lichun.qu
2026-08-01 12:02:37 +08:00
co-authored by Cursor
commit cf1fad7594
40 changed files with 5502 additions and 0 deletions
+109
View File
@@ -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 LiDARIMU 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())