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_points
pc2im_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
객체를 수정