maneuver.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import numpy as np
  2. from selfdrive.test.longitudinal_maneuvers.plant import Plant
  3. class Maneuver:
  4. def __init__(self, title, duration, **kwargs):
  5. # Was tempted to make a builder class
  6. self.distance_lead = kwargs.get("initial_distance_lead", 200.0)
  7. self.speed = kwargs.get("initial_speed", 0.0)
  8. self.lead_relevancy = kwargs.get("lead_relevancy", 0)
  9. self.breakpoints = kwargs.get("breakpoints", [0.0, duration])
  10. self.speed_lead_values = kwargs.get("speed_lead_values", [0.0 for i in range(len(self.breakpoints))])
  11. self.prob_lead_values = kwargs.get("prob_lead_values", [1.0 for i in range(len(self.breakpoints))])
  12. self.cruise_values = kwargs.get("cruise_values", [50.0 for i in range(len(self.breakpoints))])
  13. self.only_lead2 = kwargs.get("only_lead2", False)
  14. self.only_radar = kwargs.get("only_radar", False)
  15. self.ensure_start = kwargs.get("ensure_start", False)
  16. self.enabled = kwargs.get("enabled", True)
  17. self.e2e = kwargs.get("e2e", False)
  18. self.duration = duration
  19. self.title = title
  20. def evaluate(self):
  21. plant = Plant(
  22. lead_relevancy=self.lead_relevancy,
  23. speed=self.speed,
  24. distance_lead=self.distance_lead,
  25. enabled=self.enabled,
  26. only_lead2=self.only_lead2,
  27. only_radar=self.only_radar,
  28. e2e=self.e2e,
  29. )
  30. valid = True
  31. logs = []
  32. while plant.current_time < self.duration:
  33. speed_lead = np.interp(plant.current_time, self.breakpoints, self.speed_lead_values)
  34. prob = np.interp(plant.current_time, self.breakpoints, self.prob_lead_values)
  35. cruise = np.interp(plant.current_time, self.breakpoints, self.cruise_values)
  36. log = plant.step(speed_lead, prob, cruise)
  37. d_rel = log['distance_lead'] - log['distance'] if self.lead_relevancy else 200.
  38. v_rel = speed_lead - log['speed'] if self.lead_relevancy else 0.
  39. log['d_rel'] = d_rel
  40. log['v_rel'] = v_rel
  41. logs.append(np.array([plant.current_time,
  42. log['distance'],
  43. log['distance_lead'],
  44. log['speed'],
  45. speed_lead,
  46. log['acceleration']]))
  47. if d_rel < .4 and (self.only_radar or prob > 0.5):
  48. print("Crashed!!!!")
  49. valid = False
  50. if self.ensure_start and log['v_rel'] > 0 and log['speeds'][-1] <= 0.1:
  51. print('LongitudinalPlanner not starting!')
  52. valid = False
  53. print("maneuver end", valid)
  54. return valid, np.array(logs)