Skip to content

cursor

CursorAction #

Bases: Action

Action used to move the cursor.

Source code in cogip/tools/planner/actions/cursor.py
 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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
class CursorAction(Action):
    """
    Action used to move the cursor.
    """

    def __init__(self, planner: "Planner", strategy: Strategy, weight: float = 2_000_000.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 = -810
        self.y_approach = -1110
        self.y_start = -1320
        self.y_end = -785
        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_side = functools.partial(actuators.back_arm_left_side, 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_side = functools.partial(actuators.back_arm_right_side, 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_side = functools.partial(actuators.front_arm_right_side, 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_side = functools.partial(actuators.front_arm_left_side, 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)

        # Approach
        approach_pose = AdaptedPose(
            x=self.x,
            y=self.y_approach,
            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_approach,
            after_pose_func=self.after_approach,
        )
        self.poses.append(approach_pose)
        self.logger.info(f"{self.name}: approach: {approach_pose.pose}")

        # 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_approach(self):
        self.logger.info(f"{self.name}: before_approach")
        await self.lift_up()
        await self.arms_close()
        await self.opposite_arms_close()

    async def after_approach(self):
        self.logger.info(f"{self.name}: after_approach")

    async def before_start(self):
        self.logger.info(f"{self.name}: before_start")

    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_side()
        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.LocalBottomSide].enabled:
                self.logger.info(f"{self.name}: Rejected: local bottom side collection area is not empty")
                return 0

        return self.custom_weight