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
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