Thunderbots Project
Loading...
Searching...
No Matches
dribble_fsm.h
1#pragma once
2
3#include "proto/parameters.pb.h"
4#include "shared/constants.h"
5#include "software/ai/evaluation/time_to_travel.h"
6#include "software/ai/hl/stp/tactic/move/move_fsm.h"
7#include "software/ai/hl/stp/tactic/tactic.h"
8#include "software/ai/hl/stp/tactic/transition_conditions.h"
9#include "software/geom/algorithms/contains.h"
10#include "software/geom/algorithms/convex_angle.h"
11#include "software/geom/algorithms/distance.h"
12
14{
15 public:
16 class GetPossession;
17 class Dribble;
18 class LoseBall;
19
25 explicit DribbleFSM(TbotsProto::DribbleTacticConfig dribble_tactic_config)
26 : dribble_tactic_config(dribble_tactic_config)
27 {
28 }
29
31 {
32 // The destination for dribbling the ball
33 std::optional<Point> dribble_destination;
34 // The final orientation to face the ball when finishing dribbling
35 std::optional<Angle> final_dribble_orientation;
36 // whether to allow excessive dribbling, i.e. more than 1 metre at a time
37 bool allow_excessive_dribbling;
38 };
39
40 DEFINE_TACTIC_UPDATE_STRUCT_WITH_CONTROL_AND_COMMON_PARAMS
41
53 static Point robotPositionToFaceBall(const Point &ball_position,
54 const Angle &face_ball_angle,
55 double additional_offset = 0.0);
56
66 // TODO (#1968): Merge this functionality with findBestInterceptForBall in the
67 // evaluation folder
68 Point findInterceptionPoint(const Robot &robot, const Ball &ball, const Field &field);
69
77 static Point getDribbleBallDestination(const Point &ball_position,
78 std::optional<Point> dribble_destination);
79
88 const Point &ball_position, const Point &robot_position,
89 std::optional<Angle> final_dribble_orientation);
90
101 static std::tuple<Point, Angle> calculateNextDribbleDestinationAndOrientation(
102 const Ball &ball, const Robot &robot,
103 std::optional<Point> dribble_destination_opt,
104 std::optional<Angle> final_dribble_orientation_opt);
105
114 void getPossession(const Update &event);
115
124 void dribble(const Update &event);
125
131 void loseBall(const Update &event);
132
140 bool havePossession(const Update &event);
141
149 bool lostPossession(const Update &event);
150
160 bool dribblingDone(const Update &event);
161
170 bool shouldLoseBall(const Update &event);
171
172 auto operator()()
173 {
174 using namespace boost::sml;
175
176 DEFINE_SML_STATE(GetPossession)
177 DEFINE_SML_STATE(Dribble)
178 DEFINE_SML_STATE(LoseBall)
179 DEFINE_SML_EVENT(Update)
180 DEFINE_SML_GUARD(havePossession)
181 DEFINE_SML_GUARD(lostPossession)
182 DEFINE_SML_GUARD(dribblingDone)
183 DEFINE_SML_GUARD(shouldLoseBall)
184 DEFINE_SML_ACTION(loseBall)
185 DEFINE_SML_ACTION(getPossession)
186 DEFINE_SML_ACTION(dribble)
187
188 return make_transition_table(
189 // src_state + event [guard] / action = dest_state
190 *GetPossession_S + Update_E[havePossession_G] / dribble_A = Dribble_S,
191 GetPossession_S + Update_E[!havePossession_G] / getPossession_A,
192 Dribble_S + Update_E[shouldLoseBall_G] / loseBall_A = LoseBall_S,
193 Dribble_S + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
194 Dribble_S + Update_E[!dribblingDone_G] / dribble_A,
195 Dribble_S + Update_E[dribblingDone_G] / dribble_A = X,
196 LoseBall_S + Update_E[shouldLoseBall_G] / loseBall_A,
197 LoseBall_S + Update_E[!shouldLoseBall_G] / getPossession_A = GetPossession_S,
198 X + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
199 X + Update_E[!dribblingDone_G] / dribble_A = Dribble_S,
200 X + Update_E / dribble_A = X);
201 }
202
203 private:
204 // the dribble tactic config
205 TbotsProto::DribbleTacticConfig dribble_tactic_config;
206};
Definition angle.h:15
Definition ball.h:11
Definition field.h:36
Definition point.h:14
Definition robot.h:16
Definition dribble_fsm.h:31
Definition dribble_fsm.h:14
bool havePossession(const Update &event)
Definition dribble_fsm.cpp:174
static std::tuple< Point, Angle > calculateNextDribbleDestinationAndOrientation(const Ball &ball, const Robot &robot, std::optional< Point > dribble_destination_opt, std::optional< Angle > final_dribble_orientation_opt)
Definition dribble_fsm.cpp:104
bool lostPossession(const Update &event)
Definition dribble_fsm.cpp:179
static Point getDribbleBallDestination(const Point &ball_position, std::optional< Point > dribble_destination)
Definition dribble_fsm.cpp:79
void getPossession(const Update &event)
Definition dribble_fsm.cpp:121
static DEFINE_TACTIC_UPDATE_STRUCT_WITH_CONTROL_AND_COMMON_PARAMS Point robotPositionToFaceBall(const Point &ball_position, const Angle &face_ball_angle, double additional_offset=0.0)
Definition dribble_fsm.cpp:6
DribbleFSM(TbotsProto::DribbleTacticConfig dribble_tactic_config)
Definition dribble_fsm.h:25
void dribble(const Update &event)
Definition dribble_fsm.cpp:139
bool dribblingDone(const Update &event)
Definition dribble_fsm.cpp:187
Point findInterceptionPoint(const Robot &robot, const Ball &ball, const Field &field)
Definition dribble_fsm.cpp:15
void loseBall(const Update &event)
Definition dribble_fsm.cpp:155
bool shouldLoseBall(const Update &event)
Definition dribble_fsm.cpp:206
static Angle getFinalDribbleOrientation(const Point &ball_position, const Point &robot_position, std::optional< Angle > final_dribble_orientation)
Definition dribble_fsm.cpp:91