[open3d / reconstruction system] 5. Dense RGBD SLAM

About_work·2024년 9월 14일
0

SLAM

목록 보기
2/12

1. Dense RGB-D SLAM

  • 빠른 볼륨 기반 재구성 백엔드로 구동되는 이 시스템은 프레임-투-모델 추적을 사용하는 밀집형 RGB-D SLAM 시스템을 제공
  • 해당 예제는 커맨드 라인 버전인 examples/python/t_reconstruction_system/dense_slam.py와 GUI 데모인 examples/python/t_reconstruction_system/dense_slam_gui.py에서 찾을 수 있습니다.

1.1. 참고 사항

  • 이 SLAM 프로토타입은 주로 실시간 볼륨 처리의 시범을 위한 것
  • tracking/RGB-D odometry 모듈은 정확성을 최적화하지 않았으며, 현재 relocalization module이 구현되어 있지 않음을 유의
  • 일반적으로 이 시스템은 상대적으로 완만한 움직임이 있는 방 규모의 장면에서는 작동하지만, 더 까다로운 시퀀스에서는 실패할 수 있음

1.2. Model and frame initialization

SLAM 시스템에서는

# examples/python/t_reconstruction_system/dense_slam.py
    T_frame_to_model = o3d.core.Tensor(np.identity(4))
    model = o3d.t.pipelines.slam.Model(config.voxel_size, 16,
                                       config.block_count, T_frame_to_model,
                                       device)
    depth_ref = o3d.t.io.read_image(depth_file_names[0])
    input_frame = o3d.t.pipelines.slam.Frame(depth_ref.rows, depth_ref.columns,
                                             intrinsic, device)
    raycast_frame = o3d.t.pipelines.slam.Frame(depth_ref.rows,
                                               depth_ref.columns, intrinsic,
                                           device)
  • 위 첫번째 줄 코드는 Model 객체를 생성하며, 이는 복셀 블록 그리드를 사용하여 3D 환경을 나타냅니다.
    • config.voxel_size: 복셀의 크기를 정의하며, 3D 맵의 해상도를 결정
    • 16: 각 블록이 포함하는 복셀의 수
      • 복셀을 여러 블록으로 그룹화하여 관리하기 쉽게 합니다.
    • config.block_count:
      • 복셀 그리드에 할당되는 전체 블록의 수를 지정
      • 이 값은 메모리 사용량을 관리하는 데 도움을 줍니다.
    • T_frame_to_model:
      • 입력 프레임의 좌표계를 모델의 좌표계로 변환하는 변환 행렬

1.3. Frame-to-model tracking

  • 3D 맵을 구축하고 카메라의 움직임을 추적하는 핵심 과정
  • 다음과 같은 루프에서 실행
# examples/python/t_reconstruction_system/ray_casting.py
for i in range(n_files):
    start = time.time()

    depth = o3d.t.io.read_image(depth_file_names[i]).to(device)
    color = o3d.t.io.read_image(color_file_names[i]).to(device)

    input_frame.set_data_from_image('depth', depth)
    input_frame.set_data_from_image('color', color)

    if i > 0:
        result = model.track_frame_to_model(input_frame, raycast_frame,
                                            config.depth_scale,
                                            config.depth_max,
                                            config.odometry_distance_thr)
        T_frame_to_model = T_frame_to_model @ result.transformation

    poses.append(T_frame_to_model.cpu().numpy())
    model.update_frame_pose(i, T_frame_to_model)
    model.integrate(input_frame, config.depth_scale, config.depth_max)
    model.synthesize_model_frame(raycast_frame, config.depth_scale,
                                 config.depth_min, config.depth_max, False)
  • config.odometry_distance_thr:
    • 프레임 추적 시 사용되는 임계값으로, 카메라 움직임이 특정 거리 내에 있을 때만 추적이 유효하다고 판단

1.3.2. 글 설명

1.3. FAQ

Q: 추적이 실패한 이유는 무엇인가요?
A:

  • 여러 프레임을 성공적으로 추적한 후에 실패했다면 시스템의 불안정성 때문일 수 있습니다.
    • 주의 사항을 참조하십시오.
  • 만약 0번째 프레임에서 초기화 시 실패한다면, 다음 중요한 요소들을 확인하십시오:
    • 깊이/컬러 이미지가 올바르게 로드되었는지 확인
    • 이미지 내부 파라미터 행렬이 올바르게 설정되었는지 확인
      • 이 설정이 올바르지 않으면, 깊이로부터 생성된 포인트 클라우드가 왜곡되어 이후 작업이 실패할 수 있습니다.
    • 깊이 스케일 팩터가 올바르게 설정되었는지 확인(예: PrimeSense 및 RealSense D435의 경우 1000, TUM 데이터셋의 경우 5000).
    • 이 팩터는 원시 깊이 픽셀 값을 실제 거리로 올바르게 변환하는 데 사용
  • 깊이 최대 값이 올바르게 설정되었는지 확인
    • (일반적으로 3.0으로 설정되지만, 더 큰 규모의 장면에서는 충분하지 않을 수 있습니다).
    • 이 값은 멀리 있는 모든 점을 제거
  • 위의 모든 사항이 올바르게 설정되었는데도 문제가 계속된다면, 이슈를 제출하시기 바랍니다.

Q: 그렇다면 왜 내 추적이 실패했나요?
A:

  • 프론트 엔드에서는 직접 RGB-D 오도메트리를 사용하고 있음
  • 피처 기반 오도메트리와 비교할 때, 직접 RGB-D 오도메트리는 성공적으로 완료되면 더 정확하지만, 견고성은 떨어집니다.
  • 추후 피처 기반 추적에 대한 지원을 추가할 예정
  • 백엔드에서는 오프라인 재구성 시스템과 달리
    • 루프 클로저를 감지하지 않으며, 현재
    • 포즈 그래프 최적화번들 조정도 수행하지 않음

Q: 왜 루프 클로저나 재위치화를 구현하지 않았나요?
A:

  • 재위치화는 볼륨 재구성에 있어 어려운 작업으로, 실시간 볼륨 변형 및/또는 재통합이 필요하기 때문
  • 현재 우리는 직접 오도메트리를 사용하고 있기 때문에 프레임의 희소 피처를 추적하지 않습니다.
  • 이러한 모든 문제를 해결하는 시스템 업그레이드는 향후 작업이 될 것입니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글