rt-net / KXR_HAC_Software

1 stars 0 forks source link

行動決定のリファクタリング #13

Closed anhquan18 closed 4 months ago

anhquan18 commented 1 year ago

歩行制御のリファクタリングも終わりそうですので、行動決定のリファクタリングについて話し合いたいと思います。

行動決定の部分は現段階、自分の理解が正しければ実装されてないですね。したがって、リファクタリングと同時に行動決定のアルゴリズムを実装します。確かにのりさんはBehavior Treeを実装して欲しかったため、HTN Planner[^1]というBehavior Treeを実装したいと思います。

詳しい内容(解説と実装し方)は直接会って話し合いたいと思います。

[^1]: CIT Brainsの参考資料と同じようなものを実装する予定です。

TaikiTsuno commented 1 year ago

Behavior Treeについて承知しました。 HTN Plannerについて学習するとともに、それぞれの行動パターン(左手法で進む、ボールに近づく、等)の実装を進めます。

anhquan18 commented 1 year ago

@TaikiTsuno 歩行制御のリファクタリングが終了したら、6月22日のミーティングで話したHTN Plannerのタスク図をここにアップロードしてください。手書きでも、前回話したtree図の形式でも構いません。

TaikiTsuno commented 1 year ago

@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
TaikiTsuno commented 1 year ago

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: カメラ画角内にボールが見つかった状態

anhquan18 commented 1 year ago

分かりました。まずは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

個人的にはGetFieldFeaturesLookForBallはPrimitiveタスクではなく、Preconditionのフィールドのエッジの近くにいるT/Fカメラ視野内にボールが写っている T/FというWorldStateの状態を更新するための関数にした方が使い勝手がいいかと思います。

もう一つ気になることがありますが、SearchBallTurnAwayFromFieldEdgeSideStepAwayFromFieldEdgeWalkForwardLookForBallとどのような関係性になるですか?

TaikiTsuno commented 1 year ago

GetFieldFeaturesLookForBallを関数にすること承知しました。これらが関数になった場合、その実行タイミングはどのように規定されますか?各PrimitiveTaskの終了時の実行になるのでしょうか。

SearchBallStayInsideFieldのことです。名前の変更が反映されていませんでした、すみません。 つまり、タスクの内容としては

StayInsideField Precondition: ボールを見つけていない Action: ボールが見つかるまでフィールドエッジに沿って前進 Effect: ボールが見つかった状態

anhquan18 commented 1 year ago

SearchBallについて承知しました。

GetFieldFeaturesGetFieldFeaturesはWorld Stateの更新の中で実行され、以下の流れを想定し実装する予定です。

ロボットの動きの流れ

  1. センサーデータ取得
  2. World Stateの更新(センサーデータで各変数のT/Fを更新)
  3. HTN Plannerのプランニング
  4. プランの実行
    • 各Primitive Taskの実行(それぞれのPrimitive Taskのループの中で関数を実行)
    • 現在のプランが周りの環境に対し、適切であるかどうかの確認(World Stateの更新)
  5. プランの実行終了・プランが無効でステップ1に戻る
anhquan18 commented 1 year ago

HAC GOALGoFindBallはこれで大丈夫と思います。上記の図に沿ってHTN Plannerのフレームの部分を実装し、終わった後津野さんに各PrimitiveTaskの関数というかClassの内容・WorldStateの変数のT/Fの更新関数を作成してもらる予定です。何か気になる事はありますか?

TaikiTsuno commented 1 year ago

ありがとうございます。ロボットの動きの流れについて承知しました。 現在は気になる点はありませんが、本日8/4の開発中に疑問点など生じたらまた質問させていただきます。

TaikiTsuno commented 1 year ago

ご指摘いただいた点をもとに修正した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
anhquan18 commented 1 year ago

@TaikiTsuno #15 を完成させた後に、リファクタリングしたいですが、完成するまでに残っているタスクはありますか?

anhquan18 commented 4 months ago

22 で解決しました。