Thunderbots Project
Loading...
Searching...
No Matches
goalie_fsm.h
1#pragma once
2
3#include "proto/parameters.pb.h"
4#include "shared/constants.h"
5#include "software/ai/evaluation/calc_best_shot.h"
6#include "software/ai/hl/stp/tactic/chip/chip_fsm.h"
7#include "software/ai/hl/stp/tactic/pivot_kick/pivot_kick_fsm.h"
8#include "software/ai/hl/stp/tactic/tactic.h"
9#include "software/geom/algorithms/calculate_block_cone.h"
10#include "software/geom/algorithms/closest_point.h"
11#include "software/geom/algorithms/contains.h"
12#include "software/geom/algorithms/convex_angle.h"
13#include "software/geom/algorithms/intersection.h"
14#include "software/geom/line.h"
15
16
18{
19 public:
20 class Panic;
21 class PositionToBlock;
22 class MoveToGoalLine;
23
25 {
26 bool should_move_to_goal_line;
27 };
28
29 DEFINE_TACTIC_UPDATE_STRUCT_WITH_CONTROL_AND_COMMON_PARAMS
30
31 // Distance to chip the ball when trying to yeet it
32 // TODO (#1878): Replace this with a more intelligent chip distance system
33 static constexpr double YEET_CHIP_DISTANCE_METERS = 2.0;
34
41 explicit GoalieFSM(
42 TbotsProto::GoalieTacticConfig goalie_tactic_config,
43 TbotsProto::RobotNavigationObstacleConfig robot_navigation_obstacle_config,
44 TbotsProto::MaxAllowedSpeedMode max_allowed_speed_mode)
45 : goalie_tactic_config(goalie_tactic_config),
46 robot_navigation_obstacle_config(robot_navigation_obstacle_config),
47 max_allowed_speed_mode(max_allowed_speed_mode),
48 robot_radius_expansion_amount(
49 ROBOT_MAX_RADIUS_METERS *
50 robot_navigation_obstacle_config.robot_obstacle_inflation_factor())
51 {
52 }
53
64 const Ball &ball, const Field &field,
65 TbotsProto::GoalieTacticConfig goalie_tactic_config);
66
76 const Ball &ball, const Field &field);
77
83 static Rectangle getNoChipRectangle(const Field &field);
84
94 const World &world, const TbotsProto::GoalieTacticConfig &goalie_tactic_config);
95
103 bool shouldEvacuateCrease(const Update &event);
104
114 bool shouldPanic(const Update &event);
115
116 bool shouldMoveToGoalLine(const Update &event);
117
127 bool shouldPivotChip(const Update &event);
128
138 bool panicDone(const Update &event);
139
145 void panic(const Update &event);
146
153 bool retrieveDone(const Update &event);
154
161 void retrieveFromDeadZone(const Update &event,
162 boost::sml::back::process<DribbleFSM::Update> processEvent);
163
169 void moveToGoalLine(const Update &event);
170
177 void updatePivotKick(const Update &event,
178 boost::sml::back::process<PivotKickFSM::Update> processEvent);
179
186 void positionToBlock(const Update &event);
187
193 bool ballInInflatedDefenseArea(const Update &event);
194
195 auto operator()()
196 {
197 using namespace boost::sml;
198
199 DEFINE_SML_STATE(Panic)
200 DEFINE_SML_STATE(PivotKickFSM)
201 DEFINE_SML_STATE(PositionToBlock)
202 DEFINE_SML_STATE(MoveToGoalLine)
203 DEFINE_SML_STATE(DribbleFSM)
204
205 DEFINE_SML_EVENT(Update)
206
207 DEFINE_SML_GUARD(ballInInflatedDefenseArea)
208 DEFINE_SML_GUARD(panicDone)
209 DEFINE_SML_GUARD(shouldEvacuateCrease)
210 DEFINE_SML_GUARD(shouldPivotChip)
211 DEFINE_SML_GUARD(shouldPanic)
212 DEFINE_SML_GUARD(shouldMoveToGoalLine)
213 DEFINE_SML_GUARD(retrieveDone)
214
215 DEFINE_SML_ACTION(panic)
216 DEFINE_SML_ACTION(positionToBlock)
217 DEFINE_SML_ACTION(moveToGoalLine)
218 DEFINE_SML_SUB_FSM_UPDATE_ACTION(updatePivotKick, PivotKickFSM)
219 DEFINE_SML_SUB_FSM_UPDATE_ACTION(retrieveFromDeadZone, DribbleFSM)
220
221 return make_transition_table(
222 // src_state + event [guard] / action = dest_state
223 *PositionToBlock_S + Update_E[shouldMoveToGoalLine_G] / moveToGoalLine_A =
224 MoveToGoalLine_S,
225 PositionToBlock_S +
226 Update_E[shouldEvacuateCrease_G] / retrieveFromDeadZone_A = DribbleFSM_S,
227 PositionToBlock_S + Update_E[shouldPanic_G] / panic_A = Panic_S,
228 PositionToBlock_S + Update_E[shouldPivotChip_G] / updatePivotKick_A =
229 PivotKickFSM_S,
230 PositionToBlock_S + Update_E / positionToBlock_A,
231 DribbleFSM_S + Update_E[retrieveDone_G] / updatePivotKick_A = PivotKickFSM_S,
232 DribbleFSM_S + Update_E[shouldMoveToGoalLine_G] / moveToGoalLine_A =
233 MoveToGoalLine_S,
234 DribbleFSM_S + Update_E[ballInInflatedDefenseArea_G] / retrieveFromDeadZone_A,
235 DribbleFSM_S + Update_E[!ballInInflatedDefenseArea_G] / positionToBlock_A =
236 PositionToBlock_S,
237 Panic_S + Update_E[shouldMoveToGoalLine_G] / moveToGoalLine_A =
238 MoveToGoalLine_S,
239 Panic_S + Update_E[shouldPivotChip_G] / updatePivotKick_A = PivotKickFSM_S,
240 Panic_S + Update_E[panicDone_G] / positionToBlock_A = PositionToBlock_S,
241 Panic_S + Update_E / panic_A,
242 PivotKickFSM_S + Update_E[shouldMoveToGoalLine_G] / moveToGoalLine_A =
243 MoveToGoalLine_S,
244 PivotKickFSM_S + Update_E[ballInInflatedDefenseArea_G] / updatePivotKick_A,
245 PivotKickFSM_S + Update_E[!ballInInflatedDefenseArea_G] / positionToBlock_A =
246 PositionToBlock_S,
247 MoveToGoalLine_S + Update_E[shouldMoveToGoalLine_G] / moveToGoalLine_A =
248 MoveToGoalLine_S,
249 MoveToGoalLine_S + Update_E[!shouldMoveToGoalLine_G] / positionToBlock_A =
250 PositionToBlock_S,
251 X + Update_E = X);
252 }
253
254 private:
255 static constexpr double BALL_RETRIEVED_THRESHOLD = 0.2;
256 // The goalie tactic config
257 TbotsProto::GoalieTacticConfig goalie_tactic_config;
258 // Configuration values for inflated obstacles
259 TbotsProto::RobotNavigationObstacleConfig robot_navigation_obstacle_config;
260 // The maximum allowed speed mode
261 TbotsProto::MaxAllowedSpeedMode max_allowed_speed_mode;
262 // Expansion factor for inflated obstacles
263 double robot_radius_expansion_amount;
264};
Definition ball.h:11
Definition field.h:36
Definition point.h:14
Definition rectangle.h:10
Definition world.h:23
Definition dribble_fsm.h:14
Definition goalie_fsm.h:25
Definition goalie_fsm.h:18
static Rectangle getNoChipRectangle(const Field &field)
Definition goalie_fsm.cpp:80
bool panicDone(const Update &event)
Definition goalie_fsm.cpp:162
static std::vector< Point > getIntersectionsBetweenBallVelocityAndFullGoalSegment(const Ball &ball, const Field &field)
Definition goalie_fsm.cpp:63
void retrieveFromDeadZone(const Update &event, boost::sml::back::process< DribbleFSM::Update > processEvent)
Definition goalie_fsm.cpp:265
bool ballInInflatedDefenseArea(const Update &event)
Definition goalie_fsm.cpp:233
bool shouldEvacuateCrease(const Update &event)
Definition goalie_fsm.cpp:114
static Point findGoodChipTarget(const World &world, const TbotsProto::GoalieTacticConfig &goalie_tactic_config)
Definition goalie_fsm.cpp:87
void panic(const Update &event)
Definition goalie_fsm.cpp:173
bool shouldPivotChip(const Update &event)
Definition goalie_fsm.cpp:154
static Point getGoaliePositionToBlock(const Ball &ball, const Field &field, TbotsProto::GoalieTacticConfig goalie_tactic_config)
Definition goalie_fsm.cpp:7
void moveToGoalLine(const Update &event)
Definition goalie_fsm.cpp:247
GoalieFSM(TbotsProto::GoalieTacticConfig goalie_tactic_config, TbotsProto::RobotNavigationObstacleConfig robot_navigation_obstacle_config, TbotsProto::MaxAllowedSpeedMode max_allowed_speed_mode)
Definition goalie_fsm.h:41
void positionToBlock(const Update &event)
Definition goalie_fsm.cpp:218
bool shouldPanic(const Update &event)
Definition goalie_fsm.cpp:144
bool retrieveDone(const Update &event)
Definition goalie_fsm.cpp:257
void updatePivotKick(const Update &event, boost::sml::back::process< PivotKickFSM::Update > processEvent)
Definition goalie_fsm.cpp:192
Definition pivot_kick_fsm.h:9