Add LiDAR RTK hand-eye calibration workflow and results

This commit is contained in:
lichun.qu
2026-07-22 09:31:44 +08:00
commit 62c7ab2e98
61 changed files with 156232 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
param(
[string]$Batch1Prepared = "C:\Users\admin\Documents\Codex\2026-07-15\wo\outputs\calibration_20260717\prepared",
[string]$Batch2Prepared = "C:\Users\admin\Documents\Codex\2026-07-15\wo\outputs\calibration_data1_20260720\prepared"
)
$ErrorActionPreference = "Stop"
$Repo = Split-Path -Parent $PSScriptRoot
$Code = Join-Path $Repo "code\rigorous_calibration.py"
$Refine = Join-Path $Repo "code\refine_pairs.py"
$Summary = Join-Path $Repo "code\summarize_results.py"
$R = Join-Path $Repo "results"
$B1Frames = Join-Path $Batch1Prepared "frames_all"
$B2Frames = Join-Path $Batch2Prepared "frames_all"
$B1Body = Join-Path $Batch1Prepared "body_poses_rear_gga_raw_rear_to_front.csv"
$B2Body = Join-Path $Batch2Prepared "body_poses_rear_gga_raw_rear_to_front.csv"
python $Code ground --frames $B2Frames --output "$R\common\ground_planes_batch2.csv"
python $Code pairs --backend small_gicp --frames $B2Frames --body $B2Body --output "$R\small_gicp\B_batch2_estimation.npz" --quality-json "$R\small_gicp\B_batch2_quality.json" --quality-csv "$R\small_gicp\B_batch2_quality.csv"
python $Code pairs --backend open3d --frames $B2Frames --body $B2Body --output "$R\open3d_gicp\B_batch2_estimation.npz" --quality-json "$R\open3d_gicp\B_batch2_quality.json" --quality-csv "$R\open3d_gicp\B_batch2_quality.csv" --max-gap 3 --multistart 1 --iterations 40
python $Refine --pairs "$R\small_gicp\B_batch2_estimation.npz" --quality-json "$R\small_gicp\B_batch2_quality.json" --output "$R\small_gicp\B_batch2_refined.npz"
python $Refine --pairs "$R\open3d_gicp\B_batch2_estimation.npz" --quality-json "$R\open3d_gicp\B_batch2_quality.json" --output "$R\open3d_gicp\B_batch2_refined.npz"
python $Code calibrate --pairs "$R\small_gicp\B_batch2_refined.npz" --ground-planes "$R\common\ground_planes_batch2.csv" --output "$R\small_gicp\extrinsic_batch2_refined.json"
python $Code calibrate --pairs "$R\open3d_gicp\B_batch2_refined.npz" --ground-planes "$R\common\ground_planes_batch2.csv" --output "$R\open3d_gicp\extrinsic_batch2_refined.json"
python $Code pairs --backend small_gicp --frames $B1Frames --body $B1Body --output "$R\small_gicp\B_batch1_auxiliary.npz" --quality-json "$R\small_gicp\B_batch1_quality.json" --quality-csv "$R\small_gicp\B_batch1_quality.csv" --max-gap 3 --multistart 1 --iterations 40
python $Code pairs --backend open3d --frames $B1Frames --body $B1Body --output "$R\open3d_gicp\B_batch1_auxiliary.npz" --quality-json "$R\open3d_gicp\B_batch1_quality.json" --quality-csv "$R\open3d_gicp\B_batch1_quality.csv" --max-gap 3 --multistart 1 --iterations 40
python $Refine --pairs "$R\small_gicp\B_batch1_auxiliary.npz" --quality-json "$R\small_gicp\B_batch1_quality.json" --output "$R\small_gicp\B_batch1_auxiliary_refined.npz"
python $Refine --pairs "$R\open3d_gicp\B_batch1_auxiliary.npz" --quality-json "$R\open3d_gicp\B_batch1_quality.json" --output "$R\open3d_gicp\B_batch1_auxiliary_refined.npz"
python $Code validate --pairs "$R\small_gicp\B_batch1_auxiliary_refined.npz" --extrinsic "$R\small_gicp\extrinsic_batch2_refined.json" --output "$R\small_gicp\batch1_auxiliary_check.json"
python $Code validate --pairs "$R\open3d_gicp\B_batch1_auxiliary_refined.npz" --extrinsic "$R\open3d_gicp\extrinsic_batch2_refined.json" --output "$R\open3d_gicp\batch1_auxiliary_check.json"
python $Summary --open3d "$R\open3d_gicp\extrinsic_batch2_refined.json" --small "$R\small_gicp\extrinsic_batch2_refined.json" --open3d-quality "$R\open3d_gicp\B_batch2_quality.json" --small-quality "$R\small_gicp\B_batch2_quality.json" --open3d-check "$R\open3d_gicp\batch1_auxiliary_check.json" --small-check "$R\small_gicp\batch1_auxiliary_check.json" --output "$R\comparison_summary.json" --recommended-output "$R\final_extrinsic_recommended.json"
+12
View File
@@ -0,0 +1,12 @@
$ErrorActionPreference = "Stop"
$Repo = Split-Path -Parent $PSScriptRoot
$Code = Join-Path $Repo "code\rigorous_calibration.py"
$Filter = Join-Path $Repo "code\cross_backend_filter.py"
$Finalize = Join-Path $Repo "code\finalize_consensus.py"
$R = Join-Path $Repo "results"
python $Filter --open3d-pairs "$R\open3d_gicp\B_batch2_refined.npz" --small-pairs "$R\small_gicp\B_batch2_refined.npz" --output "$R\consensus\B_batch2_consensus.npz"
python $Filter --open3d-pairs "$R\open3d_gicp\B_batch1_auxiliary_refined.npz" --small-pairs "$R\small_gicp\B_batch1_auxiliary_refined.npz" --output "$R\consensus\B_batch1_consensus.npz" --min-pairs 15
python $Code calibrate --pairs "$R\consensus\B_batch2_consensus.npz" --ground-planes "$R\common\ground_planes_batch2.csv" --output "$R\consensus\extrinsic_batch2_consensus.json"
python $Code validate --pairs "$R\consensus\B_batch1_consensus.npz" --extrinsic "$R\consensus\extrinsic_batch2_consensus.json" --output "$R\consensus\batch1_auxiliary_check.json"
python $Finalize --consensus-extrinsic "$R\consensus\extrinsic_batch2_consensus.json" --consensus-check "$R\consensus\batch1_auxiliary_check.json" --open3d-extrinsic "$R\open3d_gicp\extrinsic_batch2_refined.json" --small-extrinsic "$R\small_gicp\extrinsic_batch2_refined.json" --output "$R\final_extrinsic_recommended.json" --summary "$R\final_summary.json"
+15
View File
@@ -0,0 +1,15 @@
param([int]$PairIndex = 0)
$Repo = Split-Path -Parent $PSScriptRoot
$Code = "$Repo\code\scan_extrinsic_sensitivity.py"
$X = "$Repo\results\final_extrinsic_recommended.json"
$Ground = "$Repo\results\common\ground_planes_batch2.csv"
$Out = "$Repo\results\diagnostics"
python $Code --pairs "$Repo\results\open3d_gicp\B_batch2_refined.npz" --extrinsic $X --ground-planes $Ground --pair-index $PairIndex --output "$Out\open3d_refined_pair${PairIndex}_left_rpy_scan.json"
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python $Code --pairs "$Repo\results\small_gicp\B_batch2_refined.npz" --extrinsic $X --ground-planes $Ground --pair-index $PairIndex --output "$Out\small_gicp_refined_pair${PairIndex}_left_rpy_scan.json"
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
python $Code --pairs "$Repo\results\consensus\B_batch2_consensus.npz" --extrinsic $X --ground-planes $Ground --pair-index $PairIndex --output "$Out\consensus_pair${PairIndex}_left_rpy_scan.json"
exit $LASTEXITCODE
+14
View File
@@ -0,0 +1,14 @@
param(
[int]$PairIndex = 0,
[string]$Frames = "C:\Users\admin\Documents\Codex\2026-07-15\wo\outputs\calibration_data1_20260720\prepared\frames_all",
[double]$LeftRollDeg = 0.0,
[double]$LeftPitchDeg = 0.0,
[double]$LeftYawDeg = 0.0
)
$Repo = Split-Path -Parent $PSScriptRoot
python "$Repo\code\visualize_pair_3d.py" `
--frames $Frames `
--pairs "$Repo\results\open3d_gicp\B_batch2_refined.npz" `
--extrinsic "$Repo\results\final_extrinsic_recommended.json" `
--pair-index $PairIndex `
--left-rpy-deg $LeftRollDeg $LeftPitchDeg $LeftYawDeg
+18
View File
@@ -0,0 +1,18 @@
param(
[int]$PairIndex = 0,
[string]$Frames = "C:\Users\admin\Documents\Codex\2026-07-15\wo\outputs\calibration_data1_20260720\prepared\frames_all",
[string]$Extrinsic = "",
[double]$LeftRollDeg = 0.0,
[double]$LeftPitchDeg = 0.0,
[double]$LeftYawDeg = 0.0
)
$Repo = Split-Path -Parent $PSScriptRoot
if ([string]::IsNullOrWhiteSpace($Extrinsic)) {
$Extrinsic = "$Repo\results\small_gicp\extrinsic_batch2_refined.json"
}
python "$Repo\code\visualize_pair_3d.py" `
--frames $Frames `
--pairs "$Repo\results\small_gicp\B_batch2_refined.npz" `
--extrinsic $Extrinsic `
--pair-index $PairIndex `
--left-rpy-deg $LeftRollDeg $LeftPitchDeg $LeftYawDeg