← BlogAMR 내비게이션 입문· 6/12

Nav2 Lifecycle과 Behavior Tree — 내비게이션 스택은 어떻게 깨어나는가

Nav2 서버들이 정해진 순서로 활성화(lifecycle)되고, bt_navigator가 Behavior Tree로 경로계획·추종·복구를 오케스트레이션하는 구조. 그리고 활성화 순서가 어긋날 때 나는 실제 오류.

약 2분
Nav2lifecyclebehavior-treebt-navigatorROS2

Nav2 Lifecycle과 Behavior Tree

Nav2를 처음 띄우면 "분명 다 켰는데 로봇이 안 움직인다"는 상황을 자주 만납니다. 원인의 대부분은 활성화 순서Behavior Tree 두 가지에 있습니다. 이 둘을 알면 Nav2가 "어떻게 깨어나고, 어떻게 일하는지"가 보입니다.

노드는 단계적으로 깨어난다 — Lifecycle

ROS 2의 핵심 노드들은 그냥 켜지는 게 아니라 lifecycle(생애주기) 상태를 거칩니다: Unconfigured → Inactive → Active. Nav2의 여러 서버(map_server, planner, controller, behavior, bt_navigator…)는 lifecycle_manager가 정해진 순서로 한꺼번에 Active로 전이시킵니다.

도식 렌더링 중…

순서가 중요한 이유: 뒤 노드가 앞 노드에 의존합니다. 예를 들어 bt_navigator는 planner·controller가 Active여야 경로계획·추종을 호출할 수 있습니다.

⚠️ TF가 늦으면 멈춘다 — 좌표 변환(map → odom → base_link)이 준비되기 전에 costmap이 활성화되면, costmap은 자기 위치를 몰라 수십 초간 "기다림"으로 멎습니다. 활성화 순서에 TF 준비가 함께 맞물려야 합니다.

💡 중복 등록 함정 — bt_navigator에 같은 BT 노드 플러그인을 두 번 선언하면 ComputePathToPose already registered 같은 오류로 활성화가 실패합니다. 플러그인 목록은 중복 없이.

일은 트리로 한다 — Behavior Tree

활성화가 끝나면, 실제 "목적지까지 가라"는 명령은 Behavior Tree(BT) 로 실행됩니다. bt_navigator가 BT를 tick(주기적 평가)하면서 경로계획·추종·복구를 순서와 조건에 따라 호출합니다.

도식 렌더링 중…

BT의 강점은 실패 처리가 트리 구조에 녹아 있다는 점입니다. 경로 추종이 실패하면 곧장 복구(spin/backup) 가지로 빠졌다가 다시 시도합니다. "성공/실패/실행중"이라는 단순한 신호의 조합만으로 복잡한 내비게이션 행동이 표현됩니다.

이 구조 덕분에, 다음 글에서 볼 경로 계획기(planner)컨트롤러(controller) 가 각자 자기 일에만 집중할 수 있습니다 — 언제 무엇을 부를지는 BT가 조율하니까요.

한 줄 정리

📌 Nav2는 lifecycle 순서로 깨어나고(map_server→…→bt_navigator, TF가 함께 준비돼야 함), 깨어난 뒤엔 Behavior Tree가 경로계획·추종·복구를 tick으로 조율한다. "안 움직인다"의 대부분은 활성화 순서/TF 또는 BT 설정 문제다.