Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

144 lines
4.6KB

  1. import math
  2. def calculate_acceleration(speed, acc, V_MAX=11):
  3. sigma = 2.5
  4. mu = V_MAX / 2
  5. return acc * (1 - 0.5 * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2))))))
  6. def calculate_friction(speed, f, V_MAX=11):
  7. # TODO hier stimmt was nicht
  8. sigma = 4
  9. mu = V_MAX / 2
  10. return (f/2) * (1 + (math.erf((abs(speed) - mu) / (math.sqrt(2 * sigma**2)))))
  11. class Iot_car():
  12. V_MAX = 11 #m/s
  13. A_MAX = 45 # degree
  14. acc = 2.6 # Max acceleration of the car (per sec.)
  15. dec = 4.5 # Max deceleration of the car (per sec.)
  16. frict = -1 # max friction
  17. angle_acc = 300 # max change of angle (per sec.)
  18. is_testmode_activated = True
  19. is_testmode_servo_active = False
  20. speed_cur = 0
  21. speed_last = 0
  22. angle_cur = 0
  23. speed_cruise_control = 0 # m/s but only positive
  24. motor = None
  25. streeting = None
  26. def __init__(self, testmode=True):
  27. self.is_testmode_activated = testmode
  28. if not testmode:
  29. import servo_ctrl
  30. self.motor = Motor(1)
  31. self.streeting = Steering(2)
  32. # for keyboard control
  33. def __testmode_accelerate(self):
  34. calc_acc = calculate_acceleration(self.speed_cur, self.acc)
  35. self.speed_last = self.speed_cur
  36. self.speed_cur = min(self.V_MAX, self.speed_cur + calc_acc)
  37. self.is_testmode_servo_active = True
  38. def __testmode_decelerate(self):
  39. calc_dec = calculate_acceleration(self.speed_cur, self.dec)
  40. self.speed_last = self.speed_cur
  41. self.speed_cur = max(-1 * self.V_MAX, self.speed_cur - calc_dec)
  42. self.is_testmode_servo_active = True
  43. def __accelerate(self, speed):
  44. self.speed_last = self.speed_cur
  45. self.speed_cur = speed
  46. self.motor.set_speed(speed)
  47. def accelerate(self, speed=0, direct=False):
  48. if direct and self.is_testmode_activated: # Mouse testmode
  49. self.last = self.speed_cur
  50. self.speed_cur = speed
  51. elif self.is_testmode_activated:
  52. if speed > 0:
  53. self.__testmode_accelerate()
  54. elif speed < 0:
  55. self.__testmode_decelerate()
  56. else:
  57. self.__accelerate(speed)
  58. # for wii remote
  59. def cruise_control_increase(self):
  60. s = min(self.V_MAX, self.speed_cruise_control + 2.75)
  61. if s < 0:
  62. self.speed_cruise_control = 0
  63. else:
  64. self.speed_cruise_control = s
  65. def cruise_control_decrease(self):
  66. s = min(self.V_MAX, self.speed_cruise_control - 2.75)
  67. if s < 0:
  68. self.speed_cruise_control = 0
  69. else:
  70. self.speed_cruise_control = s
  71. def def cruise_control_reset(self):
  72. self.speed_cruise_control = 0
  73. def activate_cruise_control_forward(self):
  74. self.speed_last = self.speed_cur
  75. self.speed_cur = self.speed_cruise_control
  76. self.is_testmode_servo_active = True
  77. if not is_testmode_activated:
  78. self.__accelerate(self.speed_cruise_control)
  79. def activate_cruise_control_backward(self):
  80. self.speed_last = self.speed_cur
  81. self.speed_cur = -1 * self.speed_cruise_control
  82. self.is_testmode_servo_active = True
  83. if not is_testmode_activated:
  84. self.__accelerate(-1 * self.speed_cruise_control)
  85. def deactivate_cruise_control(self):
  86. self.speed_last = self.speed_cur
  87. self.speed_cur = 0
  88. self.is_testmode_servo_active = False
  89. if not is_testmode_activated:
  90. self.__accelerate(0)
  91. def reset_streeting(self):
  92. self.set_angle(0)
  93. def streeting_right(self, angle=0):
  94. if angle > 0:
  95. a = angle
  96. else:
  97. a = min(self.A_MAX, self.angle_cur + self.angle_acc)
  98. self.set_angle(a)
  99. def streeting_left(self, angle=0):
  100. if angle < 0:
  101. a = angle
  102. else:
  103. a = max(-1 * self.A_MAX, self.angle_cur - self.angle_acc)
  104. self.set_angle(a)
  105. def set_angle(self, angle):
  106. self.angle_cur = angle
  107. if not self.is_testmode_activated:
  108. self.streeting.set_angle(angle)
  109. def stop(self):
  110. self.speed_last = self.speed_cur
  111. self.speed_cur = 0
  112. self.angle_cur = 0
  113. def symulate(self):
  114. if self.is_testmode_activated:
  115. if not self.is_testmode_servo_active:
  116. self.speed_last = self.speed_cur
  117. self.speed_cur = min(0, self.speed_cur - calculate_friction(self.speed_cur, self.frict))