[code] Visual Language Maps for Robot Navigation

About_work·2024년 7월 25일
0

global mapper

목록 보기
12/37

데이터셋 생성

  • VLMaps를 구축하기 위해, 우리는 Matterport3D 데이터셋과 함께 Habitat 시뮬레이터에서
    • 10개의 장면에 걸쳐 10개의 RGB-D 비디오 시퀀스를 수동으로 수집
  • RGB-D 비디오를 생성하기 위한 스크립트포즈 메타 데이터를 제공
  • 다음 몇 단계를 따라 데이터셋을 생성하세요.

1. Matterport3D 데이터셋 다운로드

  • 데이터셋 다운로드를 확인하고, 이용 약관에 서명한 후, Habitat 시뮬레이터에서 사용할 Matterport3D 메쉬를 요청하려면 담당자에게 보내십시오.
  • 회신 이메일에는 데이터를 다운로드하는 파이썬 스크립트가 첨부됩니다.
  • 스크립트를 ~/download_mp.py 파일에 복사하고 붙여넣으세요.
  • 다음 명령을 실행하여 데이터를 다운로드합니다:
cd ~
# 현재 디렉토리에 데이터를 다운로드
python2 download_mp.py -o . --task habitat
# 데이터를 압축 해제
unzip v1/tasks/mp3d_habitat.zip
# data_dir은 mp3d_habitat/mp3d 입니다.

2. 데이터셋 생성

  • config/generate_dataset.yaml을 구성합니다.
    1. config/generate_dataset.yaml에서 defaults/data_paths의 값을 default로 변경합니다.
    1. config/data_paths/default.yaml에서 habitat_scene_dir 및 vlmaps_data_dir을 다음 단계에 따라 변경합니다.
    • habitat_scene_dir을 다운로드한 Matterport3D 데이터셋의 경로로 변경: ~/mp3d_habitat/mp3d
# habitat_scene_dir의 구조는 다음과 같습니다:
habitat_scene_dir
  |-5LpN3gDmAk7
  |   |-5LpN3gDmAk7.glb
  |   |-5LpN3gDmAk7_semantic.ply
  |   |-...
  |-gTV8FGcVJC9
  |   |-gTV8FGcVJC9.glb
  |   |-gTV8FGcVJC9_semantic.ply
  |   |-...
  |-jh4fc5c5qoQ
  |   |-jh4fc5c5qoQ.glb
  |   |-jh4fc5c5qoQ_semantic.ply
  |   |-...
  ...
    1. vlmaps_data_dir을 다운로드한 데이터셋의 경로로 변경:
# vlmaps_data_dir의 구조는 다음과 같습니다:
vlmaps_data_dir
  |-5LpN3gDmAk7_1
  |   |-poses.txt
  |-gTV8FGcVJC9_1
  |   |-poses.txt
  |-jh4fc5c5qoQ_1
  |   |-poses.txt
  ...
    1. data_cfg.resolution.wdata_cfg.resolution.h를 변경하여 생성되는 RGB, 깊이 및 시맨틱 이미지의 해상도를 조정
    1. RGB, 깊이 및 시맨틱 데이터를 생성하려면 해당 값을 true로 설정하고, 무시하려면 false로 설정
    1. camera_height를 변경하여 로봇 베이스에 대한 카메라 높이를 조정
# 이 저장소의 <REPO_ROOT>/dataset 디렉토리로 이동
cd dataset
# 생성된 데이터셋은 동일한 디렉토리에 있습니다.
python generate_dataset.py

Habitat-Sim에서 자체 데이터 수집

  • 다음 코드를 실행하여 자체 데이터를 수집합니다(예: gTV8FGcVJC9 장면에 대해):
python dataset/collect_custom_dataset.py scene_names=["gTV8FGcVJC9"]
  • 생성된 데이터 폴더는 config/datapaths/default.yaml의 vlmaps_data_dir 아래에 있는`<scene_name>` 형식으로 저장(이미 data_paths를 default로 설정한 경우).
    • 위 명령에서 <scene_name>은 gTV8FGcVJC9이고, <id>는 이 장면의 기존 데이터 폴더에 따라 다릅니다. gTV8FGcVJC9_1이 이미 존재하면, 새로운 폴더 이름은 gTV8FGcVJC9_2가 됩니다.

VLMap 생성하기

생성된 데이터셋으로 VLMap 만들기

    1. config/map_creation_cfg.yaml에서 defaults/data_paths의 값을 default로 변경
    1. config/data_paths/default.yaml에서 habitat_scene_dir 및 vlmaps_data_dir을 위의 데이터셋 생성 섹션의 단계에 따라 변경합니다.
    1. 다음 명령어를 실행하여 VLMap을 구축합니다.
    • 이 코드는 각 보셀(voxel)에 LSeg 임베딩이 포함된 3D 지도를 만듭니다.
cd application
python create_map.py

생성된 VLMap 구성하기

    1. config/map_creation_cfg.yaml에서 scene_id를 변경하여 VLMap을 생성할 장면을 선택합니다 (0-9).
  • 사용자 정의 데이터를 사용하는 경우, scene_id는 config/paths/default.yaml에서 설정한 vlmaps_data_dir 경로의 정렬된 하위 폴더의 id를 나타냅니다.
  1. config/params/default.yaml에서 매개변수를 변경하여 지도를 사용자 정의
    • cs(셀 크기, 미터 단위)와 gs(그리드 크기)를 변경하여 지도의 해상도를 조정
    • config/vlmaps.yaml에서 카메라 포즈베이스 포즈를 변경
    • pose_info 섹션을 수정하세요.
      • pose_type:
        • poses.txt 파일에 저장된 포즈 유형을 의미
        • 로봇 베이스의 포즈인 경우 mobile_base로 설정하고,
        • 카메라의 포즈인 경우 camera_base로 설정합니다.
      • rot_type:
        • poses.txt 파일의 각 줄에 저장된 데이터 형식을 의미합니다.
        • 포즈가 px, py, pz, qx, qy, qz, qw로 저장된 경우 quat로 설정하고,
        • (4, 4) 변환 행렬로 저장된 경우 mat로 설정합니다.
        • 기본값은 quat입니다.
      • pose_type을 mobile_base로 설정한 경우, pose_info의 다음 매개변수도 수정해야 합니다:
        • camera_height:
          • 베이스에 대한 카메라 높이입니다. 데이터셋 생성 시 다른 카메라 높이를 설정한 경우 이를 변경합니다.
        • base2cam_rot:
          • 로봇 베이스에서 카메라 좌표계로의 행렬형 회전 행렬(z 축이 앞으로, x 축이 오른쪽, y 축이 아래로).
        • base_forward_axis, base_left_axis, base_up_axis:
          • 로봇 베이스 좌표계입니다.
          • 이는 로봇 베이스 프레임에 투영된 전방 단위 벡터 [1, 0, 0], 좌측 단위 벡터 [0, 1, 0], 상단 단위 벡터 [0, 0, 1]의 좌표를 의미
    • config/vlmaps.yaml의 기타 설정:
      • skip_frame: frame_i % skip_frame == 0일 때만 프레임을 사용
      • cam_calib_mat: 평면화된 카메라 내재 행렬
      • depth_sample_rate:
        • 각 프레임에서 무작위로 샘플링된 h * w / depth_sample_rate 픽셀만 역투영합니다.
        • 매핑 속도를 높이려면 이 값을 높이세요.
        • 그러나 각 프레임에서 포인트 클라우드가 더 희박해짐

VLMap 인덱싱

  1. config/map_indexing_cfg.yaml에서 defaults/data_paths의 값을 default로 변경합니다.
  2. config/data_paths/default.yaml에서 habitat_scene_dir 및 vlmaps_data_dir을 위의 데이터셋 생성 섹션의 단계에 따라 변경합니다.
  3. 다음 명령어를 실행하여 빌드된 VLMap을 인덱싱합니다.
cd application
python index_map.py

인덱싱 구성

  1. config/map_indexing_cfg.yaml 파일을 변경합니다:
    • decay_rate:
      • 히트맵 감쇠율을 설정합니다.
      • 값이 작을수록 열의 전이가 더 뚜렷하고 더 넓은 영역을 덮습니다.
    • index_2d:
      • 2D 히트맵을 시각화하려면 True로 설정합니다.
      • 3D 히트맵을 시각화하려면 False로 설정합니다.
    • init_categories:
      • 인덱싱을 위해 선택할 고정된 카테고리 목록(MatterPort3D 카테고리)을 제공하려면 True로 설정합니다
        • (자세한 내용은 vlmaps/utils/matterport3d_categories.py를 확인).
      • 텍스트로 쿼리할 때, 코드는 고정 목록에서 가장 가까운 카테고리를 찾기 위해 GPT를 사용합니다.
      • 인덱싱을 위해 입력 쿼리만 사용하려면 False로 설정합니다.
        • True로 설정한 경우, 터미널에서 OPENAI_KEY=xxx를 실행하여 환경 변수 OPENAI_KEY를 OpenAI API 토큰으로 설정해야 합니다.

내비게이션 테스트

OpenAI 설정

  • 우리 방법으로 객체 목표 내비게이션 및 공간 목표 내비게이션 작업을 테스트하려면 다음 단계를 통해 OpenAI API 계정을 설정해야 합니다:
      1. OpenAI 계정에 가입하고, 계정에 로그인하고, 계정을 하나 이상의 결제 방법과 연결합니다.
      1. OpenAI API 키를 얻고 복사합니다.
      1. ~/.bashrc 파일을 열고, export OPENAI_KEY=<복사한 키>라는 새 줄을 붙여넣고 파일을 저장합니다.

객체 목표 내비게이션 실행

  • 객체 목표 내비게이션을 실행
  • 코드는 <scene_folder>/object_navigation_tasks.json에 지정된 작업을 로드
  • 결과는 <scene_folder>/vlmap_obj_nav_results/에 저장
cd application/evaluation
python evaluate_object_goal_navigation.py
  • 최종 메트릭을 계산하려면 다음을 실행:
cd application/evaluation
python compute_object_goal_navigation_metrics.py
  • config/object_goal_navigation_cfg.json을 구성합니다:
    • nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화
    • scene_id를 숫자(0~9) 또는 [0,1,3]와 같은 목록으로 수정하여 평가할 장면을 지정

공간 목표 내비게이션 실행

  • 공간 목표 내비게이션을 실행
    • 코드는 <scene_folder>/spatial_goal_navigation_tasks.json에 지정된 작업을 로드
    • 결과는 <scene_folder>/vlmap_spatial_nav_results/에 저장
    • config/spatial_goal_navigation_cfg.json에서 nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화
cd application/evaluation
python evaluate_spatial_goal_navigation.py

최종 메트릭을 계산하려면 다음을 실행합니다:

cd application/evaluation
python compute_spatial_goal_navigation_metrics.py

config/spatial_goal_navigation_cfg.json을 구성합니다:

  • nav/vis를 true로 수정하여 내비게이션 결과(POV, 탑다운 경로, 예측 목표 등)를 시각화합니다.
  • scene_id를 숫자(0~9) 또는 [0,1,3]와 같은 목록으로 수정하여 평가할 장면을 지정합니다.
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글