|  |  |  | @ -1,4 +1,5 @@ | 
			
		
	
		
			
				
					|  |  |  |  | #!/usr/bin/env python3 | 
			
		
	
		
			
				
					|  |  |  |  | import numpy as np | 
			
		
	
		
			
				
					|  |  |  |  | from dataclasses import dataclass | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | from cereal import messaging, car | 
			
		
	
	
		
			
				
					|  |  |  | @ -10,8 +11,11 @@ from openpilot.common.swaglog import cloudlog | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @dataclass | 
			
		
	
		
			
				
					|  |  |  |  | class Action: | 
			
		
	
		
			
				
					|  |  |  |  |   accel: float      # m/s^2 | 
			
		
	
		
			
				
					|  |  |  |  |   duration: float   # seconds | 
			
		
	
		
			
				
					|  |  |  |  |   accel_bp: list[float]  # m/s^2 | 
			
		
	
		
			
				
					|  |  |  |  |   time_bp: list[float]   # seconds | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   def __post_init__(self): | 
			
		
	
		
			
				
					|  |  |  |  |     assert len(self.accel_bp) == len(self.time_bp) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | @dataclass | 
			
		
	
	
		
			
				
					|  |  |  | @ -41,11 +45,12 @@ class Maneuver: | 
			
		
	
		
			
				
					|  |  |  |  |       return min(max(self.initial_speed - v_ego, -2.), 2.) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     action = self.actions[self._action_index] | 
			
		
	
		
			
				
					|  |  |  |  |     action_accel = np.interp(self._action_frames * DT_MDL, action.time_bp, action.accel_bp) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     self._action_frames += 1 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     # reached duration of action | 
			
		
	
		
			
				
					|  |  |  |  |     if self._action_frames > (action.duration / DT_MDL): | 
			
		
	
		
			
				
					|  |  |  |  |     if self._action_frames > (action.time_bp[-1] / DT_MDL): | 
			
		
	
		
			
				
					|  |  |  |  |       # next action | 
			
		
	
		
			
				
					|  |  |  |  |       if self._action_index < len(self.actions) - 1: | 
			
		
	
		
			
				
					|  |  |  |  |         self._action_index += 1 | 
			
		
	
	
		
			
				
					|  |  |  | @ -60,7 +65,7 @@ class Maneuver: | 
			
		
	
		
			
				
					|  |  |  |  |       else: | 
			
		
	
		
			
				
					|  |  |  |  |         self._finished = True | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     return action.accel | 
			
		
	
		
			
				
					|  |  |  |  |     return float(action_accel) | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   @property | 
			
		
	
		
			
				
					|  |  |  |  |   def finished(self): | 
			
		
	
	
		
			
				
					|  |  |  | @ -74,47 +79,47 @@ class Maneuver: | 
			
		
	
		
			
				
					|  |  |  |  | MANEUVERS = [ | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "come to stop", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(-0.5, 12)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([-0.5], [12])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=5., | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "start from stop", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(1.5, 5)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([1.5], [5])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=0., | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "creep: alternate between +1m/s^2 and -1m/s^2", | 
			
		
	
		
			
				
					|  |  |  |  |     [ | 
			
		
	
		
			
				
					|  |  |  |  |       Action(1, 3), Action(-1, 3), | 
			
		
	
		
			
				
					|  |  |  |  |       Action(1, 3), Action(-1, 3), | 
			
		
	
		
			
				
					|  |  |  |  |       Action(1, 3), Action(-1, 3), | 
			
		
	
		
			
				
					|  |  |  |  |       Action([1], [3]), Action([-1], [3]), | 
			
		
	
		
			
				
					|  |  |  |  |       Action([1], [3]), Action([-1], [3]), | 
			
		
	
		
			
				
					|  |  |  |  |       Action([1], [3]), Action([-1], [3]), | 
			
		
	
		
			
				
					|  |  |  |  |     ], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=0., | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "brake step response: -1m/s^2 from 20mph", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(-1, 3)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([-1], [3])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=20. * CV.MPH_TO_MS, | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "brake step response: -4m/s^2 from 20mph", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(-4, 3)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([-4], [3])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=20. * CV.MPH_TO_MS, | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "gas step response: +1m/s^2 from 20mph", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(1, 3)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([1], [3])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=20. * CV.MPH_TO_MS, | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
		
			
				
					|  |  |  |  |   Maneuver( | 
			
		
	
		
			
				
					|  |  |  |  |     "gas step response: +4m/s^2 from 20mph", | 
			
		
	
		
			
				
					|  |  |  |  |     [Action(4, 3)], | 
			
		
	
		
			
				
					|  |  |  |  |     [Action([4], [3])], | 
			
		
	
		
			
				
					|  |  |  |  |     repeat=2, | 
			
		
	
		
			
				
					|  |  |  |  |     initial_speed=20. * CV.MPH_TO_MS, | 
			
		
	
		
			
				
					|  |  |  |  |   ), | 
			
		
	
	
		
			
				
					|  |  |  | 
 |