@ -1,6 +1,7 @@ 
			
		
	
		
			
				
					#!/usr/bin/env python3  
			
		
	
		
			
				
					import  itertools  
			
		
	
		
			
				
					import  os  
			
		
	
		
			
				
					from  parameterized  import  parameterized  
			
		
	
		
			
				
					from  parameterized  import  parameterized_class   
			
		
	
		
			
				
					import  unittest  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					from  common . params  import  Params  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -9,8 +10,8 @@ from selfdrive.test.longitudinal_maneuvers.maneuver import Maneuver 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					# TODO: make new FCW tests  
			
		
	
		
			
				
					def  create_maneuvers ( e2e ) :  
			
		
	
		
			
				
					  return [   
			
		
	
		
			
				
					def  create_maneuvers ( kwargs ) :  
			
		
	
		
			
				
					  maneuvers  = [   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' approach stopped car at 25m/s, initial distance: 120m ' ,   
			
		
	
		
			
				
					      duration = 20. ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -19,7 +20,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      initial_distance_lead = 120. ,   
			
		
	
		
			
				
					      speed_lead_values = [ 30. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0. ,  1. ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' approach stopped car at 20m/s, initial distance 90m ' ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -29,7 +30,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      initial_distance_lead = 90. ,   
			
		
	
		
			
				
					      speed_lead_values = [ 20. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0. ,  1. ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' steady state following a car at 20m/s, then lead decel to 0mph at 1m/s^2 ' ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -39,7 +40,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      initial_distance_lead = 35. ,   
			
		
	
		
			
				
					      speed_lead_values = [ 20. ,  20. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0. ,  15. ,  35.0 ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' steady state following a car at 20m/s, then lead decel to 0mph at 2m/s^2 ' ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -49,7 +50,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      initial_distance_lead = 35. ,   
			
		
	
		
			
				
					      speed_lead_values = [ 20. ,  20. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0. ,  15. ,  25.0 ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' steady state following a car at 20m/s, then lead decel to 0mph at 3m/s^2 ' ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -59,7 +60,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      initial_distance_lead = 35. ,   
			
		
	
		
			
				
					      speed_lead_values = [ 20. ,  20. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0. ,  15. ,  21.66 ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' steady state following a car at 20m/s, then lead decel to 0mph at 3+m/s^2 ' ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -71,7 +72,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      prob_lead_values = [ 0. ,  1. ,  1. ] ,   
			
		
	
		
			
				
					      cruise_values = [ 20. ,  20. ,  20. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 2. ,  2.01 ,  8.8 ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      " approach stopped car at 20m/s, with prob_lead_values " ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -83,7 +84,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      prob_lead_values = [ 0.0 ,  0. ,  1. ] ,   
			
		
	
		
			
				
					      cruise_values = [ 20. ,  20. ,  20. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 0.0 ,  2. ,  2.01 ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      " approach slower cut-in car at 20m/s " ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -94,7 +95,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      speed_lead_values = [ 15. ,  15. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 1. ,  11. ] ,   
			
		
	
		
			
				
					      only_lead2 = True ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      " stay stopped behind radar override lead " ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -106,7 +107,7 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      prob_lead_values = [ 0. ,  0. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 1. ,  11. ] ,   
			
		
	
		
			
				
					      only_radar = True ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      " NaN recovery " ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -117,10 +118,20 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      speed_lead_values = [ 0. ,  0. ,  0.0 ] ,   
			
		
	
		
			
				
					      breakpoints = [ 1. ,  1.01 ,  11. ] ,   
			
		
	
		
			
				
					      cruise_values = [ float ( " nan " ) ,  15. ,  15. ] ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    # controls relies on planner commanding to move for stock-ACC resume spamming   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' cruising at 25 m/s while disabled ' ,   
			
		
	
		
			
				
					      duration = 20. ,   
			
		
	
		
			
				
					      initial_speed = 25. ,   
			
		
	
		
			
				
					      lead_relevancy = False ,   
			
		
	
		
			
				
					      enabled = False ,   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					  ]   
			
		
	
		
			
				
					  if  not  kwargs [ ' force_decel ' ] :   
			
		
	
		
			
				
					    # controls relies on planner commanding to move for stock-ACC resume spamming   
			
		
	
		
			
				
					    maneuvers . append ( Maneuver (   
			
		
	
		
			
				
					      " resume from a stop " ,   
			
		
	
		
			
				
					      duration = 20. ,   
			
		
	
		
			
				
					      initial_speed = 0. ,   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -129,20 +140,16 @@ def create_maneuvers(e2e): 
			
		
	
		
			
				
					      speed_lead_values = [ 0. ,  0. ,  2. ] ,   
			
		
	
		
			
				
					      breakpoints = [ 1. ,  10. ,  15. ] ,   
			
		
	
		
			
				
					      ensure_start = True ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					    Maneuver (   
			
		
	
		
			
				
					      ' cruising at 25 m/s while disabled ' ,   
			
		
	
		
			
				
					      duration = 20. ,   
			
		
	
		
			
				
					      initial_speed = 25. ,   
			
		
	
		
			
				
					      lead_relevancy = False ,   
			
		
	
		
			
				
					      enabled = False ,   
			
		
	
		
			
				
					      e2e = e2e ,   
			
		
	
		
			
				
					    ) ,   
			
		
	
		
			
				
					  ]   
			
		
	
		
			
				
					      * * kwargs ,   
			
		
	
		
			
				
					    ) )   
			
		
	
		
			
				
					  return  maneuvers   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					@parameterized_class ( ( " e2e " ,  " force_decel " ) ,  itertools . product ( [ True ,  False ] ,  repeat = 2 ) )  
			
		
	
		
			
				
					class  LongitudinalControl ( unittest . TestCase ) :  
			
		
	
		
			
				
					  e2e :  bool   
			
		
	
		
			
				
					  force_decel :  bool   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  @classmethod   
			
		
	
		
			
				
					  def  setUpClass ( cls ) :   
			
		
	
		
			
				
					    os . environ [ ' SIMULATION ' ]  =  " 1 "   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -154,11 +161,12 @@ class LongitudinalControl(unittest.TestCase): 
			
		
	
		
			
				
					    params . put_bool ( " Passive " ,  bool ( os . getenv ( " PASSIVE " ) ) )   
			
		
	
		
			
				
					    params . put_bool ( " OpenpilotEnabledToggle " ,  True )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  @parameterized . expand ( [ ( man , )  for  e2e  in  [ True ,  False ]  for  man  in  create_maneuvers ( e2e ) ] )   
			
		
	
		
			
				
					  def  test_maneuver ( self ,  maneuver ) :   
			
		
	
		
			
				
					    print ( maneuver . title ,  f ' in  { " e2e "  if  maneuver . e2e  else  " acc " }  mode ' )   
			
		
	
		
			
				
					    valid ,  _  =  maneuver . evaluate ( )   
			
		
	
		
			
				
					    self . assertTrue ( valid ,  msg = maneuver . title )   
			
		
	
		
			
				
					  def  test_maneuver ( self ) :   
			
		
	
		
			
				
					    for  maneuver  in  create_maneuvers ( { " e2e " :  self . e2e ,  " force_decel " :  self . force_decel } ) :   
			
		
	
		
			
				
					      with  self . subTest ( title = maneuver . title ,  e2e = maneuver . e2e ,  force_decel = maneuver . force_decel ) :   
			
		
	
		
			
				
					        print ( maneuver . title ,  f ' in  { " e2e "  if  maneuver . e2e  else  " acc " }  mode ' )   
			
		
	
		
			
				
					        valid ,  _  =  maneuver . evaluate ( )   
			
		
	
		
			
				
					        self . assertTrue ( valid )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					if  __name__  ==  " __main__ " :