본문으로 건너뛰기

M15.02 · 점유 격자·지도 좌표·지도 저장과 재사용

단위별 목표·권장 선수와 자료 준비 상태를 확인하고, 공개된 본문과 활동을 읽고 준비 상태를 확인할 수 있습니다.

전체 커리큘럼

학습 안내

본문을 읽고 장비 없는 기본 실습·세 확인 문제와 해설로 이해를 확인하세요.

예상 학습 시간: 미정. 이 페이지 방문이나 자료 열람으로 완료·숙달을 자동 부여하지 않습니다.

현재 경로·이전·다음 단위 확인 ↓

학습 목표

  • 점유 격자의 배열 인덱스와 셀 중심의 지도 좌표를 해상도·원점으로 계산한다.
  • 지도 이미지와 메타데이터의 역할을 구분하고 저장 변환의 정보 손실을 판정한다.
  • 저장 지도를 재사용할 때 좌표·위치 추정·환경 유효성과 실행 근거를 점검한다.

아래 설명·실습·문제로 각 학습 목표를 확인하세요.

권장 선수

M15.01의 지도와 위치 추정을 연결한다. 좌표 회전과 배열 순서는 본문에서 다시 정의한다. 작은 합성 격자와 가상 파일을 종이로 해석하며 실제 Nav2·지도 저장이나 로봇을 실행하지 않는다. 이미 알고 있다면 직접 열어볼 수 있습니다.

설명 필수

세 목표에 대응하는 검수된 설명·예제를 읽습니다.

지도는 그림과 공간 해석의 계약이다

점유 격자(occupancy grid)는 공간을 일정한 크기의 셀로 나누고 각 셀의 점유 상태를 기록하는 지도 표현이다. 지도에서 하얀 영역이 보인다고 그곳을 로봇이 반드시 통과할 수 있는 것은 아니다. 센서가 무엇을 관측했는지, 셀 값이 무엇을 뜻하는지, 로봇 크기와 현재 환경이 어떤지 확인해야 한다. 이 단위는 셀을 지도 좌표에 놓고 파일로 옮기는 과정을 다룬다. 경로 탐색이나 실제 주행 성공은 별도 문제다.

점유 격자의 행과 지도 축. 그림의 숫자는 width=4인 별도 인덱스 예시이며 점유 확률이 아니다. 지도 y는 위로 증가한다. 화면 이미지 행 방향과 지도 셀 j의 대응은 저장/변환 규칙으로 확인한다. 미상은 빈 공간과 다르다.그림 원본 크기로 보기

그림 M15.02-1. 그림의 숫자는 width=4인 별도 인덱스 예시이며 점유 확률이 아니다. 지도 y는 위로 증가한다. 화면 이미지 행 방향과 지도 셀 j의 대응은 저장/변환 규칙으로 확인한다. 미상은 빈 공간과 다르다. 직접 제작.

Jazzy OccupancyGrid 정의는 2D 격자와 행 우선 배열을 제공하지만 값의 의미는 응용에 따라 달라질 수 있다고 명시한다. 여기서는 Nav2의 계약을 사용해 0은 빈 셀, 100은 점유 셀, −1은 미상으로 정한다. 중간 값의 의미와 처리도 생산자·소비자가 합의해야 한다. −1을 숫자가 작으니 가장 비어 있다고 해석하면 안 된다. 미상은 빈 공간이라는 관측 근거가 없다는 뜻이다.

행 우선 배열을 지도 좌표로 읽는다

합성 지도는 너비 W=3셀, 높이 H=2셀, 해상도 r=0.5 m/cell이다. 정수 i는 셀의 x방향 번호, j는 y방향 번호이며 둘 다 0부터 시작한다. 유효 범위는 0≤i<W, 0≤j<H다. 배열 위치 n=jW+i를 사용하므로 data=[0,100,−1,0,0,100]의 처음 세 값은 j=0 행이고 다음 세 값은 j=1 행이다. 셀 (1,0)은 n=1에서 100, 셀 (1,1)은 n=4에서 0이다. 유효 셀 수와 배열 길이는 W×H=6으로 일치해야 한다.

지도 원점은 셀 (0,0)의 중심이 아니라 그 셀의 왼쪽 아래 모서리 pose다. 원점 위치를 o=(o_x,o_y) m, 격자 축이 지도 축에 대해 반시계 회전한 각을 θ rad라고 하자. 열벡터를 사용하고 R(θ)는 평면 회전행렬이다. 셀 중심의 지도 좌표 p는 다음과 같다.

p=[oxoy]+R(θ)[(i+1/2)r(j+1/2)r],R(θ)=[cos⁡θ−sin⁡θsin⁡θcos⁡θ].p=\begin{bmatrix}o_x\\o_y\end{bmatrix}+R(\theta)\begin{bmatrix}(i+1/2)r\\(j+1/2)r\end{bmatrix},\qquad R(\theta)=\begin{bmatrix}\cos\theta&-\sin\theta\\\sin\theta&\cos\theta\end{bmatrix}.

θ=0, o=(1,−1) m이면 셀 (1,0)의 중심까지 격자 안에서 이동한 거리는 (0.75,0.25) m다. 원점을 더해 p=(1.75,−0.75) m가 된다. 1/2을 빠뜨리면 (1.5,−1)이라는 셀 모서리를 계산하게 된다. 지도 크기는 격자 축에서 1.5 m×1.0 m이며 셀 개수와 미터를 혼동하지 않는다.

같은 원점에서 θ=π/2이면 (0.75,0.25)를 회전한 값은 (−0.25,0.75)다. 따라서 중심은 (0.75,−0.25) m다. 원점 좌표만 더하고 회전을 무시하면 다른 장소를 가리킨다. MapMetaData의 origin은 Pose이므로 메시지에서는 방향을 quaternion으로 표현한다. 여기서 θ는 평면 yaw를 풀어 쓴 기호이며 YAML origin의 세 번째 값도 yaw rad다.

반대로 지도 점에서 셀을 찾으려면 원점을 빼고 역회전 R(−θ)를 적용한 뒤 각 성분을 r로 나눠 바닥 함수로 내린다. 바닥 함수는 해당 값 이하의 가장 큰 정수다. θ=0에서 점 (1.6,−0.4) m는 원점 기준 (0.6,0.6) m이므로 (i,j)=(1,1), n=4에 들어간다. 셀 중심은 (1.75,−0.25) m로 원래 점과 같을 필요가 없다. 오른쪽 바깥 경계 x=2.5 m는 i=3이 되어 범위 밖이다. 범위 밖 값을 마지막 셀로 조용히 바꾸지 않는다.

이미지 위아래와 지도 아래위는 다르다

일반적인 지도 이미지의 첫 행은 화면 위쪽이다. 격자 배열의 첫 행은 j=0인 아래쪽이다. 위 합성 지도를 화면에 그리면 윗줄은 [0,0,100], 아랫줄은 [0,100,−1]이다. 실제 색은 저장 방식에 따라 달라지지만 공간 배치는 이 순서다. 이미지의 첫 행을 그대로 격자 첫 행에 넣으면 장애물을 상하 반전한 지도를 만들 수 있다.

Nav2 Jazzy map_io 구현은 이미지 로딩과 저장에서 이 세로 방향을 변환한다. 직접 배열을 만드는 코드와 파일 로더가 이미 수행하는 변환을 함께 쓰면 두 번 뒤집을 수도 있다. 어떤 단계가 행 방향을 바꾸는지 기록한다. 화면 모양만 비슷하다고 인덱스와 원점이 맞는 것으로 승인하지 않는다.

파일 두 개와 변환 규칙을 함께 보관한다

가상 파일 /maps/lab.yaml은 image: lab.pgm, resolution: 0.5, origin: [1.0,−1.0,0.0], mode: trinary, negate: 0, free_thresh: 0.196, occupied_thresh: 0.65를 가진다고 하자. 이미지의 크기는 3×2다. image는 YAML 파일 위치를 기준으로 찾는 상대 경로이므로 이 입력의 이미지 목적지는 /maps/lab.pgm이다. 현재 터미널 폴더를 기준으로 해석하지 않는다. 실제 환경에서는 파일 존재·접근과 로더 결과를 따로 확인해야 한다.

trinary는 빈 공간·점유·미상의 세 범주로 바꾸는 방식이다. 투명도가 없는 8비트 회색 이미지와 negate=0인 이 예에서 밝기 g의 점유 변환값은 1−g/255다. g=0은 1로 점유, g=254는 약 0.00392로 빈 공간, g=205는 약 0.196078로 두 임계값 사이여서 미상이 된다. 임계값을 임의로 0.25로 바꾸면 같은 205가 빈 공간으로 해석될 수 있다. 색이 같아도 메타데이터 변경으로 의미가 바뀌는 이유다.

원래 격자의 중간 확률이나 신뢰 정보가 세 범주로 합쳐지면 원래 값을 복원할 수 없다. 저장 성공을 모든 추정 상태의 무손실 백업으로 쓰지 않는다. 정적 점유 지도 이미지와 SLAM의 관측·제약·pose graph 상태도 서로 다른 자료다. 지도 파일 쌍의 버전·생성 조건, 해상도·원점·인코딩과 필요한 별도 상태를 기록한다. 저장기와 로더의 버전 및 선택 mode에 따라 세부 변환이 다르므로 여기의 숫자를 모든 지도 파일 규격으로 일반화하지 않는다.

저장 지도를 불러오는 것과 현재 위치를 아는 것은 다르다

Nav2 Map Server는 지도 파일을 로딩하고 제공하는 역할이다. 지도 파일이 로봇의 현재 pose를 자동으로 알려주지는 않는다. 위치 추정에는 관측과 초기 조건, 지도 좌표와 odom을 연결할 근거가 필요하다. 다른 건물의 지도를 이름만 맞춰 로딩하거나 가구가 바뀐 구역을 과거의 빈 공간으로 믿으면 파일 처리가 성공해도 과업은 실패할 수 있다.

재사용 점검은 파일 쌍의 동일성, 실제 해석된 크기·해상도·원점, 좌표 변환, 현재 센서와 지도 대응, 환경 변경, 위치 추정의 모호성 순으로 진행한다. 정적 파일 읽기만 했다면 그 범위로 보고하고 실제 토픽 제공·위치 추정·주행 검증을 분리한다. 기존 4.3 TF2 트리 설계로 좌표 연결을, 6.6 평가 설계로 조건별 성공과 실패 기록을 보충한다. 이 활동의 계산 통과는 실제 지도 재사용 성능의 승인이 아니다.

학습 범위와 한계

기본 설명·예제가 준비되었습니다. 기존 보충 자료의 범위와 구별하세요.

실습 필수

장비 없는 실습을 수행하고 관찰·계산 근거를 해설과 비교합니다.

입력은 본문의 W=3, H=2, r=0.5 m/cell, o=(1,−1) m, θ=0, data=[0,100,−1,0,0,100]이다. 가상 /maps/lab.yaml과 lab.pgm의 필드는 본문과 같고 실제 파일이나 ROS는 필요하지 않다. 변경안 A는 이미지만 복사하고 origin을 [0,0,0]으로 새로 쓰며, B는 원래 파일 쌍을 유지하지만 현재 복도에 새 선반이 있다고 한다.

  1. 셀 (1,0), (1,1)의 인덱스와 값·중심 좌표를 계산하고 화면의 위아래 두 행을 적는다. θ만 π/2로 바꾼 셀 (1,0)의 중심도 구한다.
  2. 이미지 목적지와 g=0/254/205의 해석을 적는다. A에서 무엇이 바뀌며 원래 중간 확률이 모두 복원되는지 판정한다.
  3. B의 파일 로딩과 실제 지도 유효성을 구분한다. 현재 위치 추정과 선반 확인을 위해 필요한 관측·좌표·실행 근거를 제안한다.

관찰 결과는 좌표 계산, 파일 해석, 재사용 근거로 나누어 기록한다. 막히면 원점에서 셀 중심까지의 이동을 먼저 그린다. 미상과 범위 밖을 빈 공간으로 바꾸어 계산을 맞추지 않는다.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

기본 실습은 장비 없이 수행합니다. 실제 장비·GPU 실증을 완료했다는 뜻은 아닙니다.

평가·해설 필수

목표별 세 서술문항에 답하고 해설·판정 기준으로 자기검토합니다.

확인 문제 Q1

θ=0인 본문 지도에서 점 (1.6,−0.4) m의 셀과 배열 위치·셀 중심을 구하라. x=2.5 m인 오른쪽 경계를 유효한 마지막 셀로 볼 수 있는가?

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q2

/maps/lab.yaml의 image가 lab.pgm이다. 이미지 목적지는 어디이며, g=205가 free_thresh=0.196과 0.25에서 각각 어떻게 달라지는가? trinary 저장을 원래 확률의 무손실 저장이라고 할 수 있는가?

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q3

지도를 성공적으로 읽었으니 현재 로봇 pose와 선반 없는 통행 공간도 확인됐다고 한다. 이 주장에 부족한 근거와 재사용 점검 절차를 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

서술답안과 해설이 준비되었습니다. 자기검토와 학습 완료는 숙달 인증과 별개입니다.

참고 자료

학습 확인

실습과 세 문항의 답안을 해설과 비교한 뒤, 이 단위의 학습 완료를 직접 기록할 수 있습니다. 자기검토·학습 완료는 자동 채점이나 숙달 인증과 별개입니다.

실습1개·확인 문제3개의 답안을 저장하고 각각 자기검토를 기록하세요.

학습 이동

학습 단계 순서 · 공통 과정 이후 전문화 선택

전체 목차로 돌아가기 →

신규 활동의 답안은 이 브라우저의 통합 학습 기록에 저장합니다. 기존 화면의 답안·진도는 원래 키를 유지합니다. AI 강사는 현재 단위의 준비 상태·부족한 범위와 연결된 실제 자료를 참고합니다.