def no_keys(): if random.randrange(0, 3) == 1: PressKey(W) else: ReleaseKey(W) ReleaseKey(A) ReleaseKey(S) ReleaseKey(D)
def reverse_left(): PressKey(S) PressKey(A) ReleaseKey(W) ReleaseKey(D)
def forward_right(): PressKey(W) PressKey(D) ReleaseKey(A) ReleaseKey(S)
def forward_left(): PressKey(W) PressKey(A) ReleaseKey(D) ReleaseKey(S)
def reverse(): PressKey(S) ReleaseKey(A) ReleaseKey(W) ReleaseKey(D)
def right(): ReleaseKey(W) PressKey(D) ReleaseKey(A) ReleaseKey(S)
def left(): ReleaseKey(W) PressKey(A) ReleaseKey(S) ReleaseKey(D)
def straight(): PressKey(W) ReleaseKey(A) ReleaseKey(D) ReleaseKey(S)
def main(): for i in list(range(4))[::-1]: print(i + 1) time.sleep(1) paused = False mode_choice = 0 screen = grab_screen(region=(0, 40, GAME_WIDTH, GAME_HEIGHT + 40)) screen = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) prev = cv2.resize(screen, (WIDTH, HEIGHT)) t_minus = prev t_now = prev t_plus = prev while (True): if not paused: # 800x600 windowed model screen = grab_screen(region=(0, 40, GAME_WIDTH, GAME_HEIGHT)) # resize to something a bit more acceptable for a CNN screen = cv2.resize(screen, (WIDTH, HEIGHT)) # run a color convert: screen = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) last_time = time.time() delta_count_last = motion_detection(t_minus, t_now, t_plus, screen) t_minus = t_now t_now = t_plus t_plus = screen t_plus = cv2.blur(t_plus, (4, 4)) screen = screen / 255.0 prediction = model.predict([screen.reshape(-1, HEIGHT, WIDTH, 3)]) prediction = np.array(prediction) * np.array( [1.0, 1.0, 0.5, 0.75, 0.5, 0.75, 1.0, 1.0, 1.0]) print('prediction: {}'.format(prediction)) mode_choice = np.argmax(prediction) if mode_choice == 0: straight() choice_picked = 'straight' elif mode_choice == 1: reverse() choice_picked = 'reverse' elif mode_choice == 2: left() choice_picked = 'left' elif mode_choice == 3: right() choice_picked = 'right' elif mode_choice == 4: forward_left() choice_picked = 'forward+left' elif mode_choice == 5: forward_right() choice_picked = 'forward+right' elif mode_choice == 6: reverse_left() choice_picked = 'reverse+left' elif mode_choice == 7: reverse_right() choice_picked = 'reverse+right' elif mode_choice == 8: no_keys() choice_picked = 'nokeys' motion_log.append(delta_count_last) motion_avg = round(mean(motion_log), 3) print('loop took {} seconds. Motion: {}. Choice: {}'.format( round(time.time() - last_time, 3), motion_avg, choice_picked)) # Get video stream for object detection screen = grab_screen(region=(40, 100, 800, 450)) image_np = cv2.cvtColor(screen, cv2.COLOR_BGR2RGB) # Detect objects on video stream last_time = time.time() input_tensor = tf.convert_to_tensor(np.expand_dims(image_np, 0), dtype=tf.float32) detections, predictions_dict, shapes = detect_fn( detection_model, input_tensor) # print('Object detection inference time: {}'.format(time.time() - last_time)) # Estimate distance and collision risk from detected objects collision, distance = get_distance(detections) print('Collision: {} - Distance: {}\n'.format(collision, distance)) # If vehicle is stucked, start some evasive maneuvers if motion_avg < motion_req and len(motion_log) >= log_len: print( 'WERE PROBABLY STUCK FFS, initiating some evasive maneuvers.' ) # 0 = reverse straight, turn left out # 1 = reverse straight, turn right out # 2 = reverse left, turn right out # 3 = reverse right, turn left out quick_choice = random.randrange(0, 4) if quick_choice == 0: reverse() time.sleep(random.uniform(1, 2)) forward_left() time.sleep(random.uniform(1, 2)) elif quick_choice == 1: reverse() time.sleep(random.uniform(1, 2)) forward_right() time.sleep(random.uniform(1, 2)) elif quick_choice == 2: reverse_left() time.sleep(random.uniform(1, 2)) forward_right() time.sleep(random.uniform(1, 2)) elif quick_choice == 3: reverse_right() time.sleep(random.uniform(1, 2)) forward_left() time.sleep(random.uniform(1, 2)) for i in range(log_len - 2): del motion_log[0] # If collision risk, try to avoid it if collision: print('Collision Warning. Starting evasive maneuvers: ', end='') reverse() time.sleep(random.uniform(0, 2)) else: pass keys = key_check() # Press 'T' to pause execution of script if 'T' in keys: if paused: paused = False time.sleep(1) else: paused = True print('\n\nPAUSED\n\n') ReleaseKey(A) ReleaseKey(W) ReleaseKey(D) time.sleep(1)
def reverse_right(): PressKey(S) PressKey(D) ReleaseKey(W) ReleaseKey(A)