Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

米子練習会の変更の差分監視 #535

Draft
wants to merge 68 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
9dccfa8
RealSenderのデバッグ出力をOFF
HansRobo Aug 13, 2024
a071711
セットプレイの姑息なプレイを一旦OFF
HansRobo Aug 13, 2024
099e94a
AttackerStateをデバッグ出力
HansRobo Aug 13, 2024
3fc36a6
位置モードのときはstopHereで停止モードを使わない
HansRobo Aug 13, 2024
7bbbad6
BallPlacementのときのオフセットを大きくする
HansRobo Aug 13, 2024
36e3dfa
Teleopスキルの角度調整方法を変更
HansRobo Aug 13, 2024
ad4bd0b
SubAttackerがボールの後ろに回り込んでしまうのを修正
HansRobo Aug 13, 2024
4ceafc5
フリーキックはAttackerを使って実装
HansRobo Aug 13, 2024
a847142
SimSenderのダブリ実装を削除
HansRobo Aug 13, 2024
0fbd483
うるさい「send!!!!!!」を削除
HansRobo Aug 13, 2024
6ab397d
SimSenderのParameterWithEventクラスをファイル分割
HansRobo Aug 13, 2024
5476451
フォーマット
HansRobo Aug 13, 2024
b76513b
実機向け全速度制御のSenderを追加
HansRobo Aug 13, 2024
b70e2e9
Attackerの最終防壁としてGO_TO_BALL状態を追加
HansRobo Aug 13, 2024
24b12d3
MarkerPlannerで相手ロボットの数が少ない場合に例外を吐くバグを修正
HansRobo Aug 13, 2024
5eebcdc
マルチキャスト関連のメモ
HansRobo Aug 13, 2024
5e54003
AttackerスキルのENTRY_POINTの不要な処理を削除
HansRobo Aug 13, 2024
ec1d20c
空のロボット列を与えられると例外を出す処理の対策
HansRobo Aug 13, 2024
6342db9
ボールプレイスメント微調整
HansRobo Aug 13, 2024
a541bb2
ペナルティーエリアのマージン
HansRobo Aug 13, 2024
f83db5b
stopHereで角度も固定
HansRobo Aug 13, 2024
03301b4
ibis senderのキックパワー制限が機能していなかったバグを修正
HansRobo Aug 14, 2024
95c00d5
デフェンスのロボット間隔を広げる
HansRobo Aug 14, 2024
1ca42b0
セットプレイのキック先を調整
HansRobo Aug 14, 2024
ce92aff
空のロボット列を与えられると例外を出す処理の対策
HansRobo Aug 14, 2024
5aefc37
目標位置の修正
HansRobo Aug 14, 2024
eca8eaa
IbisSenderの修正
HansRobo Aug 14, 2024
8a7bf9c
エラーのコメントアウト
HansRobo Aug 14, 2024
89d7edd
Kickスキルで無駄なドリブルをやめる
HansRobo Aug 14, 2024
5e58f7d
プレイスメントの速度アップ
HansRobo Aug 14, 2024
577e242
StealBallの圧を強める
HansRobo Aug 14, 2024
89021b6
STOPにSubAttackerを追加
HansRobo Aug 14, 2024
3340cea
ボール所持判定の調整
HansRobo Aug 14, 2024
c4dd5c5
Rootsさん追加
HansRobo Aug 14, 2024
14cc831
調整
HansRobo Aug 14, 2024
9fba442
RobotCommandWrapperSimpleVelocityにsetTargetPositionを実装
HansRobo Aug 14, 2024
bfc1d5d
フォーマット
HansRobo Aug 14, 2024
29cab48
Skillのデフォルトで表示するコンテクストを増やした
HansRobo Aug 14, 2024
d8fdcef
StealBallVelスキルを実装
HansRobo Aug 14, 2024
3bf0347
RobotCommandWrapperSimpleVelocityの整理
HansRobo Aug 14, 2024
6e6cf2c
フォーマット
HansRobo Aug 14, 2024
473554d
KickVelスキル追加
HansRobo Aug 14, 2024
ff3dcb8
ボールマップを縮小
HansRobo Aug 14, 2024
b37f023
Attacker内部で使うStealBallを交換
HansRobo Aug 14, 2024
c19dbd8
Attacker調整
HansRobo Aug 14, 2024
0be5f60
フォーマット
HansRobo Aug 14, 2024
e9e081f
Attacker調整
HansRobo Aug 14, 2024
ee6bcac
初回起動時にsenderが落ちるのを対策
HansRobo Aug 15, 2024
d122096
StealBallVelスキル用のPlanner
HansRobo Aug 15, 2024
22bbe92
StealBallVelスキル用のsession
HansRobo Aug 15, 2024
562319d
GoalKickのチャタリング対策
HansRobo Aug 15, 2024
df7806f
よくわからんけどキックしないのでキックをONにしまくったやつ(結局うまく行かなかった)
HansRobo Aug 15, 2024
059546e
StealBallVelスキル用のPlannerの登録
HansRobo Aug 15, 2024
f904aff
ダイアグラムの修正
HansRobo Aug 16, 2024
9f7338a
議事録の追加
HansRobo Aug 16, 2024
39ba347
Merge branch 'develop' into 0813
HansRobo Aug 18, 2024
be1b4e0
style(pre-commit): autofix
pre-commit-ci[bot] Aug 18, 2024
62cd366
ログのリセット
HansRobo Aug 17, 2024
423face
Merge branch 'develop' into 0813
HansRobo Aug 18, 2024
0d5d923
Revert "よくわからんけどキックしないのでキックをONにしまくったやつ(結局うまく行かなかった)"
HansRobo Aug 18, 2024
24a36ea
Merge branch 'develop' into 0813
HansRobo Aug 31, 2024
9ab4c84
Merge branch 'develop' into 0813
HansRobo Oct 3, 2024
395aad9
Merge branch 'develop' into 0813
HansRobo Oct 3, 2024
f43bc73
Update crane_local_planner/src/gridmap_planner.cpp
HansRobo Oct 26, 2024
d3f3306
Merge branch 'develop' into 0813
HansRobo Dec 1, 2024
457dff7
style(pre-commit): autofix
pre-commit-ci[bot] Dec 1, 2024
cf74242
Discard changes to docker/config/state-store.json.stream
HansRobo Dec 15, 2024
5202d20
Merge branch 'develop' into 0813
HansRobo Dec 15, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions crane_robot_skills/include/crane_robot_skills/attacker.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ enum class AttackerState {
LOW_CHANCE_GOAL_KICK,
MOVE_BALL_TO_OPPONENT_HALF,
RECEIVE_BALL,
GO_TO_BALL,
THROUGH,
KICK_TO_GOAL,
STOP,
Expand Down
296 changes: 144 additions & 152 deletions crane_robot_skills/src/attacker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,29 +55,34 @@ Attacker::Attacker(RobotCommandWrapperBase::SharedPtr & base)
if (robot()->getDistance(target) < 0.1) {
forced_pass_phase = 1;
}
break;
}
case 1: {
// パス
command.disableBallAvoidance();
kick_skill.setParameter("dot_threshold", 0.95);
kick_skill.setParameter("kick_power", 0.8);
int receiver_id = getParameter<int>("receiver_id");
if (receiver_id != -1) {
kick_target = world_model()->getOurRobot(receiver_id)->pose.pos;
}
Segment kick_line{world_model()->ball.pos, kick_target};
// 近くに敵ロボットがいればチップキック
if (const auto enemy_robots = world_model()->theirs.getAvailableRobots();
not enemy_robots.empty()) {
const auto & [nearest_enemy, enemy_distance] =
world_model()->getNearestRobotWithDistanceFromSegment(kick_line, enemy_robots);
if (enemy_distance < 0.4 && nearest_enemy->getDistance(world_model()->ball.pos) < 2.0) {
kick_skill.setParameter("kick_with_chip", true);
case 1: {
// 敵陣側に味方ロボットがいればパス
if (
(receiver->pose.pos - world_model()->getOurGoalCenter()).norm() >
(world_model()->ball.pos - world_model()->getOurGoalCenter()).norm()) {
kick_skill.setParameter("target", receiver->pose.pos);
} else {
kick_skill.setParameter("target", world_model()->getTheirGoalCenter());
}

kick_skill.setParameter("dot_threshold", 0.95);
kick_skill.setParameter("kick_power", 0.5);
kick_skill.setParameter("around_interval", 0.3);
Segment kick_line{world_model()->ball.pos, receiver->pose.pos};
// 近くに敵ロボットがいればチップキック
if (const auto enemy_robots = world_model()->theirs.getAvailableRobots();
not enemy_robots.empty()) {
const auto & [nearest_enemy, enemy_distance] =
world_model()->getNearestRobotWithDistanceFromSegment(kick_line, enemy_robots);
if (enemy_distance < 0.4 && nearest_enemy->getDistance(world_model()->ball.pos) < 2.0) {
kick_skill.setParameter("kick_with_chip", true);
} else {
kick_skill.setParameter("kick_with_chip", false);
}
}
}
kick_skill.run();
break;
kick_skill.run();
break;
}
default:
return Status::FAILURE;
Expand Down Expand Up @@ -185,7 +190,7 @@ Attacker::Attacker(RobotCommandWrapperBase::SharedPtr & base)

addTransition(AttackerState::GOAL_KICK, AttackerState::ENTRY_POINT, [this]() -> bool {
// ボールが早い
return world_model()->ball.isMoving(1.0);
return world_model()->ball.isMoving(3.0);
});

addStateFunction(AttackerState::GOAL_KICK, [this]() -> Status {
Expand Down Expand Up @@ -287,156 +292,143 @@ Attacker::Attacker(RobotCommandWrapperBase::SharedPtr & base)
if (nearest_enemy->getDistance(world_model()->ball.pos) < 2.0) {
kick_skill.setParameter("kick_with_chip", true);
}
}
kick_skill.setParameter("kick_power", 0.5);
kick_skill.setParameter("dot_threshold", 0.97);
return kick_skill.run();
});

addTransition(AttackerState::ENTRY_POINT, AttackerState::LOW_CHANCE_GOAL_KICK, [this]() -> bool {
// ボールが近く、相手コートにいるとき(本当にチャンスが無いとき(隙間が1deg以下)は除外)
double x_diff_with_their_goal =
std::abs(world_model()->getTheirGoalCenter().x() - world_model()->ball.pos.x());
auto [best_angle, goal_angle_width] =
world_model()->getLargestGoalAngleRangeFromPoint(world_model()->ball.pos);
return robot()->getDistance(world_model()->ball.pos) < 1.0 &&
x_diff_with_their_goal < world_model()->field_size.x() * 0.5 &&
goal_angle_width * 180.0 / M_PI > 1.;
});
kick_skill.setParameter("kick_power", 0.5);
kick_skill.setParameter("dot_threshold", 0.95);
kick_skill.setParameter("around_interval", 0.2);
return kick_skill.run();
});

addTransition(AttackerState::LOW_CHANCE_GOAL_KICK, AttackerState::ENTRY_POINT, [this]() -> bool {
// 敵にボールを奪われた
return not world_model()->isOurBallByBallOwnerCalculator();
});
addTransition(
AttackerState::ENTRY_POINT, AttackerState::LOW_CHANCE_GOAL_KICK, [this]() -> bool {
// ボールが近く、相手コートにいるとき(本当にチャンスが無いとき(隙間が1deg以下)は除外)
double x_diff_with_their_goal =
std::abs(world_model()->getTheirGoalCenter().x() - world_model()->ball.pos.x());
auto [best_angle, goal_angle_width] =
world_model()->getLargestGoalAngleRangeFromPoint(world_model()->ball.pos);
return robot()->getDistance(world_model()->ball.pos) < 1.0 &&
x_diff_with_their_goal < world_model()->field_size.x() * 0.5 &&
goal_angle_width * 180.0 / M_PI > 1.;
});

addTransition(
AttackerState::LOW_CHANCE_GOAL_KICK, AttackerState::ENTRY_POINT, [this]() -> bool {
// 敵にボールを奪われた
return not world_model()->isOurBallByBallOwnerCalculator();
});

addStateFunction(
AttackerState::LOW_CHANCE_GOAL_KICK, [this]() -> Status { return goal_kick_skill.run(); });

addTransition(
AttackerState::ENTRY_POINT, AttackerState::MOVE_BALL_TO_OPPONENT_HALF, [this]() -> bool {
// ボールに近く、自コートにいるとき
double x_diff_with_their_goal =
std::abs(world_model()->getTheirGoalCenter().x() - world_model()->ball.pos.x());
return robot()->getDistance(world_model()->ball.pos) < 1.0 &&
x_diff_with_their_goal >= world_model()->field_size.x() * 0.5;
});

addTransition(
AttackerState::MOVE_BALL_TO_OPPONENT_HALF, AttackerState::ENTRY_POINT, [this]() -> bool {
// 敵にボールを奪われた
return not world_model()->isOurBallByBallOwnerCalculator();
});

addStateFunction(AttackerState::MOVE_BALL_TO_OPPONENT_HALF, [this]() -> Status {
kick_skill.setParameter("target", world_model()->getTheirGoalCenter());
kick_skill.setParameter("kick_power", 0.8);
kick_skill.setParameter("dot_threshold", 0.9);
kick_skill.setParameter("kick_with_chip", true);
return kick_skill.run();
});

addStateFunction(
AttackerState::LOW_CHANCE_GOAL_KICK, [this]() -> Status { return goal_kick_skill.run(); });
addTransition(AttackerState::ENTRY_POINT, AttackerState::RECEIVE_BALL, [this]() -> bool {
return world_model()->ball.isMoving(0.2) &&
world_model()->ball.isMovingTowards(robot()->pose.pos);
});

addTransition(
AttackerState::ENTRY_POINT, AttackerState::MOVE_BALL_TO_OPPONENT_HALF, [this]() -> bool {
// ボールに近く、自コートにいるとき
double x_diff_with_their_goal =
std::abs(world_model()->getTheirGoalCenter().x() - world_model()->ball.pos.x());
return robot()->getDistance(world_model()->ball.pos) < 1.0 &&
x_diff_with_their_goal >= world_model()->field_size.x() * 0.5;
addTransition(AttackerState::RECEIVE_BALL, AttackerState::ENTRY_POINT, [this]() -> bool {
// ボールが止まっている
if (world_model()->ball.vel.norm() < 0.5) {
return true;
} else if (not world_model()->isOurBallByBallOwnerCalculator()) {
// 敵にボールを奪われた
return true;
} else {
return false;
}
});

addTransition(
AttackerState::MOVE_BALL_TO_OPPONENT_HALF, AttackerState::ENTRY_POINT, [this]() -> bool {
// 敵にボールを奪われた
return not world_model()->isOurBallByBallOwnerCalculator();
addStateFunction(AttackerState::RECEIVE_BALL, [this]() -> Status {
receive_skill.setParameter("enable_redirect", true);
receive_skill.setParameter("dribble_power", 0.0);
receive_skill.setParameter("enable_software_bumper", false);
return receive_skill.run();
});

addStateFunction(AttackerState::MOVE_BALL_TO_OPPONENT_HALF, [this]() -> Status {
kick_skill.setParameter("target", world_model()->getTheirGoalCenter());
kick_skill.setParameter("kick_power", 0.8);
kick_skill.setParameter("dot_threshold", 0.95);
kick_skill.setParameter("kick_with_chip", true);
command.disableBallAvoidance();
return kick_skill.run();
});
addTransition(AttackerState::RECEIVE_BALL, AttackerState::ENTRY_POINT, [this]() -> bool {
// 一定以上ボールに触れたら終了
using std::chrono_literals::operator""s;
return robot()->ball_contact.getContactDuration() > 0.2s;
});

addTransition(AttackerState::ENTRY_POINT, AttackerState::RECEIVE_BALL, [this]() -> bool {
if (world_model()->ball.vel.norm() < 0.5) {
// ボールが止まっているときは受け取らない
return false;
} else if (not world_model()->isOurBallByBallOwnerCalculator()) {
// 敵にボールを奪われたときも受け取らない
return false;
} else {
addTransition(AttackerState::ENTRY_POINT, AttackerState::GO_TO_BALL, [this]() -> bool {
// 最終防壁
return true;
}
});
});

addTransition(AttackerState::RECEIVE_BALL, AttackerState::ENTRY_POINT, [this]() -> bool {
// ボールが止まっている
if (world_model()->ball.vel.norm() < 0.5) {
return true;
} else if (not world_model()->isOurBallByBallOwnerCalculator()) {
// 敵にボールを奪われた
addTransition(AttackerState::GO_TO_BALL, AttackerState::ENTRY_POINT, [this]() -> bool {
// 最終防壁なので毎回戻す
return true;
} else {
return false;
}
});

addStateFunction(AttackerState::RECEIVE_BALL, [this]() -> Status {
receive_skill.setParameter("enable_redirect", true);
receive_skill.setParameter("dribble_power", 0.0);
receive_skill.setParameter("enable_software_bumper", false);
return receive_skill.run();
});

addTransition(AttackerState::RECEIVE_BALL, AttackerState::ENTRY_POINT, [this]() -> bool {
// 一定以上ボールに触れたら終了
using std::chrono_literals::operator""s;
return robot()->ball_contact.getContactDuration() > 0.2s;
});

addTransition(AttackerState::ENTRY_POINT, AttackerState::KICK_TO_GOAL, [this]() -> bool {
// どこにも当てはまらないときはゴールに向かってシュート
return true;
});

addStateFunction(AttackerState::KICK_TO_GOAL, [this]() -> Status {
kick_skill.setParameter("target", world_model()->getTheirGoalCenter());
kick_skill.setParameter("kick_power", 0.8);
// kick_skill.setParameter("dot_threshold", 0.95);
kick_skill.setParameter("kick_with_chip", false);
return kick_skill.run();
});
});

addTransition(AttackerState::ENTRY_POINT, AttackerState::KICK_TO_GOAL, [this]() -> bool {
// どこにも当てはまらないときはゴールに向かってシュート
static int count = 0;
// 10フレームに1回ENTRY_POINTに戻して様子を見る
if (count++ > 10) {
count = 0;
return true;
} else {
return false;
}
});
addStateFunction(AttackerState::GO_TO_BALL, [this]() -> Status {
// ボールに向かって移動
command.setTargetPosition(world_model()->ball.pos);
return Status::RUNNING;
});
}

std::shared_ptr<RobotInfo> Attacker::selectPassReceiver()
{
auto our_robots = world_model()->ours.getAvailableRobots(robot()->id);
const auto enemy_robots = world_model()->theirs.getAvailableRobots();
double best_score = 0.0;
std::shared_ptr<RobotInfo> best_bot = nullptr;
for (auto & our_robot : our_robots) {
Segment ball_to_target{world_model()->ball.pos, our_robot->pose.pos};
auto target = our_robot->pose.pos;
double score = 1.0;
// パス先のゴールチャンスが大きい場合はスコアを上げる(30度以上で最大0.5上昇)
auto [best_angle, goal_angle_width] = world_model()->getLargestGoalAngleRangeFromPoint(target);
score += std::clamp(goal_angle_width / (M_PI / 12.), 0.0, 0.5);

// 敵ゴールに近いときはスコアを上げる
double normed_distance_to_their_goal = ((target - world_model()->getTheirGoalCenter()).norm() -
(world_model()->field_size.x() * 0.5)) /
(world_model()->field_size.x() * 0.5);
// マイナスのときはゴールに近い
score *= (1.0 - normed_distance_to_their_goal);
auto our_robots = world_model()->ours.getAvailableRobots(robot()->id);
const auto enemy_robots = world_model()->theirs.getAvailableRobots();
double best_score = 0.0;
std::shared_ptr<RobotInfo> best_bot = nullptr;
for (auto & our_robot : our_robots) {
Segment ball_to_target{world_model()->ball.pos, our_robot->pose.pos};
auto target = our_robot->pose.pos;
double score = 1.0;
// パス先のゴールチャンスが大きい場合はスコアを上げる(30度以上で最大0.5上昇)
auto [best_angle, goal_angle_width] =
world_model()->getLargestGoalAngleRangeFromPoint(target);
score += std::clamp(goal_angle_width / (M_PI / 12.), 0.0, 0.5);

if (not enemy_robots.empty()) {
auto [nearest_enemy, enemy_distance] =
world_model()->getNearestRobotWithDistanceFromSegment(ball_to_target, enemy_robots);
// ボールから遠い敵がパスコースを塞いでいる場合は諦める
if (nearest_enemy->getDistance(world_model()->ball.pos) > 1.0 && enemy_distance < 0.4) {
score = 0.0;
// 敵ゴールに近いときはスコアを上げる
double normed_distance_to_their_goal =
((target - world_model()->getTheirGoalCenter()).norm() -
(world_model()->field_size.x() * 0.5)) /
(world_model()->field_size.x() * 0.5);
// マイナスのときはゴールに近い
score *= (1.0 - normed_distance_to_their_goal);

if (not enemy_robots.empty()) {
auto [nearest_enemy, enemy_distance] =
world_model()->getNearestRobotWithDistanceFromSegment(ball_to_target, enemy_robots);
// ボールから遠い敵がパスコースを塞いでいる場合は諦める
if (nearest_enemy->getDistance(world_model()->ball.pos) > 1.0 && enemy_distance < 0.4) {
score = 0.0;
}
// パスラインに敵がいるときはスコアを下げる
score *= 1.0 / (1.0 + enemy_distance);
}
// パスラインに敵がいるときはスコアを下げる
score *= 1.0 / (1.0 + enemy_distance);
}

if (score > best_score) {
best_score = score;
best_bot = our_robot;
if (score > best_score) {
best_score = score;
best_bot = our_robot;
}
}
}

return best_bot;
return best_bot;
}
} // namespace crane::skills
Loading
Loading