Skip to main content

Crate cumulus3d_align

Crate cumulus3d_align 

Source
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 shared::shared_point_correspondences;
pub use shared::SharedPointOptions;
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 와 견고 추정.