예제 #1
0
 def run(self, drone: CarObject, agent: MyHivemind):
     if self.time == -1:
         elapsed = 0
         self.time = agent.time
     else:
         elapsed = agent.time - self.time
     if elapsed < self.delay:
         if elapsed < self.duration:
             drone.controller.jump = True
         else:
             drone.controller.jump = False
             self.counter += 1
         robbies_constant = (self.vector * 1.5 * 2200 - drone.velocity * 1.5) * 2 * 1.5 ** -2
         robbies_boost_constant = drone.forward.flatten().normalize().dot(
             robbies_constant.flatten().normalize()) > (0.3 if not drone.airborne else 0.1)
         drone.controller.boost = robbies_boost_constant and not drone.supersonic
     elif elapsed >= self.delay and self.counter < 3:
         drone.controller.jump = False
         self.counter += 1
     elif elapsed < 0.9:
         drone.controller.jump = True
         defaultPD(drone, self.vector)
         drone.controller.pitch = self.pitch
         if abs(self.vector[1]) < 0.175:
             drone.controller.yaw = self.yaw
         drone.controller.roll = 0
     else:
         drone.pop()
         drone.push(Recovery(self.vector, target_local=True))
예제 #2
0
    def run(self, drone: CarObject, agent: MyHivemind):
        if self.boost is None:
            drone.pop()
            return
        car_to_boost = self.boost.location - drone.location
        distance_remaining = car_to_boost.flatten().magnitude()

        agent.line(self.boost.location - Vector3(0, 0, 500), self.boost.location + Vector3(0, 0, 500), [0, 255, 0])

        if self.target is not None:
            vector = (self.target - self.boost.location).normalize()
            side_of_vector = sign(vector.cross((0, 0, 1)).dot(car_to_boost))
            car_to_boost_perp = car_to_boost.cross((0, 0, side_of_vector)).normalize()
            adjustment = car_to_boost.angle2D(vector) * distance_remaining / 3.14
            final_target = self.boost.location + (car_to_boost_perp * adjustment)
            car_to_target = (self.target - drone.location).magnitude()
        else:
            adjustment = 9999
            car_to_target = 0
            final_target = self.boost.location

        # Some adjustment to the final target to ensure it's inside the field and
        # we don't try to dirve through any goalposts to reach it
        if abs(drone.location[1]) > 5150:
            final_target[0] = cap(final_target[0], -750, 750)

        local_target = drone.local(final_target - drone.location)

        angles = defaultPD(drone, local_target)
        defaultThrottle(drone, 2300)

        drone.controller.boost = self.boost.large if abs(angles[1]) < 0.3 else False
        drone.controller.handbrake = True if abs(angles[1]) > 2.3 else drone.controller.handbrake

        velocity = 1 + drone.velocity.magnitude()
        if not self.boost.active or drone.boost >= 99.0 or distance_remaining < 350:
            drone.pop()
        elif drone.airborne:
            drone.push(Recovery(self.target))
        elif abs(angles[1]) < 0.05 and 600 < velocity < 2150 and (
                distance_remaining / velocity > 2.0 or (adjustment < 90 and car_to_target / velocity > 2.0)):
            drone.push(Flip(local_target))
예제 #3
0
    def run(self, drone: CarObject, agent: MyHivemind):
        if self.time == -1:
            elapsed = 0
            self.time = agent.time
        else:
            elapsed = agent.time - self.time
        T = self.intercept_time - agent.time
        xf = drone.location + drone.velocity * T + 0.5 * gravity * T ** 2
        vf = drone.velocity + gravity * T
        if self.jumping:
            if self.jump_time == -1:
                jump_elapsed = 0
                self.jump_time = agent.time
            else:
                jump_elapsed = agent.time - self.jump_time
            tau = jump_max_duration - jump_elapsed
            if jump_elapsed == 0:
                vf += drone.up * jump_speed
                xf += drone.up * jump_speed * T

            vf += drone.up * jump_acc * tau
            xf += drone.up * jump_acc * tau * (T - 0.5 * tau)

            vf += drone.up * jump_speed
            xf += drone.up * jump_speed * (T - tau)

            if jump_elapsed < jump_max_duration:
                drone.controller.jump = True
            elif elapsed >= jump_max_duration and self.counter < 3:
                drone.controller.jump = False
                self.counter += 1
            elif elapsed < 0.3:
                drone.controller.jump = True
            else:
                self.jumping = jump_elapsed <= 0.3
        else:
            drone.controller.jump = 0

        delta_x = self.ball_location - xf
        direction = delta_x.normalize()
        if delta_x.magnitude() > 50:
            defaultPD(drone, drone.local(delta_x))
        else:
            if self.target is not None:
                defaultPD(drone, drone.local(self.target))
            else:
                defaultPD(drone, drone.local(self.ball_location - drone.location))

        if jump_max_duration <= elapsed < 0.3 and self.counter == 3:
            drone.controller.roll = 0
            drone.controller.pitch = 0
            drone.controller.yaw = 0
            drone.controller.steer = 0

        if drone.forward.angle3D(direction) < 0.3:
            if delta_x.magnitude() > 50:
                drone.controller.boost = 1
                drone.controller.throttle = 0
            else:
                drone.controller.boost = 0
                drone.controller.throttle = cap(0.5 * throttle_accel * T ** 2, 0, 1)
        else:
            drone.controller.boost = 0
            drone.controller.throttle = 0

        if T <= 0 or not shot_valid(agent, self, threshold=150):
            drone.pop()
            drone.push(Recovery(agent.friend_goal.location))