Navigation Stack은 로봇의 자율주행을 수행하기 위해 여러 ROS 패키지들을 조합하여 만든 네비게이션 시스템을 의미한다.
자율 주행을 위해 필요한 다음의 기능을 제공한다.
로봇이 주어진 환경에서 목표지점까지 장애물을 피해 최적의 경로를 찾아 이동하는 과정을 의미한다.
move_base는 ROS에서 자율 주행을 담당하는 핵심 패키지이다. move_base는 하나의 큰 블록처럼 네비게이션 수행에 필요한 기능들이 하나의 노드에서 실행된다.

Nav2는 ROS2에서 자율주행을 담당하는 프레임워크이다. Nav2 내에 자율 주행에 필요한 여러 패키지가 독립적인 노드 형태로 분리되어 실행된다.

네비게이션과 같이 긴 작업을 수행하는 로봇 동작을 제어하는 핵심 개념이다. 기본적인 ROS의 Service는 짧은 시간 내에 요청과 응답이 이루어지지만, Action Server는 장시간 실행되는 작업을 처리할 수 있도록 설계되었다.
장시간 작업 상황에서 액션 서버는 클라이언트로부터 다른 프로세스나 스레드에서 장기간 실행되는 작업 요청을 수락하고,실행이 완료되면 최종 결과를 반환하여 해당 상태를 종료한다.
또한. 작업이 완료될때까지 안정성을 위해 액션 서버는 클라이언트에게 feedback을 제공한다.

avigateToPose.action 는 특정 위치로 로봇을 이동시키는 작업을 수행하는 액션이다. 해당 액션에는 네비게이션 목표(goal)를 설정하고 결과(result)를 반환하고 진행상황(feedback)이 제공된다.

Lifecycle Node는 ROS2에서 노드의 상태를 관리하기 위해 사용되는 개념이다.
일반적인 ROS2 노드는 단순히 실행되거나 종료되는 구조이지만, Lifecycle Node는 여러 단계의 상태(State)를 가지며 제어 가능하다.

Nav2에서는 amcl, map_server, planner_server 등이 nav2_lifecycle_manager를 통해 관리된다.
각 노드는 필요할 때만 Active상채로 전환되어 실행되며, 이를 통해 네비게이션 노드들을 효율적으로 관리할 수 있다.
Tree 구조로 여러 노드들이 나무가지처럼 연결된 계층적 자료 구조이다. Nav2는 네비게이션의 흐름을 BT로 제어한다.

트리의 왼쪽 아래부터 오른쪽순으로 탐색하며 의존성이 없는 노드들이 우선적으로 실행되는 구조이다. 이를 통해 네비게이션 도중 장애물 회피, 복구 동작 등 다양한 동작을 조합하여 수행할 수 있다.
Nav2는 여러 개의 서버(Node)로 분리된 모듈형 구조로 동작한다. 각 서버는 네비게이션 핵심 기능을 실행한다.
planner_server:
ros__parameters:
expected_planner_frequency: 1.0
planner_plugins: ["GridBased"]
GridBased:
plugin: "nav2_navfn_planner/NavfnPlanner"
controller_server:
ros__parameters:
controller_plugins: ["FollowPath"]
FollowPath:
plugin: "dwb_core::DWBLocalPlanner"
smoother_server:
ros__parameters:
smoother_plugins: ["SimpleSmoother"]
SimpleSmoother:
plugin: "nav2_smoother::SimpleSmoother"
behavior_server:
ros__parameters:
behavior_plugins: ["spin", "back_up", "wait"]
spin:
plugin: "nav2_behaviors/Spin"
back_up:
plugin: "nav2_behaviors/BackUp"
Nav2에서 환경을 표현하는 주요 개념은 Costmap을 활용한다.
로봇이 이동할 수 있는 공간과 장애물의 위치를 나타내는 2D 그리드 맵이다. 각 셀은 특정 비용(cost)를 가지며, 로봇은 비용이 낮은 곳을 따라 최적의 경로를 설정한다.
rviz - Global Planner로 확인 가능
/map 기반으로 업데이트 빈도가 낮음 rviz - Controller로 확인 가능
costmap은 여러 개의 layer를 조합하여 생성되며, 각각의 layer는 특정한 역할을 담당한다.
◼ Global Costmap 생성 과정
/map에서 벽과 장애물 추가◼ Local Costmap 생성 과정
위와 같은 과정을 거쳐 layer들이 결합되면 로봇이 이동할 수 있는 비용지도(Costmap)가 완성된다.
/map데이터를 기반으로 이미 알려진 장애물의 위치를 costmap에 반영
이미지에서 하늘색은 Global Costmap, 자두색은 실제 장애물의 위치이다. 장애물 주변에는 진한 하늘색의 inflation layer가 설정되어 있어, Local Costmap에서 장애물 근처로 갈수록 cost가 증가하여 보라색-빨간색으로 표현된다. 이 구역을 로봇이 가까이 가면 로봇이 속도를 줄이거나, 로봇 radius가 큰 경우 빠져나가지 못할 수 있다. 높은 cost가 설정된 지역은 로봇이 이동에 어려움을 겪을 수 있으므로 파라미터 튜닝을 통해 이를 조절해주어야 한다.
기존 costmap에서 특정 영역을 필터링하여 추가적인 제한을 적용할 수 있다.