핵심 요약
- 행동 트리는 복잡한 임무를 재사용 가능한 작은 조건과 행동 노드로 나누는 계층 구조입니다.
- 루트에서 시작한 ‘틱’은 노드를 따라 내려가며 각 노드의 성공·실패·실행 중 상태를 읽습니다.
- Sequence는 일을 순서대로 진행하고, Fallback은 앞선 선택이 실패하면 다음 대안을 시도합니다.
- Nav2에서는 경로 계산·추종이 실패하면 지도 정리·회전·후진 뒤 다시 계획하는 흐름을 구성할 수 있습니다.
- 행동 트리는 판단 흐름을 정리하는 도구이지 충돌 방지, 안전정지 또는 안전 인증 자체는 아닙니다.
행동 트리는 로봇의 ‘해야 할 일’을 나무로 그립니다
병원 배송 로봇이 약품 상자를 들고 복도를 달린다고 생각해 보겠습니다. 목표 방으로 가려면 배터리가 충분한지 확인하고, 지도를 읽어 경로를 만들고, 사람과 카트를 피하며 이동하고, 문이 닫혔거나 길이 막히면 다른 방법을 찾아야 합니다. 이 많은 규칙을 한 줄의 긴 프로그램으로 엮으면 작은 수정 하나가 예상하지 못한 곳까지 영향을 줄 수 있습니다. 행동 트리(Behavior Tree)는 이런 복잡한 일을 나뭇가지처럼 작은 단위로 나눠 연결하는 방법입니다.
나무 맨 위에는 ‘배송을 완료한다’ 같은 전체 목표가 있습니다. 아래로 내려가면 ‘배터리 확인’, ‘경로 계산’, ‘경로 추종’, ‘장애물 복구’ 같은 하위 작업이 달립니다. 가장 끝의 잎에는 실제로 센서를 읽는 조건 노드와 모터나 경로계획기를 호출하는 행동 노드가 놓입니다. BehaviorTree.CPP 공식 문서는 이 잎 노드를 레고 블록에 비유합니다. 작은 노드를 잘 만들면 다른 임무에서도 다시 조합할 수 있다는 뜻입니다.

틱과 세 가지 상태가 판단을 계속 움직입니다
행동 트리는 한 번 위에서 아래로 읽고 끝나는 체크리스트가 아닙니다. 루트 노드에 틱(tick)이라는 실행 신호가 반복해서 들어오고, 신호는 규칙에 따라 자식 노드로 전달됩니다. 각 노드는 성공(SUCCESS), 실패(FAILURE), 실행 중(RUNNING) 가운데 하나를 돌려줍니다. 문이 열렸는지 묻는 조건은 바로 성공이나 실패를 내놓고, 복도를 이동하는 행동은 아직 도착하지 않았다면 실행 중을 돌려줄 수 있습니다.
다음 틱이 오면 트리는 현재 상태를 다시 확인합니다. 조금 전까지 비어 있던 복도에 사람이 나타나면 경로 추종 노드의 결과가 바뀔 수 있습니다. 이 반복 구조 덕분에 행동 트리는 정해진 순서만 재생하는 스크립트보다 환경 변화에 반응하기 쉽습니다. 다만 틱 주기가 빠르다고 로봇의 모든 제어가 빨라지는 것은 아닙니다. 모터 제어 주기, 센서 지연, 경로계획 시간은 각각 별도로 설계해야 합니다.
Sequence와 Fallback은 무엇이 다를까요
가장 자주 쓰이는 제어 노드는 Sequence와 Fallback입니다. Sequence는 ‘먼저 이것, 성공하면 다음 것’을 뜻합니다. 배터리 확인이 성공하고, 경로 계산이 성공하고, 경로 추종까지 성공해야 전체 배송 단계가 성공합니다. 중간 하나가 실패하면 뒤의 작업은 진행하지 않고 Sequence가 실패를 돌려줍니다. 준비가 끝나지 않았는데 이동부터 시작하는 일을 막는 구조입니다.
Fallback은 ‘첫 번째 방법이 안 되면 다음 방법’을 뜻합니다. 목표에 이미 도착했다면 그대로 성공하고, 아니라면 정상 경로를 따라가며, 그것도 실패하면 복구 행동을 시도하는 식입니다. 조건 노드, 행동 노드, Sequence와 Fallback을 조합하면 ‘문이 열려 있으면 통과하고, 닫혀 있으면 호출하고, 호출도 실패하면 다른 문으로 간다’ 같은 규칙을 눈으로 읽을 수 있는 형태로 만들 수 있습니다.

ROS 2의 대표적인 자율주행 소프트웨어인 Nav2는 행동 트리를 실제 내비게이션 흐름에 사용합니다. 기본 개념은 경로 계산과 경로 추종을 함께 실행하면서 필요할 때 경로를 갱신하는 것입니다. 복도에 상자가 새로 놓이면 로봇은 기존 경로를 그대로 밀어붙이는 대신 현재 지도와 센서 정보를 바탕으로 경로를 다시 계산할 수 있습니다. 행동 트리는 이때 어떤 서버를 어떤 순서로 호출하고, 결과에 따라 어느 가지로 갈지를 정리합니다.
그래도 경로 계산이나 추종이 실패하면 복구 가지로 넘어갑니다. Nav2 문서에는 비용지도 일부 또는 전체를 지우고, 제자리 회전으로 주변을 다시 관찰하고, 잠시 기다리거나 후진한 뒤 재계획하는 흐름이 설명돼 있습니다. 중요한 점은 ‘후진하면 언제나 해결된다’가 아니라 실패 원인별로 적절한 복구를 선택해야 한다는 것입니다. 센서가 가려진 문제와 통로가 실제로 막힌 문제는 같은 행동으로 해결되지 않습니다.

상태 머신보다 읽기 쉽지만 만능은 아닙니다
복잡한 임무는 유한상태기계(FSM)로도 만들 수 있습니다. 그러나 상태가 수십 개로 늘고 상태 사이 전환이 수백 개가 되면 전체 흐름을 읽기 어려워질 수 있습니다. Nav2 문서는 축구 로봇의 걷기·공 찾기·차기 같은 기본 동작을 행동 트리의 재사용 가능한 노드로 설명합니다. 행동 트리는 계층과 재사용에 강하고, 실행 흐름이 트리 안에 모여 있어 검토하기 편하다는 장점이 있습니다.
그렇다고 행동 트리가 항상 더 좋은 것은 아닙니다. 나쁜 트리는 같은 복구를 끝없이 반복하거나, 여러 가지가 공유하는 블랙보드 데이터를 잘못 덮어쓰거나, 실행 중이던 행동을 중단할 때 모터를 안전하게 멈추지 못할 수 있습니다. 큰 트리는 XML 파일만 길어져 오히려 이해하기 어려워지기도 합니다. 상태 머신, 작업 계획기, 학습 정책과 행동 트리는 경쟁 관계라기보다 서로 다른 층에서 함께 쓰이는 도구입니다.
현장에서는 무엇을 확인해야 할까요
또한 행동 트리는 안전 기능과 구분해야 합니다. ‘사람 감지 시 정지’ 조건을 트리에 넣을 수는 있지만, 일반 소프트웨어 조건 하나만으로 안전 인증이 되는 것은 아닙니다. 충돌 감지, 속도·힘 제한, 비상정지, 안전 PLC처럼 독립적으로 검증된 안전 계층이 필요합니다. 트리가 멈추거나 통신이 끊겼을 때 로봇이 어떤 상태로 가는지도 별도로 시험해야 합니다.
현장에서는 트리 그림이 예쁜지보다 실패가 어떻게 처리되는지를 봐야 합니다. 각 노드의 성공·실패 조건이 측정 가능하게 정의됐는지, 실행 중 노드를 취소했을 때 안전하게 정리되는지, 복구 횟수와 시간 제한이 있는지, 같은 실패가 반복되면 사람에게 넘기는지 확인해야 합니다. 행동 트리의 가치는 로봇에게 마법 같은 지능을 주는 데 있지 않습니다. 복잡한 판단을 사람이 읽고 시험하고 고칠 수 있는 구조로 바꾸는 데 있습니다.
확인한 원문
- BehaviorTree.CPP 4.8: Introduction to Behavior Trees
- BehaviorTree.CPP 4.8: Main Concepts
- Nav2: Behavior Trees
- Nav2: Detailed Behavior Tree Walkthrough
- Colledanchise & Ögren: Behavior Trees in Robotics and AI (v6, 2022)
함께 보면 좋은 글
글쓴이

Sean Woo — 15년 이상 로보틱스 기술·사업 방향성 수립 업무를 해왔습니다. 공개된 기술문서·논문·기업 발표를 바탕으로 로봇과 AI의 변화를 이해하기 쉽게 분석합니다. 이 매체의 해석은 특정 회사나 기관의 공식 입장을 대변하지 않습니다.