|
- #!/usr/bin/env python2
-
- #######################################################################
- # Aufgabe 1 #
- #######################################################################
-
- import pygame
- import math
- import argparse, sys
-
- #import servo_ctrl,
- from iot_car import Iot_car
-
- width = 400
- height = 200
-
- freq = 50 # Sets the frequency of input procession
- delta = 1.0 / freq # time per step
- frict = -1 # max friction
-
- mouse_ctrl = False
-
- v_step = True # Stufenweises regel der Beschlunigung in beide Richtungen
- m_step = True
-
- # vars for testmode
- is_testmode_enabled = True
- testmode_vars = {'is_servo_active': False}
-
- # vars for car
- motor = None
- streeting = None
-
-
- # start main pygame event processing loop here
- pygame.display.init()
-
- # set up the pygame screen enviroment
- screen = pygame.display.set_mode((width, height))
-
- # get a clock to generate frequent behaviour
- clock = pygame.time.Clock()
-
-
- # States of the keys
- keystates = {
- 'quit': False,
- 'accelerate': False,
- 'decelerate': False,
- 'reset': False,
- 'accelerate_angle_right': False,
- 'accelerate_angle_left': False,
- 'acceleration_mouse': False,
- 'mouse_ctrl': False,
- }
-
- running = True
-
- # Functions for exercises
-
- def toggle_mouse_ctrl():
- global mouse_ctrl
- mouse_ctrl= not mouse_ctrl
-
- def mouse_ctrl_calc_velocity(pos):
- global height
- V_MAX = 11
- x, y = pos
- rel_y = y - (height/2)
- return -1 * (rel_y / (height/2.0)) * V_MAX
-
- def mouse_ctrl_calc_angle(pos):
- global width
- ANGLE_MAX = 45
- x, y = pos
- rel_x = x - (width/2.0)
- return (rel_x / (width/2)) * ANGLE_MAX
-
- if __name__ == "__main__":
-
- parser = argparse.ArgumentParser(description='IoT Lab script')
- parser.add_argument('--notest', action='store_true', default=False)
- args = parser.parse_args()
- if not args.notest:
- print "Running in testmode."
-
- car = Iot_car(testmode= not args.notest)
-
- try:
- while running:
- # set clock frequency
- clock.tick(freq);
-
- # process input events
- for event in pygame.event.get():
-
- # exit on quit
- if event.type == pygame.QUIT:
- running = False
-
- # check for key down events (press)
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_q:
- keystates['quit'] = True
- elif event.key == pygame.K_w:
- keystates['accelerate'] = True
- elif event.key == pygame.K_s:
- keystates['decelerate'] = True
- elif event.key == pygame.K_d:
- keystates['accelerate_angle_right'] = True
- elif event.key == pygame.K_a:
- keystates['accelerate_angle_left'] = True
- elif event.key == pygame.K_m:
- keystates['mouse_ctrl'] = True
- elif event.key == pygame.K_r:
- keystates['reset'] = True
-
- # check for key up events (release)
- if event.type == pygame.KEYUP:
- if event.key == pygame.K_q:
- keystates['quit'] = False
- elif event.key == pygame.K_w:
- v_step = True
- car.is_testmode_servo_active = False
- keystates['accelerate'] = False
- elif event.key == pygame.K_s:
- v_step = True
- car.is_testmode_servo_active = False
- keystates['decelerate'] = False
- elif event.key == pygame.K_d:
- keystates['accelerate_angle_right'] = False
- elif event.key == pygame.K_a:
- keystates['accelerate_angle_left'] = False
- elif event.key == pygame.K_m:
- keystates['mouse_ctrl'] = False
- m_step = True
- elif event.key == pygame.K_r:
- v_step = True
- keystates['reset'] = False
-
- if event.type == pygame.MOUSEBUTTONDOWN:
- # linke maustaste
- if event.button == 1:
- car.is_testmode_servo_active = True
- keystates['acceleration_mouse'] = True
-
- if event.type == pygame.MOUSEBUTTONUP:
- if event.button == 1:
- car.is_testmode_servo_active = False
- keystates['acceleration_mouse'] = False
-
-
- # do something about the key states here, now that the event queue has been processed
- if keystates['quit']:
- running = False
- if keystates['reset']:
- # reset
- car.stop()
- mouse_ctrl = False
- if keystates['mouse_ctrl'] and m_step:
- # beim umstellen zur maus steuerung und geschw. zuruecksetzen
- car.stop()
- toggle_mouse_ctrl()
- m_step = False
- print "Is mouse control enabled?: " + str(mouse_ctrl)
-
-
-
-
- # Calculate valeues for control types
-
- # MOUSE
- if mouse_ctrl:
- pos = pygame.mouse.get_pos()
- angle_cur = mouse_ctrl_calc_angle(pos)
- car.set_angle(mouse_ctrl_calc_angle(pos))
- if keystates['acceleration_mouse']:
- speed_cur = mouse_ctrl_calc_velocity(pos)
- car.accelerate(speed=speed_cur, direct=True)
-
- # Keyboard
- else:
- if keystates['accelerate']: # and v_step:
- # Beschleunigen
- v_step = False
- car.accelerate(speed=11)
- if keystates['decelerate']: # and v_step:
- # abbremsen
- car.accelerate(speed=-11)
- if keystates['accelerate_angle_right']:
- car.streeting_right()
- if keystates['accelerate_angle_left']:
- car.streeting_left()
- if not keystates['accelerate_angle_left'] and not keystates['accelerate_angle_right']:
- car.reset_streeting()
-
- print("({},{} --> {})".format(car.speed_cur, car.angle_cur, (car.speed_cur - car.speed_last) / delta)) + ", Servo_active: " + str(car.is_testmode_servo_active)
-
- car.symulate()
-
- except KeyboardInterrupt:
- print "Exiting through keyboard event (CTRL + C)"
-
- # gracefully exit pygame here
- pygame.quit()
|