ICPOdometryProvider 클래스는 Pointclouds) 객체 간의 상대적인 변환을 계산하는 역할point-to-plane 오류 메트릭을 사용하여 포인트클라우드 정합을 수행맵 포인트클라우드와 프레임 포인트클라우드) 간의 상대적인 변환 행렬을 계산하여, 초기화 (__init__ 메서드):
numiters: damp: 1e-8dist_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):
20damp (float):
1e-8dist_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 방법을 사용하여 두 포인트 클라우드 간의 최적 변환을 추정하기 위해 필요한 선형 시스템을 구성하는 역할을 합니다. 이 함수는 소스 포인트 클라우드의 각 포인트에 대해 타겟 포인트 클라우드에서 가장 가까운 포인트를 찾고, 이를 바탕으로 선형 시스템의 계수 행렬과 잔차 벡터를 계산하여 반환합니다. 이 과정은 최종적으로 두 포인트 클라우드 간의 변환을 최적화하는 데 사용됩니다.