Nav2 구조

목표만 찍었는데, 길은 누가 찾고 바퀴는 누가 돌릴까?

큰 그림

목표에서 경로로, 경로에서 속도로

Nav2(Navigation2)는 여러 서버 노드의 묶음입니다. bt_navigator가 목표를 받아 일을 나누고, planner_server가 경로를 만들고, controller_server가 그 경로를 따라갈 속도를 /cmd_vel로 냅니다.

실제로는 속도를 부드럽게 다듬고 충돌을 검사하는 노드 둘을 거쳐 /cmd_vel이 됩니다. 목표는 액션(9강)으로 받습니다.

코스트맵

지도에 비용을 칠합니다

Nav2는 지도를 그대로 쓰지 않고 코스트맵(costmap)으로 바꿉니다. 벽 칸은 갈 수 없는 곳, 벽 둘레는 가까울수록 비싼 곳으로 칠해(inflation) 로봇이 벽에 붙어 다니지 않게 합니다.

저장한 지도에 라이다로 본 장애물을 더한 전역(global) 코스트맵과, 로봇 둘레만 라이다로 바로바로 칠하는 지역(local) 코스트맵 두 장을 씁니다.

계획기

planner는 전체 경로를 긋습니다

planner_server는 전역 코스트맵 위에서 지금 자리부터 목표까지 비용이 가장 적은 길을 찾습니다. 그래서 경로는 벽에 바짝 붙지 않고 기둥 사이 가운데쯤을 지납니다.

TurtleBot3 설정은 NavFn 계획기를 씁니다.

제어기

controller는 지금 속도를 정합니다

controller_server는 경로를 따라가도록 바로 다음 순간의 속도를 고릅니다. 여러 움직임 후보를 지역 코스트맵 위에서 시험해 점수가 가장 좋은 것을 속도 명령으로 냅니다.

TurtleBot3 설정은 DWB 제어기를 1초에 10번 돌립니다. 그림의 속도 숫자는 예시입니다.

행동 트리

순서는 행동 트리가 정합니다

bt_navigator는 행동 트리(behavior tree)에 적힌 순서대로 서버들을 부릅니다. 기본 트리는 1초마다 경로를 다시 계산하며 따라가고, 막히면 코스트맵 비우기, 제자리 돌기, 기다리기, 뒤로 가기로 풀어 봅니다.

복구 동작은 behavior_server가 맡습니다. 트리는 XML 파일이라 바꿔 쓸 수 있습니다.

켜는 순서

Nav2 노드는 라이프사이클 노드입니다

Nav2 노드는 라이프사이클 노드(lifecycle node)라서 켜지자마자 일하지 않고, 설정(configure)과 활성(activate) 단계를 거친 뒤에 일합니다. lifecycle_manager가 이 단계를 정해진 순서대로 밟아 줍니다.

slam_toolbox도 라이프사이클 노드입니다. 3편의 "node is activating" 줄이 그 흔적입니다.

다음 편

이제 지도 위를 한 번 누르기만 하면 됩니다

8편목표 찍으면 간다 15강 목록