Expand description
GPS→ENU, Sim3 정렬, 공유 3D 점 정렬, 점군 후처리.
geodesy: WGS84 LLA ↔ ECEF ↔ ENU.umeyama: Umeyama Sim3, LO-RANSAC 견고 추정, 반복 재가중(견고 Umeyama).model_aligner: 등록 영상 투영 중심 ↔ GPS ENU 정렬(강건 Sim3 추정).shared: 두 재구성 간 공유 3D 점 대응과 그 정렬.kdtree,cloud: 점군 변환·근접 마스킹·추출·스냅샷 합성.reanchor: 새 정밀 모델 기준으로 이전 구역 좌표계를 다시 잇는 연쇄 Sim3.
§사용 예
use cumulus3d_align::{compose_snapshot, umeyama, EnuFrame, SnapshotOptions};
use cumulus3d_core::io::PointCloud;
use cumulus3d_core::{Quat, Sim3, Vec3};
// GPS(WGS84) ↔ ENU: 원점 기준 동쪽·북쪽·위 미터 좌표.
let enu = EnuFrame::new(37.5, 127.0, 10.0);
let p = enu.lla_to_enu(37.5001, 127.0001, 10.0);
let (lat, lon, _alt) = enu.enu_to_lla(&p);
assert!((lat - 37.5001).abs() < 1e-9 && (lon - 127.0001).abs() < 1e-9);
// 대응점 집합 사이의 Sim3(src → dst) 추정.
let truth = Sim3::new(2.0, Quat::from_axis_angle(&Vec3::z(), 0.3), Vec3::new(1.0, 2.0, 3.0));
let src: Vec<Vec3> = (0..10).map(|i| Vec3::new(i as f64, (i * i) as f64 * 0.1, (i as f64).sin())).collect();
let dst: Vec<Vec3> = src.iter().map(|x| truth.transform_point(x)).collect();
let est = umeyama(&src, &dst, true).unwrap();
assert!((est.scale - 2.0).abs() < 1e-9);
// 스냅샷: 정밀 점과 1.5 m 안에 있는 초벌 점을 지우고 합친 뒤 1/stride 추출.
let fine = PointCloud { positions: vec![[0.0, 0.0, 0.0]], ..Default::default() };
let coarse = PointCloud { positions: vec![[0.5, 0.0, 0.0], [10.0, 0.0, 0.0]], ..Default::default() };
let snap = compose_snapshot(&[&fine], &[&coarse], &SnapshotOptions { mask_radius: 1.5, stride: 1 });
assert_eq!(snap.len(), 2);use cumulus3d_align::{align_to_gps_file, ModelAlignerOptions};
let mut rec = cumulus3d_core::interop::read_model("model/0").unwrap();
let a = align_to_gps_file(&mut rec, "gps_ref.txt", &ModelAlignerOptions::default()).unwrap();
println!("인라이어 {}/{}, 중앙 오차 {:.2} m", a.num_inliers, a.common.len(), a.median_error);Re-exports§
pub use cloud::compose_snapshot;pub use cloud::decimate;pub use cloud::merge_clouds;pub use cloud::remove_near;pub use cloud::transform_cloud;pub use cloud::SnapshotOptions;pub use error::AlignError;pub use error::Result;pub use geodesy::ecef_to_lla;pub use geodesy::lla_to_ecef;pub use geodesy::EnuFrame;pub use geodesy::WGS84_A;pub use geodesy::WGS84_B;pub use geodesy::WGS84_E2;pub use geodesy::WGS84_F;pub use kdtree::KdTree;pub use model_aligner::align_to_gps;pub use model_aligner::align_to_gps_file;pub use model_aligner::estimate_gps_alignment;pub use model_aligner::gps_to_enu;pub use model_aligner::EnuOrigin;pub use model_aligner::GpsAlignment;pub use model_aligner::ModelAlignerOptions;pub use reanchor::AnchorChain;pub use shared::align_reconstructions;pub use shared::position_index_from_name;pub use umeyama::estimate_sim3_ransac;pub use umeyama::robust_umeyama;pub use umeyama::umeyama;pub use umeyama::RankCheck;pub use umeyama::RobustUmeyamaOptions;pub use umeyama::RobustUmeyamaResult;pub use umeyama::Sim3Estimator;
Modules§
- cloud
- 점군 후처리: Sim3 변환, 정밀 점군 근접 마스킹, 1/N 추출, 스냅샷 합성.
- error
- 정렬 오류. 실패를 조용히 넘기지 않도록 모든 실패 조건을 구분한다.
- geodesy
- WGS84 측지 변환. 각도 입력·출력은 도(degree).
- kdtree
- 3차원 KD-트리(자체 구현). 정밀 점군 근접 마스킹용. 질의는 rayon 병렬.
- model_
aligner - GPS ENU 정렬: 등록 영상 투영 중심을 GPS 기준점의 ENU 좌표에 강건 Sim3 로 맞춘다.
- reanchor
- 재고정(reanchor): 새 정밀 모델이 나올 때마다 이전 구역들을 최신 좌표계로 다시 잇는 연쇄 Sim3.
- shared
- 두 재구성 간 공유 3D 점 대응(후처리).
- umeyama
- Umeyama Sim3 와 견고 추정.