ActionSelection

役割

ActionSelection は input port plan に書かれた文字列を parse し、子 node を指定順に tick する control node です。各 step の前に blackboard 値を設定できます。

Interface

種別

名前

型 / 内容

input port

plan

; 区切りの実行 plan

children

任意の BT child node

plan の node 名に一致するものを tick

Plan grammar

plan は step の列です。

\[P=[s_0,s_1,\dots,s_{N-1}]\]

文字列では ; で区切ります。

node_a:key=value,key=value; node_b; node_c:x=1

各 step は、

\[s_k=(n_k,\{(key,value)\})\]

です。: より左が node 名、右が blackboard に書く key/value 集合です。

型変換

値文字列 \(v\) は次の順で型変換されます。

\[v\in\{\mathrm{true},\mathrm{false}\}\Rightarrow bool\]

bool key は数値でも bool に寄せます。

\[key\in K_b=\{\mathrm{wtt\_back},\mathrm{wtt\_front},\mathrm{expand}\} \Rightarrow value=(v\ne0)\]

double key は double です。

\[key\in K_d=\{\mathrm{climb\_vel},\mathrm{time},\mathrm{vx},\mathrm{vy},\mathrm{vtheta}\} \Rightarrow value\in\mathbb{R}\]

それ以外の数値は、整数に十分近ければ int、そうでなければ double です。

\[|v-\operatorname{round}(v)|<10^{-6}\Rightarrow int\]

Tick algorithm

現在の plan index を \(k\) とします。初回 tick で plan を parse し、\(k=0\) にします。step \(s_k\) の set 値は、子 node を tick する前に blackboard へ書きます。

\[B[key]\leftarrow value\]

子 node は、名前または登録名が一致するものを探します。

\[c_k=\operatorname{findChild}(n_k)\]

見つからない場合は FAILURE です。

子 node の tick 結果を \(r_k\) とすると、返り値は次です。

\[r_k=\mathrm{RUNNING}\Rightarrow\mathrm{RUNNING}\]
\[r_k=\mathrm{FAILURE}\Rightarrow\mathrm{FAILURE}\]
\[r_k=\mathrm{SUCCESS}\Rightarrow k\leftarrow k+1\]

全 step が成功したら、

\[k=N\Rightarrow\mathrm{SUCCESS}\]

です。halt された場合は全 child を halt し、\(k=0\) に戻します。

設定ファイル

この node は example/sample/config/tree/main.xmlControl ID="ActionSelection" として使えます。sample の MainTree では現在使っていませんが、TreeNodesModel には登録されています。

<Control ID="ActionSelection">
    <input_port name="plan"/>
</Control>

XML で使う場合は、children と plan の node 名を一致させます。

<ActionSelection plan="FollowPath:path_index=0; FollowPath:path_index=1">
    <Action ID="FollowPath" path_index="{path_index}"/>
</ActionSelection>

plan の各 step は次の形です。

node_name:key=value,key=value

key=value は tick 前に blackboard へ入ります。

\[B[key]\leftarrow value\]

ActionSelection は child の name() または registrationName()node_name を比較します。XML で同じ登録名の child を複数置く場合は、必要に応じて name 属性で一意名を付け、その名前を plan 側に書きます。