1. 실습 개요
이번 실습은 TurtleBot3 Burger를 이용하여 실제 강의실 환경을 기반으로 전체 주행 맵을 작성하고, 작성한 맵 위에서 Nav2를 이용해 여러 경유점을 순차적으로 방문하는 자율주행 프로그램을 구성하는 과정입니다.
실습 환경에는 강의실 내부, 강의실 주행 조형물, 강의실 복도, 강의실 앞 복도가 포함됩니다. 학생들은 Cartographer SLAM을 사용하여 전체 맵을 작성하고, RViz2에서 경유점을 지정한 뒤 TurtleBot3가 각 지점을 안정적으로 방문하도록 설정합니다.
이번 실습은 점수 평가 목적이 아니라 하루 실습 내용을 정리하고, 실제 로봇 주행 시스템을 준비하는 과정으로 진행됩니다.
2. 실습 목표
TurtleBot3 Burger를 이용하여 강의실 전체 환경의 맵을 작성합니다.
Cartographer SLAM을 사용하여 강의실 내부, 복도, 강의실 앞 복도, 주행 조형물 영역을 포함한 전체 맵을 생성합니다.
Nav2를 이용하여 저장된 맵에서 자율주행을 수행합니다.
강의실 밖 영역에는 2개 이상의 경유점을 설정합니다.
강의실 입구에는 2개의 포인트를 설정합니다.
강의실 복도에는 1개 이상의 경유점을 설정합니다.
강의실 주행 조형물의 건물 구조는 빠짐없이 방문하도록 경유점을 저장합니다.
각 경유점에 도착할 때마다 TTS 음성 또는 효과음을 출력하도록 프로그래밍 합니다.
Nav2 파라미터를 조정하여 강의실 주행 조형물과 복도 환경에서 안정적으로 주행하도록 설정합니다.
수정한 Nav2 파라미터를 저장합니다.
RViz2 설정을 저장하여 다음 실습에서도 같은 환경을 쉽게 불러올 수 있도록 합니다.
최종적으로 강사에게 주행 결과를 확인받습니다.
3. TurtleBot3 기본 실행 확인
먼저 TurtleBot3 Burger가 정상적으로 동작하는지 확인합니다.
TurtleBot3와 PC가 같은 네트워크에 연결되어 있는지 확인합니다.
ROS_DOMAIN_ID가 올바르게 설정되어 있는지 확인합니다.
TurtleBot3의 LiDAR 데이터가 정상적으로 들어오는지 확인합니다.
cmd_vel 명령으로 로봇이 움직이는지 확인합니다.
RViz2에서 LaserScan, TF, Odometry가 정상적으로 표시되는지 확인합니다.
기본 동작이 확인되지 않으면 SLAM과 Nav2 실습을 진행하지 말고 먼저 통신, 전원, 센서 상태를 확인해야 합니다.
4. Cartographer SLAM 실행
Cartographer SLAM을 실행하여 강의실 전체 환경의 맵을 작성합니다.
맵 작성 시에는 로봇을 너무 빠르게 움직이지 않습니다. 회전도 천천히 수행해야 합니다. 빠른 회전이나 급격한 이동은 맵 품질을 떨어뜨립니다.
맵 작성 순서는 다음과 같이 진행합니다.
강의실 내부를 먼저 주행합니다.
강의실 주행 조형물 주변을 천천히 이동합니다.
조형물 내부 또는 건물 구조를 따라 빠짐없이 이동합니다.
강의실 입구 주변을 스캔합니다.
강의실 복도 방향으로 이동합니다.
강의실 앞 복도까지 확장하여 맵을 작성합니다.
강의실 밖 영역에서 충분히 넓은 공간을 스캔합니다.
맵이 끊기거나 벽이 겹쳐 보이면 해당 구간을 다시 천천히 주행합니다.
5. 맵 작성 시 주의사항
Cartographer SLAM으로 맵을 만들 때는 다음 사항을 지켜야 합니다.
로봇을 손으로 들고 이동하지 않습니다.
급회전을 피합니다.
LiDAR 높이에 장애물이 제대로 보이는지 확인합니다.
유리문, 검은색 물체, 반사체 주변에서는 맵이 왜곡될 수 있으므로 천천히 이동합니다.
복도처럼 긴 공간에서는 벽과 평행하게만 이동하지 말고 중간에 방향을 바꾸어 위치 추정이 안정되도록 합니다.
강의실 주행 조형물은 모든 구조가 맵에 반영되도록 여러 방향에서 스캔합니다.
6. 맵 저장
맵 작성이 완료되면 map_server에서 사용할 수 있도록 맵을 저장합니다.
예시 명령은 다음과 같습니다.
ros2 run nav2_map_server map_saver_cli -f ~/maps/classroom_map
저장 후 다음 파일이 생성되었는지 확인합니다.
classroom_map.yaml
classroom_map.pgm
파일 이름은 팀별로 구분하기 쉽게 작성합니다.
예시:
teamname_map.yaml
teamname_map.pgm
7. Nav2 실행
저장한 맵을 이용하여 Nav2를 실행합니다.
Nav2 실행 후 RViz2에서 다음 항목을 확인합니다.
맵이 정상적으로 표시되는지 확인합니다.
로봇의 현재 위치가 맵 위에 올바르게 표시되는지 확인합니다.
2D Pose Estimate를 이용하여 초기 위치를 지정합니다.
LaserScan이 맵 구조와 잘 맞는지 확인합니다.
Global Costmap과 Local Costmap이 정상적으로 표시되는지 확인합니다.
8. 경유점 설정 기준
이번 실습에서는 단순히 한 지점만 이동하는 것이 아니라 여러 경유점을 순차적으로 방문해야 합니다.
경유점은 다음 조건을 만족해야 합니다.
강의실 밖에는 2개 이상의 경유점을 설정합니다.
강의실 입구에는 2개의 포인트를 설정합니다.
강의실 복도에는 1개 이상의 경유점을 설정합니다.
강의실 주행 조형물의 건물 구조는 모두 방문하도록 경유점을 설정합니다.
로봇이 이동하기 어려운 좁은 모서리나 충돌 위험이 큰 위치는 피합니다.
각 경유점은 로봇이 도착 후 회전하거나 다음 지점으로 이동할 수 있는 공간을 확보해야 합니다.
9. 경유점 예시 구성
경유점은 다음과 같이 구성할 수 있습니다.
1번 경유점: 강의실 내부 시작 지점
2번 경유점: 강의실 주행 조형물 입구
3번 경유점: 주행 조형물 내부 첫 번째 구조물
4번 경유점: 주행 조형물 내부 두 번째 구조물
5번 경유점: 주행 조형물 내부 세 번째 구조물
6번 경유점: 강의실 입구 안쪽 포인트
7번 경유점: 강의실 입구 바깥쪽 포인트
8번 경유점: 강의실 복도 포인트
9번 경유점: 강의실 밖 첫 번째 포인트
10번 경유점: 강의실 밖 두 번째 포인트
각 팀은 실제 강의실 구조에 맞게 경유점 수를 추가하거나 수정할 수 있습니다.
10. 경유점 저장
RViz2에서 각 경유점을 지정하고, 해당 좌표를 파일로 저장합니다.
경유점 저장 파일은 YAML, JSON, CSV 중 하나의 형식으로 정리할 수 있습니다.
예시 JSON 형식은 다음과 같습니다.
[
{
"name": "start_point",
"x": 0.0,
"y": 0.0,
"yaw": 0.0,
"sound": "start"
},
{
"name": "classroom_entrance_inside",
"x": 1.2,
"y": 0.8,
"yaw": 1.57,
"sound": "entrance_inside"
},
{
"name": "hallway_point_1",
"x": 3.5,
"y": -1.0,
"yaw": 0.0,
"sound": "hallway"
}
]
좌표값은 예시이므로 실제 실습 맵에서 측정한 값을 사용해야 합니다.
11. 경유점 주행 프로그램 작성
학생들은 저장된 경유점 파일을 읽어 Nav2에 순차적으로 목표 지점을 전달하는 프로그램을 작성합니다.
프로그램은 다음 기능을 포함해야 합니다.
경유점 파일을 읽습니다.
각 경유점의 x, y, yaw 값을 불러옵니다.
Nav2 action client를 이용하여 목표 지점으로 이동 명령을 보냅니다.
목표 지점 도착 여부를 확인합니다.
도착하면 TTS 또는 효과음을 출력합니다.
다음 경유점으로 이동합니다.
모든 경유점 방문이 끝나면 종료 메시지를 출력합니다.
12. TTS 또는 효과음 출력 기능
각 경유점에 도착할 때마다 로봇이 현재 위치를 알릴 수 있도록 TTS 또는 효과음을 출력합니다.
예시 음성 안내 문구는 다음과 같습니다.
“강의실 내부 지점에 도착했습니다.”
“강의실 주행 조형물 입구에 도착했습니다.”
“조형물 첫 번째 구조를 확인했습니다.”
“강의실 입구 안쪽 포인트에 도착했습니다.”
“강의실 입구 바깥쪽 포인트에 도착했습니다.”
“복도 경유점에 도착했습니다.”
“강의실 밖 첫 번째 지점에 도착했습니다.”
“전체 경유점 주행을 완료했습니다.”
TTS 구현이 어려운 경우에는 효과음 파일을 재생해도 됩니다. 단, 각 지점마다 도착 여부를 확인할 수 있어야 합니다.
13. Nav2 파라미터 조정
강의실 주행 조형물과 복도 환경에서는 기본 Nav2 파라미터만으로 주행이 불안정할 수 있습니다. 따라서 실제 주행 결과를 보면서 파라미터를 조정해야 합니다.
중점적으로 확인할 항목은 다음과 같습니다.
로봇이 벽이나 조형물에 너무 가깝게 붙는지 확인합니다.
좁은 구간에서 회전을 제대로 수행하는지 확인합니다.
장애물을 과도하게 피해서 경로를 찾지 못하는지 확인합니다.
목표 지점 근처에서 계속 흔들리거나 회전하지 않는지 확인합니다.
복도에서 위치 추정이 흔들리지 않는지 확인합니다.
14. 조정할 주요 Nav2 파라미터
다음 파라미터를 중심으로 조정합니다.
robot_radius
inflation_radius
cost_scaling_factor
max_vel_x
min_vel_x
max_vel_theta
acc_lim_x
acc_lim_theta
xy_goal_tolerance
yaw_goal_tolerance
controller_frequency
planner_frequency
좁은 조형물 구간에서는 속도를 낮추고, 회전 속도와 목표 허용 오차를 현실적으로 조정하는 것이 중요합니다.
15. 강의실 주행 조형물용 파라미터 조정 방향
강의실 주행 조형물 안에서 로봇이 안정적으로 움직이도록 다음 방향으로 조정합니다.
로봇이 구조물에 너무 가까이 붙으면 inflation_radius를 증가시킵니다.
경로를 너무 보수적으로 잡아 이동하지 못하면 inflation_radius를 조금 줄입니다.
좁은 구간에서 급격히 움직이면 max_vel_x와 max_vel_theta를 낮춥니다.
목표 지점 근처에서 계속 회전하면 yaw_goal_tolerance를 조금 넓힙니다.
목표 지점 근처에서 전진과 후진을 반복하면 xy_goal_tolerance를 조정합니다.
복도에서 로봇 위치가 흔들리면 AMCL 관련 파라미터와 초기 위치 설정 상태를 확인합니다.
16. Nav2 파라미터 저장
조정한 Nav2 파라미터는 반드시 별도 파일로 저장합니다.
예시 파일명은 다음과 같습니다.
teamname_nav2_params.yaml
기본 파일을 직접 덮어쓰기보다는 팀별 파일로 복사한 뒤 수정하는 것이 좋습니다.
예시:
cp nav2_params.yaml teamname_nav2_params.yaml
실습 종료 후에는 자신이 수정한 파라미터와 수정 이유를 간단히 정리합니다.
예시:
inflation_radius: 0.55 → 0.40
수정 이유: 조형물 내부 좁은 구간에서 경로 생성이 되지 않아 값을 줄임
max_vel_x: 0.26 → 0.15
수정 이유: 좁은 구조물 구간에서 로봇이 빠르게 움직여 충돌 위험이 있어 속도를 낮춤
yaw_goal_tolerance: 0.25 → 0.35
수정 이유: 목표 지점 근처에서 회전이 반복되어 허용 오차를 조금 증가시킴
17. RViz2 설정 저장
RViz2에서 실습에 필요한 화면 구성을 완료한 뒤 설정을 저장합니다.
저장해야 할 주요 표시 항목은 다음과 같습니다.
Map
TF
LaserScan
RobotModel
Global Costmap
Local Costmap
Global Plan
Local Plan
Pose Estimate
Goal Pose
Waypoint 표시 항목
RViz2 설정 파일은 다음과 같이 저장합니다.
teamname_nav2_view.rviz
저장한 RViz2 설정 파일을 사용하면 다음 실습에서 동일한 화면 구성을 빠르게 불러올 수 있습니다.
18. 최종 주행 확인
모든 설정이 완료되면 TurtleBot3가 저장된 경유점을 순서대로 방문하는지 확인합니다.
확인해야 할 내용은 다음과 같습니다.
맵 위에서 로봇 위치가 정상적으로 표시되는가
강의실 내부에서 출발이 가능한가
강의실 주행 조형물의 모든 구조를 방문하는가
강의실 입구 2개 포인트를 모두 방문하는가
강의실 복도 포인트를 방문하는가
강의실 밖 2개 이상의 포인트를 방문하는가
각 지점 도착 시 TTS 또는 효과음이 출력되는가
로봇이 장애물과 충돌하지 않는가
목표 지점 도착 후 다음 지점으로 자연스럽게 이동하는가
전체 주행 완료 후 종료 메시지가 출력되는가
19. 강사 확인
실습이 끝나면 강사에게 주행 결과를 확인받습니다.
강사 확인 시에는 다음 항목을 보여줍니다.
Cartographer로 작성한 전체 맵
저장된 맵 파일
경유점 좌표 파일
Nav2 주행 화면
실제 TurtleBot3 경유점 주행 결과
TTS 또는 효과음 출력 결과
수정한 Nav2 파라미터 파일
저장한 RViz2 설정 파일
조형물 내부 주행 결과
강의실 밖 경유점 방문 결과
20. 제출 또는 정리할 파일
조별 주행 영상, 사진