diff --git a/crane_robot_skills/src/attacker.cpp b/crane_robot_skills/src/attacker.cpp index 0d8e988e2..3ee355f6a 100644 --- a/crane_robot_skills/src/attacker.cpp +++ b/crane_robot_skills/src/attacker.cpp @@ -211,7 +211,7 @@ Attacker::Attacker(RobotCommandWrapperBase::SharedPtr & base) return false; } - auto our_robots = world_model()->ours.getAvailableRobots(robot()->id); + auto our_robots = world_model()->ours.getAvailableRobots(robot()->id, true); const auto enemy_robots = world_model()->theirs.getAvailableRobots(); // TODO(HansRobo): しっかりパス先を選定する // int receiver_id = getParameter("receiver_id"); @@ -400,7 +400,7 @@ Attacker::Attacker(RobotCommandWrapperBase::SharedPtr & base) std::shared_ptr Attacker::selectPassReceiver() { - auto our_robots = world_model()->ours.getAvailableRobots(robot()->id); + auto our_robots = world_model()->ours.getAvailableRobots(robot()->id, true); const auto enemy_robots = world_model()->theirs.getAvailableRobots(); double best_score = 0.0; std::shared_ptr best_bot = nullptr; diff --git a/utility/crane_msg_wrappers/include/crane_msg_wrappers/world_model_wrapper.hpp b/utility/crane_msg_wrappers/include/crane_msg_wrappers/world_model_wrapper.hpp index a0ac9592e..225043b03 100644 --- a/utility/crane_msg_wrappers/include/crane_msg_wrappers/world_model_wrapper.hpp +++ b/utility/crane_msg_wrappers/include/crane_msg_wrappers/world_model_wrapper.hpp @@ -39,18 +39,30 @@ struct TeamInfo uint32_t max_allowed_bots; - [[nodiscard]] auto getAvailableRobots(uint8_t my_id = 255) const -> RobotList + uint8_t goalie_id; + + [[nodiscard]] auto getAvailableRobots(uint8_t my_id = 255, bool except_goalie = false) const + -> RobotList { - return robots | ranges::views::filter([my_id](const auto & robot) { - return robot->available && robot->id != my_id; + return robots | ranges::views::filter([&](const auto & robot) { + if (except_goalie) { + return robot->available && robot->id != my_id && robot->id != goalie_id; + } else { + return robot->available && robot->id != my_id; + } }) | ranges::to(); } - [[nodiscard]] auto getAvailableRobotIds(uint8_t my_id = 255) const -> std::vector + [[nodiscard]] auto getAvailableRobotIds(uint8_t my_id = 255, bool except_goalie = false) const + -> std::vector { - return robots | ranges::views::filter([my_id](const auto & robot) { - return robot->available && robot->id != my_id; + return robots | ranges::views::filter([&](const auto & robot) { + if (except_goalie) { + return robot->available && robot->id != my_id && robot->id != goalie_id; + } else { + return robot->available && robot->id != my_id; + } }) | ranges::views::transform([](const auto & robot) { return robot->id; }) | ranges::to(); @@ -207,9 +219,9 @@ struct WorldModelWrapper // rule 8.4.3 [[nodiscard]] auto getBallPlacementArea(double offset = 0.) const -> std::optional; - [[nodiscard]] auto getOurGoalieId() const { return latest_msg.our_goalie_id; } + [[nodiscard]] auto getOurGoalieId() const { return ours.goalie_id; } - [[nodiscard]] auto getTheirGoalieId() const { return latest_msg.their_goalie_id; } + [[nodiscard]] auto getTheirGoalieId() const { return theirs.goalie_id; } /** * diff --git a/utility/crane_msg_wrappers/src/world_model_wrapper.cpp b/utility/crane_msg_wrappers/src/world_model_wrapper.cpp index df3dd1ada..18ba57118 100644 --- a/utility/crane_msg_wrappers/src/world_model_wrapper.cpp +++ b/utility/crane_msg_wrappers/src/world_model_wrapper.cpp @@ -130,6 +130,9 @@ void WorldModelWrapper::update(const crane_msgs::msg::WorldModel & world_model) } } + ours.goalie_id = world_model.our_goalie_id; + theirs.goalie_id = world_model.their_goalie_id; + field_size << world_model.field_info.x, world_model.field_info.y; penalty_area_size << world_model.penalty_area_size.x, world_model.penalty_area_size.y;