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 준비가 함께 맞물려야 합니다.
저희 창고 런에서는 이 순서를 아예 게이트로 만들어 뒀습니다. Nav2 를 바로 띄우지 않고, Isaac 이 TF 를 발행하기 시작할 때까지 기다렸다가 띄웁니다(최대 120초 대기). 한 런의 실제 기록입니다.
[Wrapper] Nav2 sequenced: waiting for Isaac TF publish event (max 120s)...
[Wrapper] Isaac TF publish detected (34s) — proceeding with Nav2 launch
[Wrapper] Nav2 staggered launch for robots: HO_A HO_B
[Wrapper] Nav2 Active reached (15s) — all 2 robots full lifecycle Active
런 하나에서 잰 Nav2 기동 타임라인. 앞 34초는 Isaac 이 씬을 올리고 TF 를 내보내기 시작할 때까지이고, 그 동안 Nav2 는 아예 실행되지 않습니다. TF 가 잡힌 뒤에야 로봇별로 시차를 두고 띄우며, 거기서 lifecycle 이 Active 에 닿기까지 다시 15초가 걸립니다. 대기 예산은 120초로 잡아 두었습니다.
두 가지가 눈에 띕니다. 하나는 34초라는 대기가 낭비가 아니라는 것 — 이 시간을 건너뛰면 costmap 이 자기 위치를 모른 채 활성화되어 위 경고의 「수십 초 기다림」에 빠집니다. 다른 하나는 로봇마다 시차를 두고 띄운다(staggered) 는 것입니다. 여러 로봇의 Nav2 를 동시에 올리면 DDS 검색과 lifecycle 전이가 서로 밀립니다.
💡 중복 등록 함정 — 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 설정 문제다.
