@@ -57,6 +57,91 @@ namespace crane
57
57
} \
58
58
}
59
59
60
- DEFINE_SKILL_PLANNER (Goalie);
60
+ class GoalieSkillPlanner : public PlannerBase
61
+ {
62
+ public:
63
+ std ::shared_ptr<skills::Goalie> skill = nullptr ;
64
+
65
+ std ::shared_ptr<RobotCommandWrapper> robot_command_wrapper = nullptr ;
66
+
67
+ COMPOSITION_PUBLIC explicit GoalieSkillPlanner (
68
+ WorldModelWrapper ::SharedPtr & world_model, ConsaiVisualizerWrapper ::SharedPtr visualizer)
69
+ : PlannerBase(" Goalie" , world_model, visualizer)
70
+ {
71
+ }
72
+
73
+ std ::pair<Status, std ::vector<crane_msgs ::msg ::RobotCommand>> calculateRobotCommand (
74
+ const std ::vector<RobotIdentifier> & robots) override
75
+ {
76
+ if (not skill or not robot_command_wrapper) {
77
+ return {PlannerBase ::Status ::RUNNING, {}};
78
+ } else {
79
+ std ::vector<crane_msgs ::msg ::RobotCommand> robot_commands;
80
+ auto status = skill->run (*robot_command_wrapper, visualizer);
81
+ return {static_cast <PlannerBase ::Status>(status), {robot_command_wrapper->getMsg ()}};
82
+ }
83
+ }
84
+ auto getSelectedRobots (
85
+ uint8_t selectable_robots_num, const std ::vector<uint8_t > & selectable_robots)
86
+ -> std ::vector<uint8_t> override
87
+ {
88
+ skill = std ::make_shared<skills ::Goalie>(world_model->getOurGoalieId (), world_model);
89
+ robot_command_wrapper =
90
+ std ::make_shared<RobotCommandWrapper>(world_model->getOurGoalieId (), world_model);
91
+ return {world_model->getOurGoalieId ()};
92
+ }
93
+ };
94
+
95
+ class BallPlacementSkillPlanner : public PlannerBase
96
+ {
97
+ public:
98
+ std ::shared_ptr<skills::SingleBallPlacement> skill = nullptr ;
99
+
100
+ std ::shared_ptr<RobotCommandWrapper> robot_command_wrapper = nullptr ;
101
+
102
+ COMPOSITION_PUBLIC explicit BallPlacementSkillPlanner (
103
+ WorldModelWrapper ::SharedPtr & world_model, ConsaiVisualizerWrapper ::SharedPtr visualizer)
104
+ : PlannerBase(" BallPlacement" , world_model, visualizer)
105
+ {
106
+ }
107
+
108
+ std ::pair<Status, std ::vector<crane_msgs ::msg ::RobotCommand>> calculateRobotCommand (
109
+ const std ::vector<RobotIdentifier> & robots) override
110
+ {
111
+ if (not skill or not robot_command_wrapper) {
112
+ return {PlannerBase ::Status ::RUNNING, {}};
113
+ } else {
114
+ if (auto target = world_model->getBallPlacementTarget (); target.has_value ()) {
115
+ skill->setParameter (" placement_x" , target->x ());
116
+ skill->setParameter (" placement_y" , target->y ());
117
+ }
118
+ std ::vector<crane_msgs ::msg ::RobotCommand> robot_commands;
119
+ auto status = skill->run (*robot_command_wrapper, visualizer);
120
+ return {static_cast <PlannerBase ::Status>(status), {robot_command_wrapper->getMsg ()}};
121
+ }
122
+ }
123
+
124
+ auto getSelectedRobots (
125
+ uint8_t selectable_robots_num, const std ::vector<uint8_t > & selectable_robots)
126
+ -> std ::vector<uint8_t> override
127
+ {
128
+ // ボールに近いロボットを1台選択
129
+ auto selected_robots = this ->getSelectedRobotsByScore (
130
+ 1 , selectable_robots, [this ](const std::shared_ptr<RobotInfo> & robot) {
131
+ // ボールに近いほどスコアが高い
132
+ return 100.0 / std::max (world_model->getSquareDistanceFromRobotToBall (robot->id ), 0.01 );
133
+ });
134
+ skill = std ::make_shared<skills ::SingleBallPlacement>(selected_robots.front (), world_model);
135
+
136
+ if (auto target = world_model->getBallPlacementTarget (); target.has_value ()) {
137
+ skill->setParameter (" placement_x" , target->x ());
138
+ skill->setParameter (" placement_y" , target->y ());
139
+ }
140
+
141
+ robot_command_wrapper =
142
+ std ::make_shared<RobotCommandWrapper>(selected_robots.front (), world_model);
143
+ return {selected_robots.front ()};
144
+ }
145
+ };
61
146
} // namespace crane
62
147
#endif // CRANE_PLANNER_PLUGINS__SKILL_PLANNER_HPP_
0 commit comments