18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 | class CursorAction(Action):
"""
Action used to move the cursor.
"""
def __init__(self, planner: "Planner", strategy: Strategy, weight: float = 2000000.0, unit_test: bool = True):
super().__init__("Cursor", planner, strategy)
self.custom_weight = weight
self.unit_test = unit_test
self.before_action_func = self.before_action
self.x = -815
self.y_start = -1270
self.y_end = -740
self.approach_speed = 100
self.end_speed = 50
async def before_action(self):
self.logger.info(f"{self.name}: before_action")
self.poses.clear()
if self.unit_test:
self.planner.game_context.collection_areas[CollectionAreaID.LocalBottom].enabled = False
self.planner.game_context.collection_areas[CollectionAreaID.LocalBottomSide].enabled = False
if not self.planner.game_context.front_free:
self.orientation = 90
self.approach_direction = MotionDirection.BACKWARD_ONLY
self.direction = MotionDirection.FORWARD_ONLY
if Camp().color == Camp.Colors.blue:
self.arm_open = functools.partial(actuators.back_arm_left_open, self.planner)
self.arm_close = functools.partial(actuators.back_arm_left_close, self.planner)
self.arms_close = functools.partial(actuators.back_arms_close, self.planner)
self.opposite_arms_close = functools.partial(actuators.front_arms_close, self.planner)
else:
self.arm_open = functools.partial(actuators.back_arm_right_open, self.planner)
self.arm_close = functools.partial(actuators.back_arm_right_close, self.planner)
self.arms_close = functools.partial(actuators.back_arms_close, self.planner)
self.opposite_arms_close = functools.partial(actuators.front_arms_close, self.planner)
self.lift_up = functools.partial(actuators.back_lift_up, self.planner)
self.lift_mid = functools.partial(actuators.back_lift_mid, self.planner)
else:
self.orientation = -90
self.approach_direction = MotionDirection.FORWARD_ONLY
self.direction = MotionDirection.BACKWARD_ONLY
if Camp().color == Camp.Colors.blue:
self.arm_open = functools.partial(actuators.front_arm_right_open, self.planner)
self.arm_close = functools.partial(actuators.front_arm_right_close, self.planner)
self.arms_close = functools.partial(actuators.front_arms_close, self.planner)
self.opposite_arms_close = functools.partial(actuators.back_arms_close, self.planner)
else:
self.arm_open = functools.partial(actuators.front_arm_left_open, self.planner)
self.arm_close = functools.partial(actuators.front_arm_left_close, self.planner)
self.arms_close = functools.partial(actuators.front_arms_close, self.planner)
self.opposite_arms_close = functools.partial(actuators.back_arms_close, self.planner)
self.lift_up = functools.partial(actuators.front_lift_up, self.planner)
self.lift_mid = functools.partial(actuators.front_lift_mid, self.planner)
# Start
start_pose = AdaptedPose(
x=self.x,
y=self.y_start,
O=self.orientation,
max_speed_linear=self.approach_speed,
max_speed_angular=self.approach_speed,
motion_direction=self.approach_direction,
before_pose_func=self.before_start,
after_pose_func=self.after_start,
)
self.poses.append(start_pose)
self.logger.info(f"{self.name}: start: {start_pose.pose}")
# End
end_pose = AdaptedPose(
x=self.x,
y=self.y_end,
O=self.orientation,
max_speed_linear=self.end_speed,
max_speed_angular=self.end_speed,
motion_direction=self.direction,
before_pose_func=self.before_end,
after_pose_func=self.after_end,
)
self.poses.append(end_pose)
self.logger.info(f"{self.name}: end: {end_pose.pose}")
async def before_start(self):
self.logger.info(f"{self.name}: before_start")
await self.lift_up()
await self.arms_close()
await self.opposite_arms_close()
async def after_start(self):
self.logger.info(f"{self.name}: after_start")
async def before_end(self):
self.logger.info(f"{self.name}: before_end")
duration_arm = await self.arm_open()
duration_lift = await self.lift_mid()
await asyncio.sleep(max(duration_arm, duration_lift / 2))
async def after_end(self):
self.logger.info(f"{self.name}: after_end")
self.planner.game_context.cursor_moved = True
duration_arm = await self.arm_close()
duration_lift = await self.lift_up()
await asyncio.sleep(max(duration_arm, duration_lift / 2))
def weight(self) -> float:
if not self.planner.game_context.front_free and not self.planner.game_context.back_free:
self.logger.info(f"{self.name}: Rejected: both front and back are full")
return 0
if not self.unit_test:
# if self.planner.game_context.collection_areas[CollectionAreaID.LocalBottom].enabled:
# self.logger.info(f"{self.name}: Rejected: local bottom collection area is not empty")
# return 0
if self.planner.game_context.collection_areas[CollectionAreaID.LocalBottomSide].enabled:
self.logger.info(f"{self.name}: Rejected: local bottom side collection area is not empty")
return 0
return self.custom_weight
|