Thunderbots Project
Loading...
Searching...
No Matches
ball_placement_play_fsm.h
1#pragma once
2
3#include "proto/parameters.pb.h"
4#include "shared/constants.h"
5#include "software/ai/hl/stp/play/play_fsm.h"
6#include "software/ai/hl/stp/tactic/dribble/dribble_tactic.h"
7#include "software/ai/hl/stp/tactic/move/move_tactic.h"
8#include "software/ai/hl/stp/tactic/pivot_kick/pivot_kick_tactic.h"
9#include "software/ai/passing/eighteen_zone_pitch_division.h"
10
11
12using Zones = std::unordered_set<EighteenZoneId>;
13
15{
16 class StartState;
17 class KickOffWallState;
18 class AlignPlacementState;
19 class PlaceBallState;
20 class WaitState;
21 class RetreatState;
22
24 {
25 };
26
27 DEFINE_PLAY_UPDATE_STRUCT_WITH_CONTROL_AND_COMMON_PARAMS
28
34 explicit BallPlacementPlayFSM(TbotsProto::AiConfig ai_config);
35
42 void kickOffWall(const Update& event);
43
51 void alignPlacement(const Update& event);
52
59 void placeBall(const Update& event);
60
66 void startWait(const Update& event);
67
73 void retreat(const Update& event);
74
82 bool shouldKickOffWall(const Update& event);
83
90 bool alignDone(const Update& event);
91
100 bool kickDone(const Update& event);
101
110 bool ballPlaced(const Update& event);
111
117 bool waitDone(const Update& event);
118
124 bool retreatDone(const Update& event);
125
134 Angle calculateWallKickoffAngle(const Point& ball_pos, const Rectangle& field_lines);
135
142 void setupMoveTactics(const Update& event);
143
144 auto operator()()
145 {
146 using namespace boost::sml;
147
148 DEFINE_SML_STATE(StartState)
149 DEFINE_SML_STATE(KickOffWallState)
150 DEFINE_SML_STATE(AlignPlacementState)
151 DEFINE_SML_STATE(PlaceBallState)
152 DEFINE_SML_STATE(WaitState)
153 DEFINE_SML_STATE(RetreatState)
154 DEFINE_SML_EVENT(Update)
155
156 DEFINE_SML_ACTION(alignPlacement)
157 DEFINE_SML_ACTION(placeBall)
158 DEFINE_SML_ACTION(kickOffWall)
159 DEFINE_SML_ACTION(startWait)
160 DEFINE_SML_ACTION(retreat)
161
162 DEFINE_SML_GUARD(shouldKickOffWall)
163 DEFINE_SML_GUARD(alignDone)
164 DEFINE_SML_GUARD(kickDone)
165 DEFINE_SML_GUARD(ballPlaced)
166 DEFINE_SML_GUARD(waitDone)
167 DEFINE_SML_GUARD(retreatDone)
168
169 return make_transition_table(
170 // src_state + event [guard] / action = dest_state
171 *StartState_S + Update_E[!shouldKickOffWall_G] / alignPlacement_A =
172 AlignPlacementState_S,
173 StartState_S + Update_E[shouldKickOffWall_G] = KickOffWallState_S,
174 KickOffWallState_S + Update_E[!kickDone_G && shouldKickOffWall_G] /
175 kickOffWall_A = KickOffWallState_S,
176 KickOffWallState_S + Update_E[kickDone_G] = KickOffWallState_S,
177 KickOffWallState_S + Update_E[!kickDone_G] = AlignPlacementState_S,
178 AlignPlacementState_S + Update_E[shouldKickOffWall_G] = KickOffWallState_S,
179 AlignPlacementState_S + Update_E[!alignDone_G] / alignPlacement_A =
180 AlignPlacementState_S,
181 AlignPlacementState_S + Update_E[alignDone_G] = PlaceBallState_S,
182 PlaceBallState_S + Update_E[!ballPlaced_G] / placeBall_A = PlaceBallState_S,
183 PlaceBallState_S + Update_E[ballPlaced_G] / startWait_A = WaitState_S,
184 WaitState_S + Update_E[!waitDone_G] = WaitState_S,
185 WaitState_S + Update_E[waitDone_G] = RetreatState_S,
186 RetreatState_S + Update_E[retreatDone_G && ballPlaced_G] = X,
187 RetreatState_S + Update_E[ballPlaced_G] / retreat_A = RetreatState_S);
188 }
189
190 private:
191 TbotsProto::AiConfig ai_config;
192 std::shared_ptr<WallKickoffTactic> pivot_kick_tactic;
193 std::shared_ptr<PlaceBallTactic> place_ball_tactic;
194 std::shared_ptr<MoveTactic> align_placement_tactic;
195 std::shared_ptr<MoveTactic> retreat_tactic;
196 std::vector<std::shared_ptr<PlaceBallMoveTactic>> move_tactics;
197 Point setup_point;
198 Timestamp start_time;
199 constexpr static double const WALL_KICKOFF_VELOCITY_M_PER_S = 3.0;
200 constexpr static double const RETREAT_DISTANCE_METERS = 0.6;
201 constexpr static double const PLACEMENT_DIST_THRESHOLD_METERS = 0.15;
202 constexpr static double const BALL_IS_PLACED_WAIT_S = 3.0;
203};
Definition angle.h:15
Definition point.h:14
Definition rectangle.h:10
Definition timestamp.h:21
Definition ball_placement_play_fsm.h:24
Definition ball_placement_play_fsm.h:15
bool waitDone(const Update &event)
Definition ball_placement_play_fsm.cpp:209
void startWait(const Update &event)
Definition ball_placement_play_fsm.cpp:99
bool kickDone(const Update &event)
Definition ball_placement_play_fsm.cpp:179
Angle calculateWallKickoffAngle(const Point &ball_pos, const Rectangle &field_lines)
Definition ball_placement_play_fsm.cpp:223
bool alignDone(const Update &event)
Definition ball_placement_play_fsm.cpp:164
void kickOffWall(const Update &event)
Definition ball_placement_play_fsm.cpp:13
bool shouldKickOffWall(const Update &event)
Definition ball_placement_play_fsm.cpp:156
void retreat(const Update &event)
Definition ball_placement_play_fsm.cpp:104
void setupMoveTactics(const Update &event)
Definition ball_placement_play_fsm.cpp:274
void placeBall(const Update &event)
Definition ball_placement_play_fsm.cpp:70
bool retreatDone(const Update &event)
Definition ball_placement_play_fsm.cpp:215
bool ballPlaced(const Update &event)
Definition ball_placement_play_fsm.cpp:187
void alignPlacement(const Update &event)
Definition ball_placement_play_fsm.cpp:35