1. GIMP 설치
1) Ubuntu에서 GIMP 설치
다음 명령을 실행하여 GIMP를 설치합니다.
sudo apt update
sudo apt install gimp -y

설치 확인:
gimp --version

GIMP 실행:
gimp

또는 지도 파일을 바로 열 수 있습니다.
gimp map.pgm
2. ROS 2 지도 파일 구조
1) PGM 파일
.pgm 파일은 지도 이미지입니다.
색상 의미는 다음과 같습니다.
| 검정색 | 장애물 | 벽, 물체, 진입 금지 구역 |
| 흰색 | 자유 공간 | 로봇이 이동 가능한 영역 |
| 회색 | 미확인 영역 | SLAM이 확인하지 못한 영역 |
일반적인 픽셀 값은 다음과 같습니다.
검정색: 0
흰색: 254 또는 255
회색: 약 205
즉, GIMP에서 수정할 때 기준은 단순합니다.
검정색으로 칠하면 장애물
흰색으로 칠하면 이동 가능 공간
회색으로 칠하면 미확인 영역
2) YAML 파일
예시:
image: turtlebot3_map.pgm
mode: trinary
resolution: 0.05
origin: [-1.21, -2.4, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25
a. image: turtlebot3_map.pgm
지도 이미지 파일 이름입니다.
image: turtlebot3_map.pgm
turtlebot3_map.pgm 파일을 실제 맵 이미지로 사용한다는 뜻입니다. PGM 이미지는 흑백 이미지입니다.
이 이미지를 기반으로 로봇이 갈 수 있는 곳과 갈 수 없는 곳을 판단합니다.
2. mode: trinary
이미지를 지도 값으로 변환하는 방식입니다.
mode: trinary
trinary는 맵을 세 가지 값으로만 나눕니다.
| Free | 0 | 이동 가능 |
| Occupied | 100 | 장애물 |
| Unknown | -1 | 알 수 없음 |
즉, 애매한 회색 값도 임계값 기준으로 free / occupied / unknown 중 하나로 분류합니다.
ROS Navigation에서 가장 흔히 쓰는 방식입니다.
3. resolution: 0.05
지도 이미지의 픽셀 하나가 실제 세계에서 몇 미터인지 나타냅니다.
resolution: 0.05
뜻은:
1 pixel = 0.05 m
즉,
1 pixel = 5 cm
예를 들어 이미지 크기가 400 x 400 pixel이면 실제 맵 크기는:
400 × 0.05 = 20 m
따라서 실제 공간 크기는:
20 m × 20 m
입니다.
해상도가 작을수록 정밀하지만, 맵 데이터가 커집니다.
| 0.01 | 1픽셀 = 1cm, 매우 정밀 |
| 0.05 | 1픽셀 = 5cm, 일반적인 TurtleBot3 맵 |
| 0.10 | 1픽셀 = 10cm, 덜 정밀하지만 가벼움 |
4. origin: [-1.21, -2.4, 0]
지도 이미지의 원점이 실제 좌표계에서 어디에 위치하는지 나타냅니다.
origin: [-1.21, -2.4, 0]
형식은 다음과 같습니다.
origin: [x, y, yaw]
이 맵의 왼쪽 아래 픽셀 위치가 실제 /map 좌표계에서:
x = -1.21 m
y = -2.4 m
yaw = 0 rad
에 놓인다는 뜻입니다.
중요한 점은 origin은 보통 이미지의 왼쪽 아래 모서리 기준입니다.
PGM 이미지는 화면상으로는 왼쪽 위부터 보이지만, ROS 좌표계에서는 왼쪽 아래를 기준으로 봅니다.
5. negate: 0
이미지의 흑백 의미를 반전할지 여부입니다.
negate: 0
0이면 반전하지 않습니다.
일반적인 해석은:
| 검은색 | 장애물 |
| 흰색 | 자유 공간 |
만약 negate: 1이면 반대로 해석됩니다.
| 검은색 | 자유 공간 |
| 흰색 | 장애물 |
대부분의 SLAM으로 생성된 맵은 negate: 0을 사용합니다.
6. occupied_thresh: 0.65
장애물로 판단하는 임계값입니다.
occupied_thresh: 0.65
픽셀의 occupancy 확률이 0.65 이상이면 장애물로 판단합니다.
occupancy >= 0.65 → Occupied
즉, 장애물일 확률이 65% 이상이면 해당 셀은 장애물입니다.
Occupancy Grid에서는 보통 장애물 셀이 100으로 표현됩니다.
negate: 0일 때 occupancy 확률은 아래의 식으로 구할 수 있습니다.
occupancy = (255 - pixel_value) / 255
7. free_thresh: 0.25
이동 가능한 공간으로 판단하는 임계값입니다.
free_thresh: 0.25
픽셀의 occupancy 확률이 0.25 이하이면 자유 공간으로 판단합니다.
occupancy <= 0.25 → Free
즉, 장애물일 확률이 25% 이하이면 이동 가능한 공간입니다.
Occupancy Grid에서는 보통 자유 공간이 0으로 표현됩니다.
8. occupied_thresh와 free_thresh 사이 값
두 임계값 사이의 값은 미확인 영역으로 처리됩니다.
0.25 < occupancy < 0.65 → Unknown
즉:
| 0.00 ~ 0.25 | Free |
| 0.25 ~ 0.65 | Unknown |
| 0.65 ~ 1.00 | Occupied |
3. GIMP로 지도 열기
터미널에서 실행:
gimp map.pgm
또는 GIMP에서 직접 열기:
File → Open → map.pgm


파일을 연 후 먼저 이미지 모드를 확인합니다.
Image → Mode → Grayscale

ROS 2 지도는 일반적으로 흑백 Grayscale 이미지로 유지해야 합니다.
4. 수정 전 백업
원본을 바로 수정하면 안 됩니다. 먼저 복사본을 만듭니다.
cp turtlebot3_map.pgm turtlebot3_map_origin.pgm
mv turtlebot3_map.pgm turtlebot3_map_modified.pgm
이후에는 map_modified.pgm만 수정합니다.
gimp ~/maps/edit/map_modified.pgm

5. GIMP에서 주로 사용하는 도구
1) Pencil Tool 사용
지도 수정에는 Brush보다 Pencil Tool이 좋습니다.
Tools → Paint Tools → Pencil

단축키:
N
권장 설정:
Opacity: 100%
Hardness: 100%
Pencil Tool은 가장자리를 흐리게 만들지 않아 지도 수정에 적합합니다.
2) 색상별 수정 기준
| 벽 추가 | 검정색 |
| 가상 벽 추가 | 검정색 |
| 노이즈 제거 | 흰색 |
| 잘못 생긴 벽 제거 | 흰색 |
| 지도 외곽 정리 | 회색 |
| 미확인 영역 복원 | 회색 |

6. 대표적인 지도 수정 작업
1) SLAM 노이즈 제거
SLAM 후 지도에 작은 검은 점이나 이상한 선이 생길 수 있습니다.
이런 노이즈는 로봇이 장애물로 인식할 수 있습니다.
수정 방법:
1. Pencil Tool 선택
2. 흰색 선택
3. 검은 노이즈를 흰색으로 칠함
4. 저장
2) 잘못 생성된 벽 제거
사람, 임시 물체, 센서 오류 때문에 복도 중간에 벽처럼 생긴 선이 생길 수 있습니다.
수정 방법:
1. 흰색 선택
2. 잘못된 검은 선을 흰색으로 지움
3. 실제 벽은 지우지 않도록 주의
실제 벽을 지우면 로봇이 벽을 통과하는 경로를 만들 수 있습니다.
3) 가상 벽 추가
로봇이 들어가면 안 되는 구역은 검은색으로 막을 수 있습니다.
예:
계단
위험 구역
사람 전용 공간
유리문 근처
좁은 통로
수정 방법:
1. 검정색 선택
2. Pencil Tool 또는 Rectangle Select Tool 사용
3. 진입 금지 구역 앞에 검정색 선 추가
권장 두께:
3~10 pixel 정도
너무 얇으면 Nav2 costmap에서 안정적으로 반영되지 않을 수 있습니다.

4) 지도 외곽 정리
지도 바깥이나 탐색하지 않은 영역은 흰색으로 만들지 않는 것이 좋습니다.
권장:
지도 외곽 = 회색
흰색으로 칠하면 로봇이 지도 밖을 이동 가능 영역으로 판단할 수 있습니다.
7. 저장 방법
수정 후에는 Export로 저장합니다.
File → Export As


파일명 예:
map_modified.pgm
가능하면 다음 상태를 유지합니다.
Grayscale
8-bit
PGM
레이어를 사용했다면 저장 전에 병합합니다.
Image → Flatten Image

8. YAML 파일 수정
PGM 파일명을 바꿨다면 YAML 파일의 image 항목도 수정해야 합니다.
수정 전:
image: turtlebot3_map_origin.pgm
mode: trinary
resolution: 0.05
origin: [-1.21, -2.4, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25
수정 후:
image: turtlebot3_map_modified.pgm
mode: trinary
resolution: 0.05
origin: [-1.21, -2.4, 0]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.25


주의할 점:
resolution 변경 금지
origin 변경 금지
이미지 크기 변경 금지
이 값들이 바뀌면 RViz에서 로봇 위치와 지도가 어긋날 수 있습니다.
9. 수정한 지도 실행
Nav2에서 수정한 지도를 사용할 때:
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True \
map:=$HOME/maps/turtlebot3_map_modified.yaml

새롭게 작성한 지도 위에서 Nav2 Goal을 이용하여 주행을 시작합니다. 다양한 위치를 목표지점으로 정하고 주행하면서 주행성능을 확인하시기 바랍니다.
'강좌 > ROS2' 카테고리의 다른 글
| 10일차 강의 (0) | 2026.05.31 |
|---|---|
| launch 파일에서 실행 인자 사용하기 #2 (0) | 2026.05.29 |
| Cancel 테스트용 Action Client 만들기 (0) | 2026.05.26 |
| ROS 2 Python Topic 실습 : RobotStatus 메시지로 로봇 상태 주고받기 (0) | 2026.05.26 |
| Python 기본 타입 메시지 Publisher / Subscriber 예제 (0) | 2026.05.26 |