본문으로 건너뛰기

M18.04 · Behavior Tree·Action·Waypoint·작업 상태

단위별 목표·권장 선수와 자료 준비 상태를 확인하고, 공개된 본문과 활동을 읽고 준비 상태를 확인할 수 있습니다.

전체 커리큘럼

학습 안내

본문을 읽고 장비 없는 기본 실습·세 확인 문제와 해설로 이해를 확인하세요.

예상 학습 시간: 미정. 이 페이지 방문이나 자료 열람으로 완료·숙달을 자동 부여하지 않습니다.

현재 경로·이전·다음 단위 확인 ↓

학습 목표

  • BT의 tick·Sequence/Fallback과 Action의 비동기 상태를 구분한다.
  • 합성 목표·피드백·취소·waypoint 기록에서 과업 상태와 완료 분모를 계산한다.
  • 전제 재확인·중단·재시도와 waypoint 작업의 실제 성과에 필요한 근거를 설계한다.

아래 설명·실습·문제로 각 학습 목표를 확인하세요.

권장 선수

M05의 Action과 M18의 서버·복구를 연결한다. BT 실행 상태, leaf, blackboard, waypoint 작업과 목표 ID를 본문에서 보충한다. 기본은 완전한 합성 사건표이며 실제 BT·Action·ROS·장비 실행은 없다. 이미 알고 있다면 직접 열어볼 수 있습니다.

설명 필수

세 목표에 대응하는 검수된 설명·예제를 읽습니다.

나무 모양보다 상태가 전파되는 규칙을 읽는다

Behavior Tree는 조건과 행동의 실행 순서·분기를 구성하는 방법이다. leaf는 실제 조건 확인이나 행동 요청을 맡는 끝 노드이며, 제어 노드는 여러 자식의 결과를 조합한다. tick은 트리가 현재 상태를 확인하고 다음 처리를 진행하도록 호출하는 한 번의 실행 요청이다. 일반적인 실행 결과 SUCCESS, FAILURE, RUNNING은 각각 해당 노드의 조건 통과·실패·진행 중을 나타낸다. 시작 전 IDLE이나 버전·노드별 다른 상태도 있으므로 세 단어가 모든 상태의 목록이라는 뜻은 아니다.

Sequence는 순서대로 자식을 확인해 성공한 다음 자식으로 진행하고, 진행 중이면 전체도 RUNNING, 실패하면 전체도 FAILURE를 반환하는 구조다. 모두 성공하면 SUCCESS다. Fallback은 실패한 후보 다음의 대안을 확인하며 성공 또는 진행 중인 후보를 만나면 그 결과를 반환한다. 모두 실패하면 FAILURE다. 이것은 프로그램의 단순 if문과 비슷한 역할도 하지만 오래 걸리는 행동의 상태를 여러 tick에 걸쳐 관리한다는 차이가 있다.

이 개념 설명은 BehaviorTree.CPP 4.5.2 Sequence와 Fallback 공개 구현을 대조했다. 해당 버전을 현재 Jazzy 환경에 설치하거나 실행한 것은 아니다. 동기 Sequence, ReactiveSequence 등은 자식을 다시 확인하는 규칙이 다르므로 이름을 생략하고 모든 트리가 똑같이 전제를 감시한다고 말하지 않는다.

앞서 통과한 조건이 계속 감시되는지는 별도 계약이다

교육용 Sequence를 Ready→Navigate→VerifyTask로 정하자. Ready는 센서·TF·과업의 준비 조건, Navigate는 주행 Action을 요청하는 leaf, VerifyTask는 작업 결과를 확인하는 leaf다. 이름은 설명용이며 그대로 로딩되는 Nav2 plugin 목록이 아니다. 이 예의 Sequence는 Navigate가 RUNNING이면 다음 tick에도 그 자식부터 이어 간다. 먼저 통과한 Ready를 매번 다시 확인하는 구조는 아니다.

BT와 Action의 서로 다른 상태: Behavior Tree → Action 목표 → 미션 상태 → 실제 세계.그림 원본 크기로 보기

그림 M18.04-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.

Navigate가 진행 중인 동안 센서가 끊겨도 이 순서만으로 Ready의 실패가 다시 평가된다고 볼 수 없다. 필요한 지속 감시는 별도 감시 계층이나 적절한 reactive 제어 노드와 취소·halt 처리로 구성해야 한다. halt는 트리 노드의 실행 중단 요청이지 곧바로 모터가 정지했다는 관측은 아니다. 실행 중인 Action의 취소와 실제 적용 상태를 연결해야 한다.

blackboard는 목표·경로·오류 같은 데이터를 트리 노드들이 공유하는 저장 공간이다. 값이 있다는 사실만으로 최신이거나 현재 목표의 결과인 것은 아니다. 목표 ID와 버전, frame·시각 및 자료 출처를 함께 관리한다. 지난 목표의 SUCCESS나 이미 바뀐 경로를 새 과업의 결과로 재사용하지 않는다. Jazzy BT Navigator의 트리 선택과 과업 인터페이스도 이런 실행 맥락 안에서 해석한다.

BT 결과와 Action 상태를 명시적으로 연결한다

ROS 2 Action 설계는 목표 수락, 실행, 취소 중과 최종 성공·중단·취소를 구분한다. goal ID는 어느 요청의 사건인지 구별하는 식별자다. 피드백은 진행 정보이며 최종 결과가 아니다. 현재 목표까지 거리가 작다는 피드백을 받았다고 terminal SUCCEEDED를 받은 것으로 채우지 않는다. 서버가 광고됐다는 사실도 현재 goal을 수락했다는 뜻이 아니다.

본문의 교육용 Navigate adapter 정책은 ACCEPTED/EXECUTING/CANCELING에서 RUNNING을 반환하고, 같은 goal ID의 terminal SUCCEEDED는 SUCCESS, ABORTED 또는 CANCELED는 FAILURE로 반환한다고 정한다. 이는 모든 Nav2 leaf의 내부 구현이 반드시 같다는 주장이 아니다. 또한 상위 mission 기록에는 취소와 오류를 별도로 남긴다. BT의 FAILURE 하나로 사용자의 중단 의도와 시스템 결함이 같아지는 것은 아니다.

합성 goal g7의 사건을 보자. tick 0에서 Ready가 SUCCESS이고 Navigate가 요청을 보내 수락 뒤 EXECUTING이다. Sequence는 RUNNING이고 VerifyTask는 아직 호출하지 않는다. tick 1에서 distance_to_goal=0.1 m 피드백이 왔지만 최종 결과는 없으므로 그대로 RUNNING이다. 이 leaf는 피드백 숫자만으로 도착을 새로 판정하지 않는다는 정책이다.

tick 2에서 취소 요청이 수락되어 CANCELING이 됐다. 아직 최종 취소 완료가 아니므로 leaf와 Sequence는 RUNNING이다. tick 3에서 같은 g7의 terminal CANCELED가 도착하면 leaf와 Sequence는 FAILURE이고 VerifyTask는 호출하지 않는다. mission 기록은 CANCELED로 남긴다. 별도 cancel_latch를 유지해 상위 재시도 분기가 같은 목표를 다시 요청하지 못하도록 한다. 이 latch는 본문이 정한 과업 정책이며 ROS가 모든 BT에 자동 제공하는 기능이라고 쓰지 않는다.

취소 결과가 네트워크 문제로 아직 없으면 취소 요청·수락과 결과 미상을 기록한다. 결과를 임의로 SUCCESS나 CANCELED로 만들지 않는다. 취소가 끝나도 실제 정지·잔여 명령·구동 상태는 필요한 관측으로 확인한다. 새 목표를 시작할 때에는 현재 상태·지도·자료와 목표 버전을 재확인하고 이전 목표의 결과와 섞지 않는다.

Waypoint 도착과 그곳에서의 작업을 구분한다

waypoint는 순서대로 방문할 목표 pose다. Jazzy FollowWaypoints 정의는 PoseStamped 배열, 시작 인덱스와 반복 관련 입력, 현재 waypoint 피드백 및 missed_waypoints 결과를 구분한다. 다른 버전의 필드 모양을 복사하지 않고 사용하는 분기의 실제 정의를 확인한다. 피드백의 현재 인덱스는 그 waypoint의 작업 성공률이 아니다.

Jazzy Waypoint Follower는 위치 도착 뒤 task executor plugin으로 작업을 수행할 수 있다. 사진을 찍거나 물건을 확인하는 과업은 pose 도착과 다른 결과다. plugin이 요청을 보냈는지, 작업 결과를 검증했는지 및 실패·미상을 어떤 방식으로 반환하는지 정해야 한다. 존재하지 않는 관측을 작업 성공으로 만들지 않는다.

한 번 처리하는 목록의 인덱스를 0,1,2로 주자. 0은 navigation 성공과 task 성공, 1은 navigation 성공이나 task 실패, 2는 navigation 실패로 task를 수행하지 않았다. stop_on_failure=false라는 입력에서 다음 waypoint로 계속 진행한 로그다. navigation 성공은 2/3이지만 두 단계가 모두 성공한 waypoint는 0 하나라 1/3이다. 2의 task 미수행을 별도의 task 성공으로 세거나 분모에서 지우지 않는다.

Jazzy 실제 처리 코드는 실패를 missed_waypoints에 담고, 계속 처리하는 설정에서는 목록을 끝냈을 때 성공 terminal을 반환할 수 있다. 따라서 바깥 Action의 SUCCEEDED만으로 모든 waypoint 작업이 성공했다고 읽으면 안 된다. 해당 결과의 missed 목록과 오류·작업 기록을 함께 해석한다. 본문 입력의 missed 인덱스는 1과 2이며 전체 필수 작업 완료는 아니다.

재시도와 중단을 과업의 의미에 맞춘다

모든 FAILURE를 Fallback의 '다시 Navigate'로 연결하면 취소된 명령까지 재실행할 수 있다. 사용자의 중단, TF 오류, 도착 실패와 사진 저장 실패는 같은 대안이 아니다. 실패 종류·재시도 횟수·현재 준비 조건·작업 ID를 확인해 분기하고 종료 이유와 남은 작업을 기록한다. task executor의 성공도 실제 증거와 연결되어야 한다.

다시 실행하면 중복 효과가 있는 작업은 특히 작업 ID와 이미 완료한 항목을 확인한다. 같은 사진 요청의 재처리와 물체를 한 번 더 놓는 행동은 결과가 다를 수 있다. 과업의 idempotency는 같은 요청을 반복해도 추가 효과가 생기지 않는 성질이며 모든 물리 동작이 이를 갖는다고 가정하지 않는다. 복구 후에는 어떤 단계부터 재개할지와 새 관측·현재 pose를 명시한다.

기존 1.4 ROS 2 Jazzy 통신 모델과 6.4 안전 배포 감독기를 연결해 통신·감독과 과업 결과를 나누자. 아래 활동은 사건표를 읽는 연습이며 실제 BT와 waypoint 실행·실물 작업의 성공을 증명하지 않는다.

학습 범위와 한계

기본 설명·예제가 준비되었습니다. 기존 보충 자료의 범위와 구별하세요.

실습 필수

장비 없는 실습을 수행하고 관찰·계산 근거를 해설과 비교합니다.

입력은 Ready→Navigate→VerifyTask의 본문 Sequence와 명시한 adapter·cancel_latch 정책이다. g7의 tick 0~3 사건과 3개 waypoint의 navigation/task 결과도 본문과 같다. 이외의 결과나 재시도는 없고 waypoint 목록은 한 번 처리한 것으로 준다.

  1. Sequence/Fallback의 자식 상태 전파와 Action 상태를 구분한다. Ready를 지속 감시하는지와 VerifyTask가 언제 호출되는지 적는다.
  2. g7의 tick별 leaf·Sequence·mission 상태를 표로 쓰고 세 waypoint의 navigation·전체 작업 성공 분모와 missed 인덱스를 계산한다.
  3. 취소와 task 실패를 다른 재시도 분기로 처리하고, 중복 작업 방지와 현재 준비·실제 정지·재개에 필요한 근거를 제안한다.

관찰은 상태 규칙, 사건과 분모, 중단·재개의 근거로 나눈다. 막히면 피드백·수락·terminal 결과를 서로 다른 칸에 쓴다. 실제 XML·ROS 실행은 필요하지 않다.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

기본 실습은 장비 없이 수행합니다. 실제 장비·GPU 실증을 완료했다는 뜻은 아닙니다.

평가·해설 필수

목표별 세 서술문항에 답하고 해설·판정 기준으로 자기검토합니다.

확인 문제 Q1

Ready가 한 번 성공하고 Navigate가 RUNNING인 본문 Sequence에서 센서가 끊겼다. 다음 tick에 Ready도 반드시 다시 검사하는가? 취소 수락은 Navigate의 최종 성공인가?

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q2

3개 waypoint 중 navigation은 모두 성공했지만 task는 0과 2만 성공했고 1은 실패했다. stop_on_failure=false로 끝까지 처리했고 바깥 Action은 SUCCEEDED다. navigation 및 전체 작업 성공률과 필요한 상세 결과를 보고하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q3

terminal CANCELED를 BT FAILURE로 받았으니 Fallback에서 같은 goal을 즉시 재요청하겠다고 한다. 중단·작업 중복·현재 상태와 재개 근거로 평가하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

학습 범위와 한계

서술답안과 해설이 준비되었습니다. 자기검토와 학습 완료는 숙달 인증과 별개입니다.

참고 자료

학습 확인

실습과 세 문항의 답안을 해설과 비교한 뒤, 이 단위의 학습 완료를 직접 기록할 수 있습니다. 자기검토·학습 완료는 자동 채점이나 숙달 인증과 별개입니다.

실습1개·확인 문제3개의 답안을 저장하고 각각 자기검토를 기록하세요.

학습 이동

학습 단계 순서 · 공통 과정 이후 전문화 선택

전체 목차로 돌아가기 →

신규 활동의 답안은 이 브라우저의 통합 학습 기록에 저장합니다. 기존 화면의 답안·진도는 원래 키를 유지합니다. AI 강사는 현재 단위의 준비 상태·부족한 범위와 연결된 실제 자료를 참고합니다.