@ -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__ " :