ICPSLAM 클래스는 RGB-D 이미지 시퀀스를 사용하여 SLAM을 수행하는 PyTorch 기반 모듈포인트 클라우드(Point Cloud)와 카메라의 Pose를 생성입력 파라미터
odom: 사용하려는 오도메트리 방법. gt(ground truth), icp(Iterative Closest Point), gradicp(Gradient-based ICP) 중 선택.icp (Iterative Closest Point): gradicp (Gradient-based ICP): dsratio: numiters: damp: dist_thresh: src_pc와 tgt_pc 사이의 거리 임계값. lambda_max, B, B2, nu: `클래스 생성자 (init)
forward 메서드
RGB-D 이미지 시퀀스를 입력으로 받아, 포인트 클라우드와 포즈를 반환step 메서드를 호출하여, 포인트 클라우드와 포즈를 업데이트step, (_localize+ _map) 메서드step 함수: 현재 프레임을 사용해 전역 맵을 업데이트_localize 함수: 현재 프레임의 포즈를 계산 _map 함수: 현재 프레임의 점들을 전역 맵에 통합step 함수def step(
self,
pointclouds: Pointclouds,
live_frame: RGBDImages,
prev_frame: Optional[RGBDImages] = None,
inplace: bool = False,
):
live_frame.poses = self._localize(pointclouds, live_frame, prev_frame)
pointclouds = self._map(pointclouds, live_frame, inplace)
역할:
live_frame)을 사용하여 전역 맵 점 구름(pointclouds)을 업데이트prev_frame)이 주어지면, 현재 프레임과의 상대 변환을 계산하여 현재 프레임의 위치를 추정인자:
pointclouds (gradslam.Pointclouds): 전역 맵 점 구름.live_frame (gradslam.RGBDImages): 현재 프레임의 RGB-D 이미지. 시퀀스 길이는 1이어야 합니다.prev_frame (gradslam.RGBDImages or None): 이전 프레임의 RGB-D 이미지. 시퀀스 길이는 1이어야 합니다.inplace (bool): 반환값:
pointclouds (gradslam.Pointclouds): 업데이트된 전역 맵 점 구름.poses (torch.Tensor): 현재 프레임 배치의 포즈.live_frame.poses = self._localize(pointclouds, live_frame, prev_frame)
pointclouds = self._map(pointclouds, live_frame, inplace)
return pointclouds, live_frame.poses
self._localize 함수를 호출하여 live_frame의 포즈를 계산self._map 함수를 호출하여 전역 맵 점 구름을 업데이트_localize 함수def _localize(
self, pointclouds: Pointclouds, live_frame: RGBDImages, prev_frame: RGBDImages
):
poses (torch.Tensor): 현재 프레임 배치의 포즈.if self.odom in ["icp", "gradicp"]:
live_frame.poses = prev_frame.poses
frames_pc = downsample_rgbdimages(live_frame, self.dsratio)
pc2im_bnhw = find_active_map_points(pointclouds, prev_frame)
maps_pc = downsample_pointclouds(pointclouds, pc2im_bnhw, self.dsratio)
transform = self.odomprov.provide(maps_pc, frames_pc)
return compose_transformations(
transform.squeeze(1), prev_frame.poses.squeeze(1)
).unsqueeze(1)
odom이 "icp"(Iterative Closest Point) 또는 "gradicp"(Gradient-based ICP)인 경우:find_active_map_pointspc2im_bnhw = find_active_map_points(pointclouds, prev_frame)
find_active_map_points 함수는 주어진 글로벌 맵 포인트 클라우드와 prev_frame으로부터 해당 포인트들의 인덱스와 이미지 프레임에서의 위치를 반환(num_active_map_points, 4) 크기의 텐서.b, 포인트 인덱스 n, 그리고 라이브 프레임에서의 높이 h와 너비 w 인덱스를 포함_map 함수def _map(
self, pointclouds: Pointclouds, live_frame: RGBDImages, inplace: bool = False
):
역할: 현재 프레임의 점들을 사용하여 전역 맵 점 구름을 업데이트
인자:
pointclouds (gradslam.Pointclouds): 전역 맵 점 구름.live_frame (gradslam.RGBDImages): 현재 프레임의 RGB-D 이미지. 시퀀스 길이는 1이어야 합니다.inplace (bool): True로 설정하면 점 구름을 제자리에서 업데이트합니다. 기본값은 False.반환값:
pointclouds (gradslam.Pointclouds): 업데이트된 전역 맵 점 구름.return update_map_aggregate(pointclouds, live_frame, inplace)
update_map_aggregate 함수를 호출하여 전역 맵 점 구름을 업데이트하고, 그 결과를 반환합니다. inplace 인자가 True이면 제자리에서 업데이트를 수행합니다.update_map_aggregate 함수는 현재 프레임의 RGB-D 이미지를 사용하여 전역 맵 점 구름을 업데이트pointclouds_from_rgbdimages 함수는 pointclouds_from_rgbdimages 함수def pointclouds_from_rgbdimages(
rgbdimages: RGBDImages,
*,
global_coordinates: bool = True,
filter_missing_depths: bool = True,
use_embeddings: bool = False,
) -> Pointclouds:
역할:
인자:
rgbdimages (gradslam.RGBDImages): RGB-D 이미지의 배치를 포함하지만 시퀀스 길이는 1이어야 합니다.global_coordinates (bool): True로 설정하면 글로벌 좌표계에서 점 구름을 생성합니다. 기본값은 True.filter_missing_depths (bool): True로 설정하면 깊이 값이 없는 점들을 제외합니다. 기본값은 True.use_embeddings (bool): True로 설정하면 임베딩을 사용합니다. 기본값은 False.반환값:
pointclouds (gradslam.Pointclouds): 생성된 점 구름.알고리즘
rgbdimages의 타입과 시퀀스 길이를 확인합니다.vertex_map과 normal_map을 설정유효한 점, 법선 벡터, 색상을 추출합니다. 깊이 값이 있는 점들만 포함합니다.Pointclouds 객체를 반환append_points 메서드는 현재의 Pointclouds 객체에 Pointclouds 객체의 점, 노멀, 색상 및 기타 속성을 추가(병합)Pointclouds 객체가 동일한 속성을 가지고 있어야 하며, 같은 배치 크기를 가져야 합니다. Pointclouds 객체를 수정