FSMs有什麼問題?對反應性和模塊化的需求
-
模塊化(一個系統的組件可以被劃分成不同的模塊,並重新組合成的能力):如果刪除了一個組件,則需要修改到該組件的每個轉換
-
反應性(對變化做出快速有效反應的能力):組件之間需要進行許多轉換,而許多轉換意味着許多單向控制傳輸
行爲樹的運行
-
BT是一種有向根樹,其中內部節點稱爲控制流節點,葉節點稱爲執行節點。對於每個連接節點,我們使用父節點和子節點的通用術語。根是沒有父節點的節點;所有其他節點都有一個父節點。控制流節點至少有一個子節點。
-
BT從根節點開始執行,根節點生成一個有一定頻率的允許節點執行的信號,這個信號可以稱爲滴嗒,該信號被髮送給它的子節點。當且僅當節點接收到信號時才執行節點。如果正在執行,則子進程立即返回到父進程,如果已經達到目標,則返回成功,否則返回失敗。
-
經典行爲樹框架:四類控制節點(Sequence、Selector、Parallel和Decorator)和兩類執行節點(Action和Condition)。
-
序列節點執行算法,將信號從左邊傳到它的子節點,直到它找到一個返回Failure或Running的子節點,然後它返回Failure或Running到它自己的父節點。當且僅當它的所有子元素都返回成功時,它才返回成功。注意,當一個子節點返回Running或Failure時,序列節點不會將信號傳到下一個子節點(如果有的話)。
for i←1 to N do
childStatus ← Tick(child(i))
if childStatus = Running then
return Running
else if childStatus = Failure then
return Failure
return Success
- 回退節點執行算法,將信號從左邊路由到它的子節點,直到它找到一個返回成功或正在運行的子節點,然後它返回Success或Running到它自己的父節點。當且僅當它的所有子元素都返回Failure時,它才返回Failure。注意,當一個子節點返回Running或Success時,回退節點不會將信號路傳到下一個子節點(如果有的話)。
for i←1 to N do
childStatus ← Tick(child(i))
if childStatus = Running then
return Running
else if childStatus = Success then
return Success
return Failure
- 並行節點執行算法,將信號傳給所有子節點;它返回Success如果M個子節點返回Success;它將返回Failure如果N−M + 1個子節點返回Failure;否則返回Running。其中N是子節點數量,M≤N是一個用戶定義的閾值。
for i←1 to N do
childStatus(i) ← Tick(child(i))
if Σi:childStatus(i)=Success1 ≥ M then
return Success
else if Σi:childStatus(i)=Failure1 > N − M then
return Failure
return Running
-
行爲節點當接收到信號時,執行一個命令。如果執行正確完成,則返回Success;如果執行失敗,則返回Failure。當行爲正在進行時,它返回Running。
-
條件節點當接收到信號時,檢查命題。根據條件的成立與否返回成功或失敗。注意,條件節點從不返回Running。
-
裝飾節點是一個控制流節點,有一個單獨的子節點。該節點根據用戶定義的規則操作子節點的返回狀態,並根據一些預定義的規則有選擇地標記子節點。
-
舉例說明:球的抓取行爲樹
-
具有內存的節點,爲了避免不必要的某些節點的重新執行。帶有內存的控制流節點始終記住子節點是否返回了Success或Failure,避免子節點的重新執行,直到整個序列節點或回退節點以Success或Failure告終。當父節點返回成功或失敗時,內存將被清除,以便在下一次激活時考慮所有的子節點。
-
舉例說明:機器人抓取綠色木塊放到制定地點