Skip to content

Commit d62d7d6

Browse files
Use tracked dribble displacement from World in DribbleFSM (#3441)
* Use tracked dribble displacement from World in DribbleFSM * [pre-commit.ci lite] apply automatic fixes --------- Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com>
1 parent e0ca810 commit d62d7d6

File tree

5 files changed

+33
-45
lines changed

5 files changed

+33
-45
lines changed

docs/fsm-diagrams.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -268,14 +268,14 @@ stateDiagram-v2
268268
classDef terminate fill:white,color:black,font-weight:bold
269269
direction LR
270270
[*] --> GetPossession
271-
GetPossession --> Dribble : [havePossession]\n<i>startDribble</i>
271+
GetPossession --> Dribble : [havePossession]\n<i>dribble</i>
272272
GetPossession --> GetPossession : [!havePossession]\n<i>getPossession</i>
273-
Dribble --> GetPossession : [lostPossession]\n<i>getPossession</i>
274273
Dribble --> LoseBall : [shouldLoseBall]\n<i>loseBall</i>
274+
Dribble --> GetPossession : [lostPossession]\n<i>getPossession</i>
275275
Dribble --> Dribble : [!dribblingDone]\n<i>dribble</i>
276276
Dribble --> Terminate:::terminate : [dribblingDone]\n<i>dribble</i>
277-
LoseBall --> LoseBall : [!lostPossession]\n<i>loseBall</i>
278-
LoseBall --> GetPossession : [lostPossession]\n<i>getPossession</i>
277+
LoseBall --> LoseBall : [shouldLoseBall]\n<i>loseBall</i>
278+
LoseBall --> GetPossession : [!shouldLoseBall]\n<i>getPossession</i>
279279
Terminate:::terminate --> GetPossession : [lostPossession]\n<i>getPossession</i>
280280
Terminate:::terminate --> Dribble : [!dribblingDone]\n<i>dribble</i>
281281
Terminate:::terminate --> Terminate:::terminate : <i>dribble</i>

src/proto/parameters.proto

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -313,11 +313,8 @@ message DribbleTacticConfig
313313
{
314314
// If ball and front of robot are separated by this amount, then we've lost
315315
// possession (in m)
316-
required double lose_ball_possession_threshold = 1 [
317-
default = 0.04,
318-
(bounds).min_double_value = 0.0,
319-
(bounds).max_double_value = 1.0
320-
];
316+
required double lose_ball_possession_threshold = 1
317+
[default = 0.1, (bounds).min_double_value = 0.0, (bounds).max_double_value = 1.0];
321318

322319
// Threshold to determine if the ball is at the destination determined
323320
// experimentally (in m)
@@ -334,11 +331,8 @@ message DribbleTacticConfig
334331

335332
// Maximum distance to continuously dribble the ball,
336333
// slightly conservative to not break the 1 meter rule (in m)
337-
required double max_continuous_dribbling_distance = 4 [
338-
default = 0.78,
339-
(bounds).min_double_value = 0.0,
340-
(bounds).max_double_value = 2.0
341-
];
334+
required double max_continuous_dribbling_distance = 4
335+
[default = 0.8, (bounds).min_double_value = 0.0, (bounds).max_double_value = 2.0];
342336

343337
// Robot speed at which the robot is done dribbling (in m/s)
344338
required double robot_dribbling_done_speed = 5

src/software/ai/evaluation/keep_away.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ Point findKeepAwayTargetPoint(const World& world, const Pass& best_pass_so_far,
2727
field_bounds.yMax() - FIELD_SIZE_REDUCTION_M);
2828
Rectangle reduced_field_bounds = Rectangle(reduced_bottom_left, reduced_top_right);
2929

30+
Point initial_keepaway_point = world.ball().position();
31+
const std::optional<Segment> dribble_displacement = world.getDribbleDisplacement();
32+
if (dribble_displacement.has_value())
33+
{
34+
initial_keepaway_point = dribble_displacement->getStart();
35+
}
36+
3037
// the position rating function we want to maximize
3138
const auto keepaway_point_cost = [&](const std::array<double, 2>& passer_pt_array) {
3239
Point passer_pt(std::get<0>(passer_pt_array), std::get<1>(passer_pt_array));
@@ -36,7 +43,7 @@ Point findKeepAwayTargetPoint(const World& world, const Pass& best_pass_so_far,
3643
GradientDescentOptimizer<2> optimizer{PARAM_WEIGHTS};
3744
auto passer_pt_array = optimizer.maximize(
3845
keepaway_point_cost,
39-
std::array<double, 2>{world.ball().position().x(), world.ball().position().y()},
46+
std::array<double, 2>{initial_keepaway_point.x(), initial_keepaway_point.y()},
4047
GRADIENT_STEPS_PER_ITER);
4148
Point keepaway_target_point(std::get<0>(passer_pt_array),
4249
std::get<1>(passer_pt_array));

src/software/ai/hl/stp/tactic/dribble/dribble_fsm.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,10 @@ void DribbleFSM::dribble(const Update &event)
155155
void DribbleFSM::loseBall(const Update &event)
156156
{
157157
Point ball_position = event.common.world_ptr->ball().position();
158-
auto face_ball_orientation =
158+
159+
Angle face_ball_orientation =
159160
(ball_position - event.common.robot.position()).orientation();
161+
160162
Point away_from_ball_position = robotPositionToFaceBall(
161163
ball_position, face_ball_orientation,
162164
dribble_tactic_config.lose_ball_possession_threshold() * 2);
@@ -166,14 +168,7 @@ void DribbleFSM::loseBall(const Update &event)
166168
TbotsProto::MaxAllowedSpeedMode::PHYSICAL_LIMIT,
167169
TbotsProto::ObstacleAvoidanceMode::AGGRESSIVE, TbotsProto::DribblerMode::OFF,
168170
TbotsProto::BallCollisionType::AVOID,
169-
AutoChipOrKick{AutoChipOrKickMode::AUTOKICK, 0.5}));
170-
}
171-
172-
void DribbleFSM::startDribble(const Update &event)
173-
{
174-
// update continuous_dribbling_start_point once we start dribbling
175-
continuous_dribbling_start_point = event.common.world_ptr->ball().position();
176-
dribble(event);
171+
AutoChipOrKick{AutoChipOrKickMode::OFF, 0}));
177172
}
178173

179174
bool DribbleFSM::havePossession(const Update &event)
@@ -210,8 +205,10 @@ bool DribbleFSM::dribblingDone(const Update &event)
210205

211206
bool DribbleFSM::shouldLoseBall(const Update &event)
212207
{
213-
Point ball_position = event.common.world_ptr->ball().position();
208+
std::optional<Segment> dribble_displacement =
209+
event.common.world_ptr->getDribbleDisplacement();
214210
return (!event.control_params.allow_excessive_dribbling &&
215-
!comparePoints(ball_position, continuous_dribbling_start_point,
216-
dribble_tactic_config.max_continuous_dribbling_distance()));
211+
dribble_displacement.has_value() &&
212+
dribble_displacement->length() >=
213+
dribble_tactic_config.max_continuous_dribbling_distance());
217214
}

src/software/ai/hl/stp/tactic/dribble/dribble_fsm.h

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,7 @@ struct DribbleFSM
2323
* @param dribble_tactic_config The config to fetch parameters from
2424
*/
2525
explicit DribbleFSM(TbotsProto::DribbleTacticConfig dribble_tactic_config)
26-
: dribble_tactic_config(dribble_tactic_config),
27-
continuous_dribbling_start_point(Point())
26+
: dribble_tactic_config(dribble_tactic_config)
2827
{
2928
}
3029

@@ -124,13 +123,6 @@ struct DribbleFSM
124123
*/
125124
void dribble(const Update &event);
126125

127-
/**
128-
* Start dribbling
129-
*
130-
* @param event DribbleFSM::Update
131-
*/
132-
void startDribble(const Update &event);
133-
134126
/**
135127
* Action to lose possession of the ball
136128
*
@@ -189,28 +181,26 @@ struct DribbleFSM
189181
DEFINE_SML_GUARD(lostPossession)
190182
DEFINE_SML_GUARD(dribblingDone)
191183
DEFINE_SML_GUARD(shouldLoseBall)
192-
DEFINE_SML_ACTION(startDribble)
193184
DEFINE_SML_ACTION(loseBall)
194185
DEFINE_SML_ACTION(getPossession)
195186
DEFINE_SML_ACTION(dribble)
196187

197188
return make_transition_table(
198189
// src_state + event [guard] / action = dest_state
199-
*GetPossession_S + Update_E[havePossession_G] / startDribble_A = Dribble_S,
190+
*GetPossession_S + Update_E[havePossession_G] / dribble_A = Dribble_S,
200191
GetPossession_S + Update_E[!havePossession_G] / getPossession_A,
201-
Dribble_S + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
202192
Dribble_S + Update_E[shouldLoseBall_G] / loseBall_A = LoseBall_S,
193+
Dribble_S + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
203194
Dribble_S + Update_E[!dribblingDone_G] / dribble_A,
204195
Dribble_S + Update_E[dribblingDone_G] / dribble_A = X,
205-
LoseBall_S + Update_E[!lostPossession_G] / loseBall_A,
206-
LoseBall_S + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
207-
X + Update_E[lostPossession_G] / getPossession_A = GetPossession_S,
208-
X + Update_E[!dribblingDone_G] / dribble_A = Dribble_S,
209-
X + Update_E / 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);
210201
}
211202

212203
private:
213204
// the dribble tactic config
214205
TbotsProto::DribbleTacticConfig dribble_tactic_config;
215-
Point continuous_dribbling_start_point;
216206
};

0 commit comments

Comments
 (0)