ICPOdometryProvider
클래스는 Pointclouds
) 객체 간의 상대적인 변환을 계산하는 역할point-to-plane
오류 메트릭을 사용하여 포인트클라우드 정합을 수행맵 포인트클라우드
와 프레임 포인트클라우드
) 간의 상대적인 변환 행렬을 계산하여, 초기화 (__init__
메서드):
numiters
: damp
: 1e-8
dist_thresh
: None
변환 계산 (provide
메서드):
maps_pointclouds
: Pointclouds
객체frames_pointclouds
: Pointclouds
객체point_to_plane_ICP
함수를 사용하여 각 배치에 대해 상대적인 변환을 계산입력 검증:
maps_pointclouds
와 frames_pointclouds
가 Pointclouds
타입인지 확인maps_pointclouds
에 노멀 벡터가 포함되어 있는지 확인초기 변환 설정:
initial_transform
으로 4x4 단위 행렬을 설정합니다. 이는 초기 변환 행렬로 사용됩니다.ICP 알고리즘 수행:
point_to_plane_ICP
함수를 호출하여, 상대적인 변환 행렬을 계산point_to_plane_ICP
함수는 다음과 같은 인자를 사용:numiters
), 댐핑 계수(damp
), 거리 임계값(dist_thresh
)결과 반환:
다음은 ICPOdometryProvider
클래스의 사용 예시입니다:
icp_provider = ICPOdometryProvider(numiters=30, damp=1e-8, dist_thresh=0.1)
maps_pointclouds = Pointclouds(points=[...], normals=[...])
frames_pointclouds = Pointclouds(points=[...])
relative_transformation = icp_provider.provide(maps_pointclouds, frames_pointclouds)
print(relative_transformation)
맵 포인트클라우드
와 프레임 포인트클라우드
간의 상대적인 변환 행렬을 계산목표 점 클라우드에서 대응하는 점의 평면
에 얼마나 가까운지 측정목표 점 클라우드의 평면
은 그 점의 노멀(수직 벡터, tgt_normals)로 정의초기화:
반복(iteration) 과정:
가장 가까운 점 찾기:
오차 계산:
변환 계산:
변환 적용:
오차 비교:
point_to_plane_ICP
함수는 두 개의 3D 포인트 클라우드 간의 최적 강체 변환
을 계산하는 데 사용point-to-plane 오류 메트릭
과 Levenberg-Marquardt 알고리즘
을 적용하여, 소스 포인트 클라우드(live_frame)
를 타겟 포인트 클라우드(prev_frame)
에 맞추어 최적화src_pc (torch.Tensor)
:
(1, N_s, 3)
으로, 3차원 좌표를 가진 N_s
개의 포인트를 포함합니다.tgt_pc (torch.Tensor)
:
(1, N_t, 3)
로, 3차원 좌표를 가진 N_t
개의 포인트를 포함합니다.tgt_normals (torch.Tensor)
:
(1, N_t, 3)
의 형태를 가지며, point-to-plane 메트릭을 계산하는 데 사용initial_transform (torch.Tensor or None)
:
None
), 단위 행렬(identity matrix)이 사용됩니다. 이 행렬은 형태가 (4, 4)
입니다.numiters (int)
:
20
damp (float)
:
1e-8
dist_thresh (float or int or None)
:
None
으로, 필터링을 수행하지 않습니다.initial_transform
을 통해 초기 변환된 소스 포인트 클라우드는 (1, N_s, 3)
의 형태로, 이후 반복 과정에서 타겟 포인트 클라우드와 정렬될 것입니다.numiters
번의 반복을 수행gauss_newton_solve
함수를 호출하여, 현재 소스 포인트 클라우드와 타겟 포인트 클라우드 간의 선형 시스템을 구성A
행렬과 b
벡터로 표현되며, 각각 변환 매개변수를 계산하기 위한 방정식의 계수와 잔차를 나타냅니다.xi
를 구합니다. damp
를 적용합니다.xi
를 이용해 변환 행렬을 지수 함수(exponential) 형태로 계산하고, 이를 기존의 변환 행렬에 적용하여 업데이트합니다.최종 변환 행렬
과 소스 포인트 클라우드의 각 포인트
에 대해 타겟 포인트 클라우드에서 가장 가까운 포인트의 인덱스를 반환
transform
(torch.Tensor):
(4, 4)
chamfer_indices
(torch.Tensor):
(1, N_sf)
입니다.gauss_newton_solve
함수 설명gauss_newton_solve
함수는 Gauss-Newton 방법을 사용하여 필요한 선형 시스템을 구성
하는 것을 목적으로 합니다. src_pc
)를 타겟 포인트 클라우드(tgt_pc
)에 맞추기 위한 최적의 강체 변환을 찾는 과정에서 사용dist_thresh
)을 사용하여 타겟 포인트 클라우드와 너무 먼 소스 포인트들을 필터링합니다.Gauss-Newton 방법은 비선형 최소제곱 문제를 풀기 위한 방법 중 하나입니다. 이 방법은 비선형 함수를 선형 근사화하여, 반복적으로 선형 시스템을 풀어 최적의 해를 구합니다. 이 함수는 이러한 Gauss-Newton 방법을 사용하여 두 포인트 클라우드 사이의 변환 매개변수를 추정하는 데 사용됩니다.
src_pc (torch.Tensor)
:
(1, N_s, 3)
으로, N_s
개의 3차원 포인트를 포함합니다.tgt_pc (torch.Tensor)
:
(1, N_t, 3)
으로, N_t
개의 3차원 포인트를 포함합니다.tgt_normals (torch.Tensor)
:
(1, N_t, 3)
으로, 각 포인트에 대응하는 3차원 법선 벡터를 포함합니다.dist_thresh (float or int or None)
:
None
으로, 필터링을 수행하지 않습니다.입력 데이터 검증:
src_pc
, tgt_pc
, tgt_normals
)의 타입과 형상을 검증하여, 데이터가 올바른 형태로 제공되었는지 확인합니다. 데이터의 차원(ndim
)과 크기(shape
)가 예상과 다를 경우 오류를 발생시킵니다.거리 기반 필터링:
knn_points
함수를 사용하여, 소스 포인트 클라우드의 각 포인트에 대해 타겟 포인트 클라우드에서 가장 가까운 포인트를 찾습니다. 이 과정에서 계산된 거리가 dist_thresh
보다 크면 해당 포인트는 필터링됩니다.chamfer_indices
로 저장합니다.선형 시스템 구성:
dx, dy, dz
)와 그에 대응하는 법선 벡터(nx, ny, nz
)를 계산합니다.A
와 잔차 벡터 b
를 구성합니다.목표:
선형 시스템 구성:
결과 반환:
A (torch.Tensor)
:
(N_sf, 6)
입니다. 여기서 N_sf
는 필터링된 소스 포인트의 수입니다.b (torch.Tensor)
:
(N_sf, 1)
입니다.chamfer_indices (torch.Tensor)
:
(1, N_sf)
입니다.gauss_newton_solve
함수는 Gauss-Newton 방법을 사용하여 두 포인트 클라우드 간의 최적 변환을 추정하기 위해 필요한 선형 시스템을 구성하는 역할을 합니다. 이 함수는 소스 포인트 클라우드의 각 포인트에 대해 타겟 포인트 클라우드에서 가장 가까운 포인트를 찾고, 이를 바탕으로 선형 시스템의 계수 행렬과 잔차 벡터를 계산하여 반환합니다. 이 과정은 최종적으로 두 포인트 클라우드 간의 변환을 최적화하는 데 사용됩니다.