You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 line
3.1KB

  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. motor = None
  24. streeting = None
  25. def __init__(self, testmode=True):
  26. self.is_testmode_activated = testmode
  27. if not testmode:
  28. import servo_ctrl
  29. self.motor = Motor(1)
  30. self.streeting = Steering(2)
  31. def __testmode_accelerate(self):
  32. calc_acc = calculate_acceleration(self.speed_cur, self.acc)
  33. self.speed_last = self.speed_cur
  34. self.speed_cur = min(self.V_MAX, self.speed_cur + calc_acc)
  35. self.is_testmode_servo_active = True
  36. def __testmode_decelerate(self):
  37. calc_dec = calculate_acceleration(self.speed_cur, self.dec)
  38. self.speed_last = self.speed_cur
  39. self.speed_cur = max(-1 * self.V_MAX, self.speed_cur - calc_dec)
  40. self.is_testmode_servo_active = True
  41. def __accelerate(self, speed):
  42. self.speed_last = self.speed_cur
  43. self.speed_cur = speed
  44. self.motor.set_speed(speed)
  45. def accelerate(self, speed=0, direct=False):
  46. if direct and self.is_testmode_activated: # Mouse testmode
  47. self.last = self.speed_cur
  48. self.speed_cur = speed
  49. elif self.is_testmode_activated:
  50. if speed > 0:
  51. self.__testmode_accelerate()
  52. elif speed < 0:
  53. self.__testmode_decelerate()
  54. else:
  55. self.__accelerate(speed)
  56. def reset_streeting(self):
  57. self.set_angle(0)
  58. def streeting_right(self, angle=0):
  59. if angle > 0:
  60. a = angle
  61. else:
  62. a = min(self.A_MAX, self.angle_cur + self.angle_acc)
  63. self.set_angle(a)
  64. def streeting_left(self, angle=0):
  65. if angle < 0:
  66. a = angle
  67. else:
  68. a = max(-1 * self.A_MAX, self.angle_cur - self.angle_acc)
  69. self.set_angle(a)
  70. def set_angle(self, angle):
  71. self.angle_cur = angle
  72. if not self.is_testmode_activated:
  73. self.streeting.set_angle(angle)
  74. def stop(self):
  75. self.speed_cur = 0
  76. self.angle_cur = 0
  77. def symulate(self):
  78. if self.is_testmode_activated:
  79. if not self.is_testmode_servo_active:
  80. self.speed_last = self.speed_cur
  81. self.speed_cur = min(0, self.speed_cur - calculate_friction(self.speed_cur, self.frict))