Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

206 lines
6.9KB

  1. #!/usr/bin/env python2
  2. #######################################################################
  3. # Aufgabe 1 #
  4. #######################################################################
  5. import pygame
  6. import math
  7. import argparse, sys
  8. #import servo_ctrl,
  9. from iot_car import Iot_car
  10. width = 400
  11. height = 200
  12. freq = 50 # Sets the frequency of input procession
  13. delta = 1.0 / freq # time per step
  14. frict = -1 # max friction
  15. mouse_ctrl = False
  16. v_step = True # Stufenweises regel der Beschlunigung in beide Richtungen
  17. m_step = True
  18. # vars for testmode
  19. is_testmode_enabled = True
  20. testmode_vars = {'is_servo_active': False}
  21. # vars for car
  22. motor = None
  23. streeting = None
  24. # start main pygame event processing loop here
  25. pygame.display.init()
  26. # set up the pygame screen enviroment
  27. screen = pygame.display.set_mode((width, height))
  28. # get a clock to generate frequent behaviour
  29. clock = pygame.time.Clock()
  30. # States of the keys
  31. keystates = {
  32. 'quit': False,
  33. 'accelerate': False,
  34. 'decelerate': False,
  35. 'reset': False,
  36. 'accelerate_angle_right': False,
  37. 'accelerate_angle_left': False,
  38. 'acceleration_mouse': False,
  39. 'mouse_ctrl': False,
  40. }
  41. running = True
  42. # Functions for exercises
  43. def toggle_mouse_ctrl():
  44. global mouse_ctrl
  45. mouse_ctrl= not mouse_ctrl
  46. def mouse_ctrl_calc_velocity(pos):
  47. global height
  48. V_MAX = 11
  49. x, y = pos
  50. rel_y = y - (height/2)
  51. return -1 * (rel_y / (height/2.0)) * V_MAX
  52. def mouse_ctrl_calc_angle(pos):
  53. global width
  54. ANGLE_MAX = 45
  55. x, y = pos
  56. rel_x = x - (width/2.0)
  57. return (rel_x / (width/2)) * ANGLE_MAX
  58. if __name__ == "__main__":
  59. parser = argparse.ArgumentParser(description='IoT Lab script')
  60. parser.add_argument('--notest', action='store_true', default=False)
  61. args = parser.parse_args()
  62. if not args.notest:
  63. print "Running in testmode."
  64. car = Iot_car(testmode= not args.notest)
  65. try:
  66. while running:
  67. # set clock frequency
  68. clock.tick(freq);
  69. # process input events
  70. for event in pygame.event.get():
  71. # exit on quit
  72. if event.type == pygame.QUIT:
  73. running = False
  74. # check for key down events (press)
  75. if event.type == pygame.KEYDOWN:
  76. if event.key == pygame.K_q:
  77. keystates['quit'] = True
  78. elif event.key == pygame.K_w:
  79. keystates['accelerate'] = True
  80. elif event.key == pygame.K_s:
  81. keystates['decelerate'] = True
  82. elif event.key == pygame.K_d:
  83. keystates['accelerate_angle_right'] = True
  84. elif event.key == pygame.K_a:
  85. keystates['accelerate_angle_left'] = True
  86. elif event.key == pygame.K_m:
  87. keystates['mouse_ctrl'] = True
  88. elif event.key == pygame.K_r:
  89. keystates['reset'] = True
  90. # check for key up events (release)
  91. if event.type == pygame.KEYUP:
  92. if event.key == pygame.K_q:
  93. keystates['quit'] = False
  94. elif event.key == pygame.K_w:
  95. v_step = True
  96. car.is_testmode_servo_active = False
  97. keystates['accelerate'] = False
  98. elif event.key == pygame.K_s:
  99. v_step = True
  100. car.is_testmode_servo_active = False
  101. keystates['decelerate'] = False
  102. elif event.key == pygame.K_d:
  103. keystates['accelerate_angle_right'] = False
  104. elif event.key == pygame.K_a:
  105. keystates['accelerate_angle_left'] = False
  106. elif event.key == pygame.K_m:
  107. keystates['mouse_ctrl'] = False
  108. m_step = True
  109. elif event.key == pygame.K_r:
  110. v_step = True
  111. keystates['reset'] = False
  112. if event.type == pygame.MOUSEBUTTONDOWN:
  113. # linke maustaste
  114. if event.button == 1:
  115. car.is_testmode_servo_active = True
  116. keystates['acceleration_mouse'] = True
  117. if event.type == pygame.MOUSEBUTTONUP:
  118. if event.button == 1:
  119. car.is_testmode_servo_active = False
  120. keystates['acceleration_mouse'] = False
  121. # do something about the key states here, now that the event queue has been processed
  122. if keystates['quit']:
  123. running = False
  124. if keystates['reset']:
  125. # reset
  126. car.stop()
  127. mouse_ctrl = False
  128. if keystates['mouse_ctrl'] and m_step:
  129. # beim umstellen zur maus steuerung und geschw. zuruecksetzen
  130. car.stop()
  131. toggle_mouse_ctrl()
  132. m_step = False
  133. print "Is mouse control enabled?: " + str(mouse_ctrl)
  134. # Calculate valeues for control types
  135. # MOUSE
  136. if mouse_ctrl:
  137. pos = pygame.mouse.get_pos()
  138. angle_cur = mouse_ctrl_calc_angle(pos)
  139. car.set_angle(mouse_ctrl_calc_angle(pos))
  140. if keystates['acceleration_mouse']:
  141. speed_cur = mouse_ctrl_calc_velocity(pos)
  142. car.accelerate(speed=speed_cur, direct=True)
  143. # Keyboard
  144. else:
  145. if keystates['accelerate']: # and v_step:
  146. # Beschleunigen
  147. v_step = False
  148. car.accelerate(speed=11)
  149. if keystates['decelerate']: # and v_step:
  150. # abbremsen
  151. car.accelerate(speed=-11)
  152. if keystates['accelerate_angle_right']:
  153. car.streeting_right()
  154. if keystates['accelerate_angle_left']:
  155. car.streeting_left()
  156. if not keystates['accelerate_angle_left'] and not keystates['accelerate_angle_right']:
  157. car.reset_streeting()
  158. print("({},{} --> {})".format(car.speed_cur, car.angle_cur, (car.speed_cur - car.speed_last) / delta)) + ", Servo_active: " + str(car.is_testmode_servo_active)
  159. car.symulate()
  160. except KeyboardInterrupt:
  161. print "Exiting through keyboard event (CTRL + C)"
  162. # gracefully exit pygame here
  163. pygame.quit()