Closed anhquan18 closed 4 months ago
Behavior Treeについて承知しました。 HTN Plannerについて学習するとともに、それぞれの行動パターン(左手法で進む、ボールに近づく、等)の実装を進めます。
@TaikiTsuno 歩行制御のリファクタリングが終了したら、6月22日のミーティングで話したHTN Plannerのタスク図をここにアップロードしてください。手書きでも、前回話したtree
図の形式でも構いません。
@anhquan18 CIT brainsホームページと同じ形式で書き起こしました。 タスクをどの程度まで細分化するかなど、まだ詰め切れていない部分が多いですが一旦確認をお願いできればと思います。
World Stateは、 1.画角内のボールの有無 2.ボールに触ったか 3.ゴールに入ったか を想定しています。
%%{ init: { 'flowchart': { 'curve': 'stepAfter' } } }%%
flowchart TD
classDef CompositeTask fill:#00ff7f
classDef Method fill:#00bfff
classDef PrimitiveTask fill:#ff1493
HACGoal:::CompositeTask --- GoFindBall:::Method
HACGoal --- GoTouchBall:::Method
HACGoal --- GoToGoalLine:::Method
GoFindBall --- GetFieldFeatures1[GetFieldFeatures]:::PrimitiveTask
GetFieldFeatures1[GetFieldFeatures] --- StayInsideField1[StayInsideField]:::CompositeTask
StayInsideField1[StayInsideField] --- StayAwayFromFieldEdge1[StayAwayFromFieldEdge]:::Method
StayAwayFromFieldEdge1[StayAwayFromFieldEdge] --- TurnAwayFromFieldEdge1[TurnAwayFromFieldEdge]:::PrimitiveTask
TurnAwayFromFieldEdge1[TurnAwayFromFieldEdge] --- SideStepAwayFromFieldEdge1[SideStepAwayFromFieldEdge]:::PrimitiveTask
StayInsideField1[StayInsideField]
--- WalkForward1[WalkForward]:::PrimitiveTask
--- LookForBall:::PrimitiveTask
GoTouchBall
--- GetBallCoordinate:::PrimitiveTask
--- FaceBall:::PrimitiveTask
FaceBall --- ApproachBall:::PrimitiveTask
ApproachBall --- TouchBall:::CompositeTask
TouchBall --- ExtendArmForward:::PrimitiveTask
TouchBall --- CheckBallPositionChange:::PrimitiveTask
GoToGoalLine
--- RightToGoal:::PrimitiveTask
--- GetFieldFeatures2[GetFieldFeatures]:::PrimitiveTask
--- SearchGoal:::CompositeTask
--- StayInsideField2[StayInsideField]:::CompositeTask
StayInsideField2[StayInsideField] --- StayAwayFromFieldEdge2[StayAwayFromFieldEdge]:::Method
StayInsideField2[StayInsideField] --- WalkForward2[WalkForward]:::PrimitiveTask
StayAwayFromFieldEdge2[StayAwayFromFieldEdge] --- TurnAwayFromFieldEdge2[TurnAwayFromFieldEdge]:::PrimitiveTask
TurnAwayFromFieldEdge2[TurnAwayFromFieldEdge] --- SideStepAwayFromFieldEdge2[SideStepAwayFromFieldEdge]:::PrimitiveTask
SearchGoal --- CrossGoalLine:::PrimitiveTask
GoFindBall
メソッドの中の各タスクについて、STRIPSの三要素は次のように定義しています。
考え方が問題ないか、合わせてご確認お願いします。
GetFieldFeatures
Precondition: フィールドの中におり、ボール/ゴールを見つけていない
Action: カメラ画角内のフィールドエッジの位置、角度を取得
Effect: 自分とフィールドエッジの位置関係を把握した状態
SearchBall
Precondition: ボールを見つけていない
Action: ボールが見つかるまでフィールドエッジに沿って前進
Effect: ボールが見つかった状態
TurnAwayFromFieldEdge
Precondition: フィールドエッジに機体が向いている
Action: フィールドエッジと平行になる角度旋回
Effect: フィールドエッジと機体側面が平行の状態
SideStepAwayFromFieldEdge
Precondition: フィールドエッジと機体が近接している
Action: フィールドエッジとの適切な距離まで横に歩く
Effect: 機体がフィールドエッジから十分離れて安全な状態
WalkForward
Precondition: 機体がフィールドエッジから十分離れて安全な状態
Action: 落下の危険がある位置にフィールドエッジが検出されるまで前進
Effect: フィールドエッジに近づいた状態
LookForBall
Precondition: ボールが見つかっていない状態
Action: カメラ画角内でボールを探索
Effect: カメラ画角内にボールが見つかった状態
分かりました。まずはGoFindBall
から話しましょう。上記の図はStayInsideField
でちょっとわかりにくいため、タスクの順番は上下ではなく、左右に直したいと思います。
%%{ init: { 'flowchart': { 'curve': 'stepAfter' } } }%%
flowchart TD
classDef CompositeTask fill:#00ff7f
classDef Method fill:#00bfff
classDef PrimitiveTask fill:#ff1493
HACGoal:::CompositeTask --- GoFindBall:::Method
GoFindBall --- GetFieldFeatures1[GetFieldFeatures]:::PrimitiveTask
GoFindBall --- StayInsideField1[StayInsideField]:::CompositeTask
StayInsideField1 --- StayAwayFromFieldEdge1[StayAwayFromFieldEdge]:::Method
StayAwayFromFieldEdge1 --- TurnAwayFromFieldEdge1[TurnAwayFromFieldEdge]:::PrimitiveTask
StayAwayFromFieldEdge1 --- SideStepAwayFromFieldEdge1[SideStepAwayFromFieldEdge]:::PrimitiveTask
GoFindBall --- WalkForward1[WalkForward]:::PrimitiveTask
GoFindBall --- LookForBall:::PrimitiveTask
個人的にはGetFieldFeatures
とLookForBall
はPrimitiveタスクではなく、Preconditionのフィールドのエッジの近くにいるT/F
とカメラ視野内にボールが写っている T/F
というWorldStateの状態を更新するための関数にした方が使い勝手がいいかと思います。
もう一つ気になることがありますが、SearchBall
はTurnAwayFromFieldEdge
・SideStepAwayFromFieldEdge
・WalkForward
・LookForBall
とどのような関係性になるですか?
GetFieldFeatures
とLookForBall
を関数にすること承知しました。これらが関数になった場合、その実行タイミングはどのように規定されますか?各PrimitiveTaskの終了時の実行になるのでしょうか。
SearchBall
はStayInsideField
のことです。名前の変更が反映されていませんでした、すみません。
つまり、タスクの内容としては
StayInsideField
Precondition: ボールを見つけていない
Action: ボールが見つかるまでフィールドエッジに沿って前進
Effect: ボールが見つかった状態
SearchBall
について承知しました。
GetFieldFeatures
とGetFieldFeatures
はWorld Stateの更新の中で実行され、以下の流れを想定し実装する予定です。
HAC GOAL
のGoFindBall
はこれで大丈夫と思います。上記の図に沿ってHTN Plannerのフレームの部分を実装し、終わった後津野さんに各PrimitiveTaskの関数というかClassの内容・WorldStateの変数のT/Fの更新関数を作成してもらる予定です。何か気になる事はありますか?
ありがとうございます。ロボットの動きの流れについて承知しました。 現在は気になる点はありませんが、本日8/4の開発中に疑問点など生じたらまた質問させていただきます。
ご指摘いただいた点をもとに修正したGoFIndBall
のツリーです。
GetFieldFeatures、LookforBallはprimitivetaskからは除外しました。
これに関するworld stateには
know_ball_pos T/F
near_edge T/F
facing_edge T/F
の3つを考えています(primitivetaskが3つなので)。
適切なworld stateの設定法などご教授いただければ幸いです。
%%{ init: { 'flowchart': { 'curve': 'stepAfter' } } }%%
flowchart TD
classDef CompositeTask fill:#00ff7f
classDef Method fill:#00bfff
classDef PrimitiveTask fill:#ff1493
HACGoal:::CompositeTask --- GoFindBall:::Method
GoFindBall --- StayInsideField1[StayInsideField]:::CompositeTask
StayInsideField1[StayInsideField] --- StayAwayFromFieldEdge1[StayAwayFromFieldEdge]:::Method
StayAwayFromFieldEdge1[StayAwayFromFieldEdge] --- TurnAwayFromFieldEdge1[TurnAwayFromFieldEdge]:::PrimitiveTask
StayAwayFromFieldEdge1[StayAwayFromFieldEdge]--- SideStepAwayFromFieldEdge1[SideStepAwayFromFieldEdge]:::PrimitiveTask
GoFindBall --- WalkForward1[WalkForward]:::PrimitiveTask
@TaikiTsuno #15 を完成させた後に、リファクタリングしたいですが、完成するまでに残っているタスクはありますか?
歩行制御のリファクタリングも終わりそうですので、行動決定のリファクタリングについて話し合いたいと思います。
行動決定の部分は現段階、自分の理解が正しければ実装されてないですね。したがって、リファクタリングと同時に行動決定のアルゴリズムを実装します。確かにのりさんはBehavior Treeを実装して欲しかったため、HTN Planner[^1]というBehavior Treeを実装したいと思います。
詳しい内容(解説と実装し方)は直接会って話し合いたいと思います。
[^1]: CIT Brainsの参考資料と同じようなものを実装する予定です。