Пример #1
0
    def drive(self, carstate: State) -> Command:
        command = Command()

        # Fill sensor data
        self.sensors[0] = carstate.speed_x
        self.sensors[1] = carstate.distance_from_center
        self.sensors[2] = carstate.angle * np.pi / 180
        self.sensors[3:] = np.array(carstate.distances_from_edge)

        # Input to steering reservoir
        echo = self.esn.transform(self.sensors.reshape(1, 22))
        if abs(carstate.distance_from_center) < 1:
            # Readout reservoir using neural network, predict and set steering
            steer_idx = self.steer_model.predict(echo)
            command.steering = MyDriver.steering_levels[steer_idx]

            # Determine car state using SOM to set the speed
            car_state = self.som.get_closer(self.sensors[3:, np.newaxis])
            target_speed = self.map_speeds[car_state]
            self.accelerate(carstate, target_speed, command)
        else:
            self.steer(carstate, 0, command)
            self.accelerate(carstate, 20, command)

        return command
Пример #2
0
    def drive(self, carstate):
        """ Gets the car out of a difficult situation

        Tries different approaches and gives each one a time out.
        A class level variable keeps track of the current approach
        across game cycles. If the timer runs out, the approach
        is terminated and the next approach gets initiated.

        Args:
            carstate:   All parameters packed in a State object

        Returns:
            command:    The next move packed in a Command object

        """
        command = Command()
        command.accelerator = 0
        self.appr_counter += 1
        if self.appr_counter > APPROACH_TIMEOUT:
            self.next_approach()
        try:
            command = self.approaches[self.approach](carstate, command)
            self.previous_accels.append(command.accelerator)
            self.previous_gears.append(command.gear)
        except Exception as e:
            err(self.iter, "ERROR:", str(e))

        return command
Пример #3
0
    def shift(self, carstate: State, command: Command):
        if carstate.rpm > 9000:
            command.gear = carstate.gear + 1

        if carstate.rpm < 2500 and carstate.gear > 1:
            command.gear = carstate.gear - 1

        if not command.gear:
            command.gear = carstate.gear or 1
Пример #4
0
    def drive(self, carstate: State) -> Command:

        print('Drive')
        input = carstate.to_input_array()

        if np.isnan(input).any():
            if not self.stopped:
                self.saveResults()

            print(input)
            print('NaN INPUTS!!! STOP WORKING')
            return Command()

        self.stopped = np.isnan(input).any()

        self.print_log(carstate)

        self.update(carstate)

        try:
            output = self.net.activate(input)
            command = Command()

            if self.unstuck and self.isStuck(carstate):
                print('Ops! I got STUCK!!!')
                self.reverse(carstate, command)

            else:

                if self.unstuck and carstate.gear <= 0:
                    carstate.gear = 1

                for i in range(len(output)):
                    if np.isnan(output[i]):
                        output[i] = 0.0

                print('Out = ' + str(output))

                self.accelerate(output[0], output[1], 0, carstate, command)

                if len(output) == 3:
                    # use this if the steering is just one output
                    self.steer(output[2], 0, carstate, command)
                else:
                    # use this command if there are 2 steering outputs
                    self.steer(output[2], output[3], carstate, command)
        except:
            print('Error!')
            self.saveResults()
            raise

        if self.data_logger:
            self.data_logger.log(carstate, command)

        return command
Пример #5
0
    def drive(self, carstate: State) -> Command:

        print('Drive')

        self.print_log(carstate)

        self.update(carstate)

        command = Command()

        command.accelerator = 1
        command.gear = 1
        command.brake = 0
        command.steering = 0  #-1 * carstate.angle * np.pi / (180.0 * 0.785398)

        if carstate.speed_x > 1 and command.gear >= 0 and command.brake < 0.1 and carstate.rpm > 8000:
            command.gear = min(6, command.gear + 1)

        if carstate.rpm < 2500 and command.gear > 1:
            command.gear = command.gear - 1

        if not command.gear:
            command.gear = carstate.gear or 1

        return command
Пример #6
0
    def to_command(self, accelerate, steer):
        command = Command()

        if accelerate >= 0:
            command.accelerator = accelerate
        else:
            command.brake = abs(accelerate)

        command.steering = (self.prev_command.steering + steer) / 2

        return command
Пример #7
0
    def step(self, carstate: State, command: Command):
        command.accelerator = min(
            1, (carstate.distance_from_center -
                0.2)**4)  #2 - min(carstate.distances_from_edge)
        command.gear = -1
        command.brake = 0.0
        command.clutch = 0.0
        command.steering = -1 * carstate.angle * np.pi / (180.0 *
                                                          0.785398) * 1.5

        return True
Пример #8
0
    def drive(self, carstate: State) -> Command:
        """
        Produces driving command in response to newly received car state.
        This is a dummy driving routine, very dumb and not really considering a
        lot of inputs. But it will get the car (if not disturbed by other
        drivers) successfully driven along the race track.
        """
        command = Command()
        stateList = self.stateToArray(carstate)
        # output = self.network.activate(stateList)
        output = self.network.forward(stateList).data
        print(output)
        #self.steer(carstate, output[0, 2], command)
        command.steering = output[0, 0]
        command.accelerator = output[0, 1]
        command.brake = output[0, 2]

        if command.accelerator > 0:
            if carstate.rpm > 8000:
                command.gear = carstate.gear + 1
        if command.accelerator < 0:
            if carstate.rpm < 2500:
                command.gear = carstate.gear - 1
        if not command.gear:
            command.gear = carstate.gear or 1

        #acceleration = output[0,1]*129
        #acceleration = math.pow(acceleration, 3)

        #if acceleration > 0:
        #    if abs(carstate.distance_from_center) >= 1:
        # off track, reduced grip:
        #        acceleration = min(0.4, acceleration)

        #    command.accelerator = min(acceleration, 1)

        #    if carstate.rpm > 8000:
        #        command.gear = carstate.gear + 1

        #else:
        #    command.brake = min(-acceleration, 1)

        #if carstate.rpm < 2500:
        #    command.gear = carstate.gear - 1

        #if not command.gear:
        #    command.gear = carstate.gear or 1

        #if output[0,0]>0.5:
        #    ACC_LATERAL_MAX = 6400 * 5
        #    v_x = min(80, math.sqrt(ACC_LATERAL_MAX / abs(command.steering)))
        #else:
        #    v_x = 0
        #self.accelerate(carstate, 85, command)

        if self.data_logger:
            self.data_logger.log(carstate, command)

        return command
Пример #9
0
 def drive(self, carstate: State) -> Command:
     '''
     Main driving method
     '''
     command = Command()
     # if not cheesus, drive normally
     if not self.is_cheesus(carstate):
         # Check if car is stuck
         self.recovery = self.is_stuck(
             carstate) if not self.recovery else self.recovery
         # if car is stuck, go into recovery mode
         if self.recovery:
             command = self.recovery_drive(carstate)
         # if car is not stuck, proceed normally
         else:
             # if car should overtake, go into overtaking mode
             if self.should_overtake(carstate):
                 print("avoidance state:", self.avoidance_state)
                 command = self.overtake_drive(carstate)
             # if car is free of opponents, drive normally
             else:
                 command = self.default_drive(carstate)
     # if car has entered cheesus mode
     else:
         command = self.cheesy_drive(carstate)
     self.last_acceleration = command.accelerator
     self.epoch += 1
     # print("unmoved:", self.epochs_unmoved)
     # print("angle:", carstate.angle)
     # print("distance center:", carstate.distance_from_center)
     # print("speed_x:", carstate.speed_x)
     # print("cheesus:", self.cheesus_state)
     # print(command)
     return command
Пример #10
0
    def overtake_drive(self, carstate):
        '''
        Behaviour for overtaking opponents
        '''
        print("Overtaking")
        command = Command()

        state = state_to_dict(carstate, apply_mask=False)
        # collect distance to opponents in front
        dist_opponents_f = state['opponents'][17]
        dist_opponents_l = state['opponents'][8]
        dist_opponents_r = state['opponents'][26]
        # sanity checks
        if min(state['opponents']) > min(carstate.speed_x, 40):
            self.avoidance_state = 0
            print("sanity giving back control (opponents)")
            return command
        if np.abs(carstate.distance_from_center) > .9:
            self.avoidance_state = 0
            print("sanity giving back control (center)")
            return command
        # init avoidance steering
        avoidance_steering = .1 * np.sign(self.avoidance_state)
        # check if already overtaking
        if np.abs(self.avoidance_state) == 1 and np.abs(carstate.angle) > min(
                10, 250 / carstate.speed_x):
            self.avoidance_state = 2 * np.sign(self.avoidance_state)
        # check if we should steer back
        if np.abs(self.avoidance_state) == 2:
            avoidance_steering *= -1
            # check if car should stop steering
            if np.abs(carstate.angle) < 5:
                avoidance_steering = 0
                self.avoidance_state = 3 * np.sign(self.avoidance_state)
        # check if pass was completed
        if self.avoidance_state == 3 and dist_opponents_l > 10:
            avoidance_steering = 0
            self.avoidance_state = 0
        if self.avoidance_state == -3 and dist_opponents_r > 10:
            avoidance_steering = 0
            self.avoidance_state = 0
        # create command
        command.steering = avoidance_steering
        print("avoidance steering: ", avoidance_steering)
        command.accelerator = 1
        command.gear = self.my_gear
        return command
Пример #11
0
 def drive(self, carstate):
     command = Command()
     command.steering = carstate.angle / 180
     if carstate.angle > 30 or carstate.angle < -30:
         command.brake = 0.5
         command.accelerator = 0
     else:
         command.brake = 0
         command.accelerator = 1
     command.gear = 1
     return command
Пример #12
0
	def __init__(self, hidden_dimension, in_file):
		super(FFNN_Driver, self).__init__()
		self.model = FFNN(hidden_dimension)
		self.model.load_state_dict(torch.load(in_file))
		self.last_command = Command()
		self.last_command.accelerator = 1
		self.last_command.brake = 0
		self.last_command.steering = 0
		self.last_command.gear = 1
		self.sensor_data = []
Пример #13
0
 def drive(self, carstate: State) -> Command:
     command = Command()
     current_state = state_to_vector(carstate)
     command_vector = self.jesus.take_wheel(current_state)
     command = vector_to_command(command_vector)
     self.calc_gear(command, carstate)
     if self.epoch % 100 == 0:
         print(command_vector)
     self.epoch += 1
     return command
Пример #14
0
    def drive(self, carstate: State) -> Command:
        """
        Produces driving command in response to newly received car state.

        This is a dummy driving routine, very dumb and not really considering a
        lot of inputs. But it will get the car (if not disturbed by other
        drivers) successfully driven along the race track.

        """
        global fullData
        data = np.empty(25)
        data[3] = carstate.speed_x
        data[4] = carstate.z
        data[5] = carstate.angle
        for index, edge in enumerate(carstate.distances_from_edge):
        	data[3 + index] = edge
        # data = torch.from_numpy(data.T)
        # data = data.type(torch.FloatTensor)
        # data=torch.unsqueeze(data,1)
        # data =  Variable(data)

        net_input = torch.from_numpy(fullData.flatten())
        net_input = Variable(net_input.type(torch.FloatTensor))

        # force = np.random.random() < 0.5
        # data = torch.transpose(data, 0, 1)
        predict, hidden_layer = self.model.forward(net_input)
        command = Command()
        predict = predict[0].data.numpy()
        data[0] = predict[0]
        data[1] = predict[1]
        data[2] = predict[2]
        if predict[0] > 0.5:
        	command.accelerator = 1
        else:
        	command.accelerator = 0
        if predict[1] > 0.5:
            command.brake = 1
            print("BRAKING")
        else:
        	command.brake = 0
        command.steer = predict[2]
        self.steer(carstate, 0.0, command)


        # ACC_LATERAL_MAX = 6400 * 5
        # v_x = min(80, math.sqrt(ACC_LATERAL_MAX / abs(command.steering)))
        v_x = 300

        self.accelerate(carstate, v_x, command)

        if self.data_logger:
            self.data_logger.log(carstate, command)

        fullData = np.delete(fullData, 0, axis=1)
        fullData = np.append(fullData, data.reshape((25,1)), axis=1)

        return command
Пример #15
0
 def drive(self, carstate: State) -> Command:
     # Interesting stuff
     command = Command()
     self.calc_steering(command)
     self.cal_acceleration(command,carstate)
     apply_force_field(carstate, command)
     self.epochCounter += 1
     self.append_data(command,carstate)
     self.check_save_data()
     print(carstate.distance_from_start)
     return command
Пример #16
0
    def drive(self, carstate: State):
        # https://github.com/lanquarden/pyScrcClient/blob/master/src/driver.py
        steer = (carstate.angle -
                 carstate.distance_from_center * 0.5) / self.steer_lock
        rpm = carstate.rpm
        gear = carstate.gear

        if self.prev_rpm is None:
            up = True
        else:
            if (self.prev_rpm - rpm) < 0:
                up = True
            else:
                up = False

        if up and rpm > 7000:
            gear += 1

        if not up and rpm < 3000:
            gear -= 1

        speed = carstate.speed_x
        accel = 1 if self.prev_accel is None else self.prev_accel

        if speed < self.max_speed:
            accel += 0.1
            if accel > 1:
                accel = 1.0
        else:
            accel -= 0.1
            if accel < 0:
                accel = 0.0

        command = Command()
        command.accelerator = accel
        command.steering = steer
        command.gear = gear

        self.prev_accel = command.accelerator

        return command
Пример #17
0
 def drive(self, carstate: State) -> Command:
     command = Command()
     current_state = state_to_vector(carstate)
     self.update_memory(current_state)
     state_sequence = self.get_state_sequence()
     command_vector = self.jesus.take_wheel(state_sequence)
     command = vector_to_command(command_vector)
     self.calc_gear(command, carstate)
     if self.epoch % 100 == 0:
         print(carstate.race_position)
     self.epoch += 1
     return command
Пример #18
0
 def drive(self, carstate: State) -> Command:
     command = Command()
     self.smooth_steer(carstate, 0.0, command)
     # ACC_LATERAL_MAX = 6400 * 5
     # v_x = min(80, math.sqrt(ACC_LATERAL_MAX / abs(command.steering)))
     v_x = 80
     self.accelerate(carstate, v_x, command)
     if self.epochCounter % 500 == 0:
         print(state_to_dict(carstate))
     self.epochCounter += 1
     self.append_data(command, carstate)
     return command
Пример #19
0
    def drive(self, carstate: State) -> Command:
        cmd = Command()
        self.model.predict(carstate)
        self.steer(carstate,cmd)

        # ACC_LATERAL_MAX = 6400 * 5
        # v_x = min(80, math.sqrt(ACC_LATERAL_MAX / abs(command.steering)))
        v_x = 80

        self.accelerate(carstate, v_x, cmd)

        if self.data_logger:
            self.data_logger.log(carstate, cmd)
        return cmd
Пример #20
0
    def runModel(self, carstate: State) -> Command:

        top_command = Command()

        if self.runStack(carstate, top_command, self.toplayers, 'TopLayers'):
            return top_command

        else:
            commands = []

            for i, model in enumerate(self.layers):
                command = Command()

                if not self.runStack(carstate, command, model,
                                     'model' + str(i + 1)):
                    print(
                        'Error!!! No layer applicable in model{}!!!!!'.format(
                            i + 1))

                commands.append(command)

            weight = self.oracle.activate(self.buildFeatures(carstate))
            #weight = sigmoid(weight)

            weights = [weight[0], 1.0 - weight[0]]

            print('ORACLE:', weights[0])

            N = 50
            s = ''
            for i in range(N):
                if i < int(weights[0] * N):
                    s += '0'
                else:
                    s += '1'
            print(s)

            command = Command()
            for i, w in enumerate(weight):
                command.accelerator = w * commands[i].accelerator * np.sign(
                    commands[i].gear)
                command.brake = w * commands[i].brake
                command.steering = w * commands[i].steering

            self.shift(carstate, command)

            return command
Пример #21
0
 def runModel(self, model, carstate: State) -> Command:
     command = Command()
 
     l = len(model) - 1
 
     while not model[l].applicable(carstate) and l >= 0:
         l -= 1
 
     if l < 0:
         print('Error!!! No layer applicable!!!!!')
     else:
         print('USING LAYER', l)
         model[l].step(carstate, command)
 
     return command
Пример #22
0
    def drive(self, carstate: State) -> Command:
        # # NN_MODEL
        # x_test = self.convert_carstate_to_array(carstate)
        # predicted = self.nn_model(Variable(torch.from_numpy(x_test))).data.numpy()
        #
        # command = Command()
        #
        # command.accelerator = predicted[0][0]
        # command.brake = predicted[0][1]
        # command.steering = predicted[0][2]
        #
        # # if carstate.rpm < 2500:
        # #     command.gear = carstate.gear - 1

        command = Command()
        command = self.reservoir_computing(carstate, command)

        if not command.gear:
            command.gear = carstate.gear or 1

        if carstate.rpm > 1500:
            command.gear = carstate.gear + 1

        return command
Пример #23
0
    def drive(self, carstate: State) -> Command:

        command = Command()

        self.steer(carstate, 0.0, command)

        ACC_LATERAL_MAX = 6400 * 5
        #v_x = min(120, math.sqrt(ACC_LATERAL_MAX / abs(command.steering)))
        v_x = 120

        self.accelerate(carstate, v_x, command)

        if self.data_logger:
            self.data_logger.log(carstate, command)

        return command
Пример #24
0
    def drive(self, car_state: State) -> Command:
        """
        Produces driving command in response to newly received car state.
        """
        self.last_state = car_state

        feature_vector = self.feature_transformer.transform(car_state)
        steering, brake, acceleration = self.network.activate(feature_vector)

        # print("steering", steering)
        # print("brake", brake)
        # print("acceleration", acceleration)

        command = Command()
        command.accelerator = acceleration
        command.brake = brake
        # push steering into a [-1, 1] range
        command.steering = (steering * 2) - 1

        if acceleration > 0:
            if car_state.rpm > 8000:
                command.gear = car_state.gear + 1

        if car_state.rpm < 2500 and car_state.gear > 2:
            command.gear = car_state.gear - 1

        if not command.gear:
            command.gear = car_state.gear or 1

        if self.data_logger:
            self.data_logger.log(car_state, command)

        if self.call_number % 100 == 0:
            print(command)
            print(car_state.distance_raced)
            print(self.stop_flag.value)
            print()

        # early stopping
        if self.call_number > 100 and car_state.distance_raced < 10:
            self.stop_flag.set(True)

        self.call_number += 1

        return command
Пример #25
0
    def get_gear(self, carstate):
        output = self.net.activate([carstate.rpm / 10000])

        # convert the outcome into a command
        command = Command()
        if (output[0] < -0.5):
            gear = carstate.gear - 1
        elif (output[0] > 0.5):
            gear = carstate.gear + 1
        else:
            gear = carstate.gear
        if gear < 1:
            gear = 1
        if gear > 6:
            gear = 6
        return gear
Пример #26
0
	def drive(self, carstate: State) -> Command:
		command = Command()
		speed_x = carstate.speed_x
		speed_y = carstate.speed_y
		speed_z = carstate.speed_z
		speed = math.sqrt(speed_x**2 + speed_y**2 + speed_z**2)
		track_position = carstate.distance_from_center
		angle = carstate.angle
		track_edges = carstate.distances_from_edge

		input_data = [speed, track_position, angle]
		for edge in track_edges:
			input_data.append(edge)

		input_data = np.reshape(input_data, (1, 22, 1))

		# output = self.model.predict(input_data)
		# output = self.dense_model.predict(input_data)
		# output = self.lstm_model.predict(input_data)

		acceleration = output[0][0]
		brake = output[0][1]
		steering = output[0][2]
		
		if acceleration > 0.5:
			brake = 0
		else:
			acceleration = 0
		
		if acceleration > 0:
			if carstate.rpm > 8000:
				command.gear = carstate.gear + 1

		if carstate.rpm < 2500:
			command.gear = carstate.gear - 1

		if not command.gear:
			command.gear = carstate.gear or 1

		command.accelerator = acceleration
		command.brake = brake 
		command.steering = steering

		return command
Пример #27
0
    def drive(self, carstate: State) -> Command:
        """
        Produces driving command in response to newly received car state.

        This is a dummy driving routine, very dumb and not really considering a
        lot of inputs. But it will get the car (if not disturbed by other
        drivers) successfully driven along the race track.
        """
        # f = open("Test_data3.txt","a+")
        # f.write("\n*** "+str(carstate)+"\n")

        command = Command()

        # constructing the input
        x_predict = [abs(carstate.speed_x)]
        x_predict.append(carstate.distance_from_center)
        x_predict.append(carstate.angle)
        [x_predict.append(i) for i in carstate.distances_from_edge]
        x_predict = np.array(x_predict)
        x_predict = x_predict.reshape(1, 22)

        x_predict = scaler.transform(x_predict)

        input_sensor = tf.convert_to_tensor(data_np, np.float32)

        # predicting the output
        y_predict = output, s_prev = predict_action(x_predict, s_prev, u_z,
                                                    w_z, u_r, w_r, u_h, w_h,
                                                    w_out)

        command.accelerator = y_predict[0][0]
        if command.accelerator < 0:
            command.brake = y_predict[0][1]
        command.steering = y_predict[0][2]

        if carstate.rpm < 2500 and carstate.gear > 0:
            command.gear = carstate.gear - 1
        elif carstate.rpm > 8000:
            command.gear = carstate.gear + 1

        if not command.gear:
            command.gear = carstate.gear or 1

        return command
    def drive(self, carstate: State) -> Command:
        """
        Produces driving command in response to newly received car state.

        This is a dummy driving routine, very dumb and not really considering a
        lot of inputs. But it will get the car (if not disturbed by other
        drivers) successfully driven along the race track.
        """
        print('Drive')
        input = carstate.to_input_array()

        self.distance = carstate.distance_raced
        if self.curr_time > carstate.current_lap_time:
            self.time += carstate.last_lap_time

        self.curr_time = carstate.current_lap_time

        try:
            output = self.model.step(input)

            for i in range(len(output)):
                output[i] = max(0, output[i])

            print('Out = ' + str(output))

            command = Command()

            self.accelerate(output[0], output[1], carstate, command)
            self.steer(output[2], output[3], carstate, command)

            # self.steer(carstate, 0.0, command)
            #
            # v_x = min(output[0], 300)
            #
            # self.accelerate(carstate, v_x, command)

        except OverflowError as err:
            print('--------- OVERFLOW! ---------')
            self.saveResults()
            raise err

        if self.data_logger:
            self.data_logger.log(carstate, command)

        return command
Пример #29
0
    def drive(self, carstate: State) -> Command:

        command = Command()

        if self.offTrack(carstate) == False:
            current_state = state_to_vector(carstate)
            command_vector = self.jesus.take_wheel(current_state)
            command = vector_to_command(command_vector)
            self.calc_gear(command, carstate)
            self.epoch += 1

        elif self.offTrack(carstate) == True:
            print('Offtrack')

            # Car points towards track center and is on LHS of track
            if carstate.angle * carstate.distance_from_center > 0 and carstate.distance_from_center > 1:
                self.steering = -carstate.angle
                self.gear = 1
                self.brake = 0
                self.accelerate = 0.5

            # Car points towards track center and is on RHS of track
            if carstate.angle * carstate.distance_from_center > 0 and carstate.distance_from_center < -1:
                self.steering = -carstate.angle
                self.gear = 1
                self.brake = 0
                self.accelerate = 0.5

            # Car points outwards and is on LHS of track
            if carstate.angle * carstate.distance_from_center < 0 and carstate.distance_from_center > 1:
                self.steering = -carstate.angle
                self.gear = -1
                self.brake = 0
                self.accelerate = 0.5

            # Car points outwards and is on RHS of track
            if carstate.angle * carstate.distance_from_center < 0 and carstate.distance_from_center < -1:
                self.steering = -carstate.angle
                self.gear = -1
                self.brake = 0
                self.accelerate = 0.5

        print(command)
        return command
Пример #30
0
    def step(self, carstate: State, command: Command):

        command.accelerator = 1
        command.brake = 0
        command.gear = carstate.gear

        if command.gear >= 0 and carstate.rpm > 8000:
            command.gear = min(6, command.gear + 1)

        if carstate.rpm < 2500 and command.gear > 1:
            command.gear = command.gear - 1

        if not command.gear:
            command.gear = carstate.gear or 1
Пример #31
0
	def drive(self, carstate: State) -> Command:
		# threading.Thread(target=c.communicate, args=(carstate, "communication.csv")).start()
		command = Command()
		
		speed_x = carstate.speed_x
		speed_y = carstate.speed_y
		speed_z = carstate.speed_z
		speed = math.sqrt(speed_x**2 + speed_y**2 + speed_z**2)

		track_position = carstate.distance_from_center
		
		angle = carstate.angle
		
		track_edges = carstate.distances_from_edge

		input_data = [speed, track_position, angle]
		for edge in track_edges:
			input_data.append(edge)

		opponents = carstate.opponents
		for i in range(0, len(opponents), 9):
			if not i == 27:
				input_data.append(opponents[i])

		input_data = np.reshape(input_data, (1,len(input_data)))

		# output = self.model.predict(input_data)
		# output = self.alt_model.predict(input_data)
		output = self.opponents_model.predict(input_data)

		acceleration = output[0][0]
		brake = output[0][1]
		steering = output[0][2]
		
		if acceleration > 0:
			if carstate.rpm > 8000:
				command.gear = carstate.gear + 1

		if carstate.rpm < 2500:
			command.gear = carstate.gear - 1

		if not command.gear:
			command.gear = carstate.gear or 1

		if track_edges[9] < 130.0 and track_edges[9] > 80.0:
			if speed > 40:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 60 and track_edges[9] > 40:
			if speed > 25:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 40:
			if speed > 15:
				acceleration = 0
				brake = 0.05

		command.accelerator = acceleration
		command.brake = brake 
		command.steering = steering
		
		return command
Пример #32
0
	def drive(self, carstate: State) -> Command:
		command = Command()
		
		speed_x = carstate.speed_x
		speed_y = carstate.speed_y
		speed_z = carstate.speed_z
		speed = math.sqrt(speed_x**2 + speed_y**2 + speed_z**2)
		distance = carstate.distance_from_start
		distance_raced = carstate.distance_raced
		#print("Raced")
		#print(distance_raced)
		#print(distance)
		curlaptime = carstate.current_lap_time
		lastlaptime = carstate.last_lap_time
		time = curlaptime + lastlaptime
		#print(lastlaptime)
		#print(time)
		track_position = carstate.distance_from_center
		
		angle = carstate.angle
		
		track_edges = carstate.distances_from_edge

		input_data = [speed, track_position, angle]
		for edge in track_edges:
			input_data.append(edge)
		input_data = np.reshape(input_data, (1,22))

		output = self.alt_model.predict(input_data)
		#output = self.alt_model.activate(input_data)
		#print(output)
		acceleration = output[0][0]
		brake = output[0][1]
		steering = output[0][2]
		
		if acceleration > 0:
			if carstate.rpm > 8000:
				command.gear = carstate.gear + 1

		if carstate.rpm < 2500:
			command.gear = carstate.gear - 1

		if not command.gear:
			command.gear = carstate.gear or 1

		if track_edges[9] < 130.0 and track_edges[9] > 80.0:
			if speed > 40:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 60 and track_edges[9] > 40:
			if speed > 25:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 40:
			if speed > 15:
				acceleration = 0
				brake = 0.05

		command.accelerator = acceleration
		command.brake = brake 
		command.steering = steering

		if time > 5 and distance_raced > 15 and distance > 15:
			fitness = (distance*distance)/(time*1000.)
		else:
			fitness = 0
		#print(distance)
		#print(fitness)

		if abs(angle) >= 90:
			print("Stop") 
			print(fitness)
			pickle.dump(fitness, open("fitness.p","wb"))
			pyautogui.press("esc")
			pyautogui.press("enter")
			exit(0)
		elif time > 5 and speed < 2:
			print("Stop") 
			print(fitness)
			pickle.dump(fitness, open("fitness.p","wb"))				
			pyautogui.press("esc")
			pyautogui.press("enter")
			exit(0)
		elif time > 500:
			print("Stop")
			print(fitness)
			pickle.dump(fitness, open("fitness.p","wb"))
			pyautogui.press("esc")
			pyautogui.press("enter")
			exit(0)

		#print(track_edges[9])
		#print(command)

		return command
Пример #33
0
	def drive(self, carstate: State) -> Command:
		command = Command()
		
		speed_x = carstate.speed_x
		speed_y = carstate.speed_y
		speed_z = carstate.speed_z
		speed = math.sqrt(speed_x**2 + speed_y**2 + speed_z**2)
		distance = carstate.distance_from_start
		distance_raced = carstate.distance_raced
		curlaptime = carstate.current_lap_time
		lastlaptime = carstate.last_lap_time
		time =  curlaptime
		track_position = carstate.distance_from_center
		
		angle = carstate.angle
		
		track_edges = carstate.distances_from_edge

		input_data = [speed, track_position, angle]
		for edge in track_edges:
			input_data.append(edge)

		opponents = carstate.opponents
		for i in range(9, len(opponents), 9):
			input_data.append(opponents[i])

		input_data = np.reshape(input_data, (1,len(input_data)))

		output = self.alt_model.predict(input_data)

		acceleration = output[0][0]
		brake = output[0][1]
		steering = output[0][2]
		



		if acceleration > 0:
			if carstate.rpm > 8000:
				command.gear = carstate.gear + 1

		if carstate.rpm < 2500:
			command.gear = carstate.gear - 1

		if not command.gear:
			command.gear = carstate.gear or 1

		if track_edges[9] < 130.0 and track_edges[9] > 80.0:
			if speed > 40:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 80 and track_edges[9] > 40:
			if speed > 25:
				acceleration = 0
				brake = 0.05
		elif track_edges[9] < 40:
			if speed > 15:
				acceleration = 0
				brake = 0.05
		if speed > 30:
			acceleration = 0
			brake = 0.05

		command.accelerator = acceleration
		command.brake = brake 
		command.steering = steering

		# To train:
		#if time > 6 and distance_raced > 80 and distance > 20:
		#	if lastlaptime < 2:
		#		fitness = (distance*distance)/(time*1000.)
		#	else:
		#		fitness = 200
		#		print("Stop") 
		#		print(fitness)
		#		fi = open("fitness.p","wb")
		#		pickle.dump(fitness, fi)
		#		fi.close()				
		#		pyautogui.press("esc")
		#		pyautogui.press("down")
		#		pyautogui.press("enter")
		#		pyautogui.press("down")
		#		pyautogui.press("enter")
		#		pyautogui.press("right")
		#		pyautogui.press("enter")
		#		pyautogui.press("enter")
		#		pyautogui.press("enter")
		#		pyautogui.press("up")
		#		pyautogui.press("enter")
		#		exit(0)
		#else:
		#	fitness = 0
		#print(distance)
		#print(fitness)

		#if abs(angle) >= 80:
		#	print("Stop") 
		#	print(fitness)
		#	fi = open("fitness.p","wb")
		#	pickle.dump(fitness, fi)
		#	fi.close()
		#	pyautogui.press("esc")
		#	pyautogui.press("enter")
		#	exit(0)
		#elif time > 5 and speed < 2:
		#	print("Stop") 
		#	print(fitness)
		#	fi = open("fitness.p","wb")
		#	pickle.dump(fitness, fi)
		#	fi.close()				
		#	pyautogui.press("esc")
		#	pyautogui.press("enter")
		#	exit(0)
		#elif time > 400:
		#	print("Stop2")
		#	print(fitness)
		#	fitness = 250
		#	fi = open("fitness.p","wb")
		#	pickle.dump(fitness, fi)
		#	fi.close()
		#	pyautogui.press("esc")
		#	pyautogui.press("enter")
		#	exit(0)

		#print(track_edges[9])
		#print(command)

		return command