티스토리 뷰

미니멀공대생/Control

Behavior Tree :: Design principles

미니멀공대생 2023. 3. 12. 17:23

이번글에서는 BT의 Design principle에 대해서 알아보자.

사실 디자인 정책 같은 것까지 알아야할 필요가 있나 싶지만, 기본적인 내용은 숙지한 상태에서 Groot 같은 BT를 만들어주는 툴을 사용해보도록 하자. 결국 설계를 하고 들어가냐 아니냐, 혹은 큰 틀을 이해하고 진행하냐가 숙련도의 차이를 만들테니깐.

 

BT의 기본 컨셉

 

  • Root로부터 tick이라는 시그널은 tree를 통해 마지막 leaf 노드까지 전달된다.
  • tick 시그널을 받은 트리 노드는 callback을 실행한다. callback은 SUCCESS, FAILURE, RUNNING을 리턴한다.
  • 트리 노드가 한개 이상의 자식노드가 있다면, tick을 전파할 수 있고 전파 기준은 자식이 얼마나 시그널을 받았는지에 따라 다르다.
  • leaf 노드가 신경써야할 가장 마지막 Command가 된다. 즉, 우리가 신경쓸 시스템과 연동되는 것은 leaf 노드이다. (일반적으로 Action 노드)
  • Sequnce는 가장 간단한 ControlNode를 뜻한다.
    • Root 노드가 먼저 RUNNING 상태가 되면서 그의 자식 노드들을 실행시켜 SUCCESS를 받아오고, 각 자식 노드가 하나씩 SUCCESS되면 그 다음 자식노드로 이동하면서 실행된다.
  • Acition 노드에는 기술적으로 Synchronous와 Asynchronous action이 있고 이는 한 노드가 SUCCESS/FAILURE 했냐 아니면 RUNNING중에 다른 노드를 실행시키냐에 따라 다르다.

명시적 성공 조건(Explicit Success Conditions)를 이용한 Readability (확장성) 향상

Behavior Trees in Robotics and AI

FSM과 BT의 다른점은 BT는 Tree 구조라는 것이다. 이때 트리구조의 가장 중요한 부분은 Success와 Failure을 나타내는 방식에 있다. 트리구조라고 해서 모든 조건과 그에 따른 결과(Success, Failure)가 명확한 것은 아니다. 위 사진처럼, Action node(4각형의 Node) 부분이 명시적이지 않을 경우 문제가 되기 때문에 항상 하나의 조건에 명확하게 Success 와 Failure가 표현될 수 있도록 해야한다.

Behavior Trees in Robotics and AI

명시적인 Success, Failure를 가지지 않은 Action Node들을 FallbackNode(조건이 있는 ? 노드)의 형태로 바꾼 후 명시적인 Success Failure 형태로 수정하면 좋은 BT가 된다.

절대적인 시퀀스(Implicit Sequnces)를 사용하여 반응성(Reactivity) 향상

위에서 보여준 BT의 형태를 Teleo-Reactive 방식을 사용하여 향상시킬 수 있다. Teleo-Reactive에서 가장 중요한 점은 Observation이었다. 즉 주변 환경을 잘 관찰하고 active하게 반응하는 것. BT에서 이를 적용하기 위해서는 goal을 명확하게 하고, 이에 대한 명확한 확인을 할 수 있는 action order를 만들어야 한다. 이를 할 수 있는 방법으로는 goal의 성공여부를 Precondition으로 확인하게 하는 것이다.

실제 Behavior Tree.cpp에서는 precondition을 확인할 수 있는 node를 설정할 수 있도록 해뒀다. 이를 Pre and Post Contions라고 하여 그에 대한 설정 방법들을 설명해둔 내용이 있다.

Behavior Trees in Robotics and AI

Backchaining을 통한 Deliberative한 BT 만들기

BT는 특정 goal을 위해 action들을 수행하는 deliberative한 로봇을 만드는 데 사용될 수 있다.

예를 들어서 건물안에 들어가는 로봇을 만들고 싶다고 치자. 목적을 좀 더 명시적으로 하기 위해서 "집 안에 있어?" 라는 하나의 조건만 확인하는 BT를 만들어보자.

Behavior Trees in Robotics and AI

이를 기준으로 일반적인 PostCondition-PreCondition-Action BT를 만들어보자.

Behavior Trees in Robotics and AI

위 사진은 "집 안에 있어"의 Postcondition을 설정한 형태이다.poscondition을 확인하여 집 안에 있지 않을 경우 그 밑의 condition을 확인하도록 되어 있다. 즉, 처음에 만들었던 goal 조건만 확인하는 Condition Node로 돌아가서 Precondition을 PPA형태의 postcondition을 설정하는 것이 Back chaining이다.

Back chaining에 대한 알고리즘은 아래와 같다.

Behavior Trees in Robotics and AI

이런 형태의 goal-back chaining -ppa/postcondition을 통해 deliberative 한 BT를 만들 수 있게 된다.

Behavior Trees in Robotics and AI

Behavior Trees in Robotics and AI

테크니컬한 부분에서 한가지 알아둬야하는 것은 이런식의 Success Failure의 형태의 결과만 내보내도록 구성 된 BT는 직관성이 조금 떨어질 수 있다는 점이다. 이는 아무리 Backchaining을 한다 한들 동일한 문제인데, BehaviorTree.cpp에서는 이런 직관성을 해소하기 위해 error_code와 result를 저장할 수 있도록 해놨다.

BehaviorTree.cpp

일반적으로 단순히 Sequnce를 통해 Action 노드를 순차적으로 수행하는 것이 아니라, action node의 condition(precondition)에 맞게 실행 되도록 하여 확장성(readability)를 향상 시켰다.

메모리 노드를 통한 비-반응성 BT 만들기

Behavior Trees in Robotics and AI

error code를 이용해서 precondition을 확인하여 action 노드를 수행하고 하지 않고를 설정한 것 처럼, 메모리 노드라는 것을 사용하여 수행했던 노드를 다시 수행하는 것을 막을 수 있다. 로봇이 pick, move, and place를 하는 task를 생각해보자. 주변 환경이 일체 변하지 않는 환경에서는 단순한 pick, move, place 를 하는 action node를 하나의 sequnce로 작성하면 된다. 즉 Pick object 노드가 SUCCESE가 떴다면, Move object를 실행할 때는 Pick object를 다시 확인할 필요는 없는 형태이다. 약간 Synchronous action node 와 비슷한 형태이다.

BehaviorTree.cpp에서는 SequenceWithMemory라는 형태로 적용할 수 있다.

참고자료

https://www.behaviortree.dev/

https://link.springer.com/article/10.1007/s10515-022-00328-y

https://arxiv.org/pdf/1709.00084.pdf

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31