@ -8,9 +8,11 @@ from tqdm import tqdm
import cereal . messaging as messaging
import cereal . messaging as messaging
from cereal import log
from cereal import log
from cereal . visionipc . visionipc_pyx import VisionIpcServer , VisionStreamType # pylint: disable=no-name-in-module, import-error
from common . spinner import Spinner
from common . spinner import Spinner
from common . timeout import Timeout
from common . timeout import Timeout
from common . transformations . camera import get_view_frame_from_road_frame
from common . transformations . camera import get_view_frame_from_road_frame , eon_f_frame_size , tici_f_frame_size
from selfdrive . hardware import PC
from selfdrive . manager . process_config import managed_processes
from selfdrive . manager . process_config import managed_processes
from selfdrive . test . openpilotci import BASE_URL , get_url
from selfdrive . test . openpilotci import BASE_URL , get_url
from selfdrive . test . process_replay . compare_logs import compare_logs , save_log
from selfdrive . test . process_replay . compare_logs import compare_logs , save_log
@ -29,25 +31,20 @@ def replace_calib(msg, calib):
return msg
return msg
def camera _replay( lr , fr , desire = None , calib = None ) :
def model _replay( lr , fr , desire = None , calib = None ) :
spinner = Spinner ( )
spinner = Spinner ( )
spinner . update ( " starting model replay " )
spinner . update ( " starting model replay " )
vipc_server = None
pm = messaging . PubMaster ( [ ' roadCameraState ' , ' liveCalibration ' , ' lateralPlan ' ] )
pm = messaging . PubMaster ( [ ' roadCameraState ' , ' liveCalibration ' , ' lateralPlan ' ] )
sm = messaging . SubMaster ( [ ' modelV2 ' ] )
sm = messaging . SubMaster ( [ ' modelV2 ' ] )
# TODO: add dmonitoringmodeld
# TODO: add dmonitoringmodeld
print ( " preparing procs " )
managed_processes [ ' camerad ' ] . prepare ( )
managed_processes [ ' modeld ' ] . prepare ( )
try :
try :
print ( " starting procs " )
managed_processes [ ' camerad ' ] . start ( )
managed_processes [ ' modeld ' ] . start ( )
managed_processes [ ' modeld ' ] . start ( )
time . sleep ( 5 )
time . sleep ( 5 )
sm . update ( 1000 )
sm . update ( 1000 )
print ( " procs started " )
desires_by_index = { v : k for k , v in log . LateralPlan . Desire . schema . enumerants . items ( ) }
desires_by_index = { v : k for k , v in log . LateralPlan . Desire . schema . enumerants . items ( ) }
@ -68,26 +65,33 @@ def camera_replay(lr, fr, desire=None, calib=None):
pm . send ( ' lateralPlan ' , dat )
pm . send ( ' lateralPlan ' , dat )
f = msg . as_builder ( )
f = msg . as_builder ( )
img = fr . get ( frame_idx , pix_fmt = " rgb24 " ) [ 0 ] [ : , : , : : - 1 ]
f . roadCameraState . image = img . flatten ( ) . tobytes ( )
frame_idx + = 1
pm . send ( msg . which ( ) , f )
pm . send ( msg . which ( ) , f )
img = fr . get ( frame_idx , pix_fmt = " yuv420p " ) [ 0 ]
if vipc_server is None :
w , h = { int ( 3 * w * h / 2 ) : ( w , h ) for ( w , h ) in [ tici_f_frame_size , eon_f_frame_size ] } [ len ( img ) ]
vipc_server = VisionIpcServer ( " camerad " )
vipc_server . create_buffers ( VisionStreamType . VISION_STREAM_YUV_BACK , 40 , False , w , h )
vipc_server . start_listener ( )
time . sleep ( 1 ) # wait for modeld to connect
vipc_server . send ( VisionStreamType . VISION_STREAM_YUV_BACK , img . flatten ( ) . tobytes ( ) , f . roadCameraState . frameId ,
f . roadCameraState . timestampSof , f . roadCameraState . timestampEof )
with Timeout ( seconds = 15 ) :
with Timeout ( seconds = 15 ) :
log_msgs . append ( messaging . recv_one ( sm . sock [ ' modelV2 ' ] ) )
log_msgs . append ( messaging . recv_one ( sm . sock [ ' modelV2 ' ] ) )
spinner . update ( " modeld replay %d / %d " % ( frame_idx , fr . frame_count ) )
spinner . update ( " modeld replay %d / %d " % ( frame_idx , fr . frame_count ) )
frame_idx + = 1
if frame_idx > = fr . frame_count :
if frame_idx > = fr . frame_count :
break
break
except KeyboardInterrupt :
except KeyboardInterrupt :
pass
pass
finally :
spinner . close ( )
managed_processes [ ' modeld ' ] . stop ( )
print ( " replay done " )
spinner . close ( )
managed_processes [ ' modeld ' ] . stop ( )
time . sleep ( 2 )
managed_processes [ ' camerad ' ] . stop ( )
return log_msgs
return log_msgs
if __name__ == " __main__ " :
if __name__ == " __main__ " :
@ -100,7 +104,7 @@ if __name__ == "__main__":
lr = LogReader ( get_url ( TEST_ROUTE , 0 ) )
lr = LogReader ( get_url ( TEST_ROUTE , 0 ) )
fr = FrameReader ( get_url ( TEST_ROUTE , 0 , log_type = " fcamera " ) )
fr = FrameReader ( get_url ( TEST_ROUTE , 0 , log_type = " fcamera " ) )
log_msgs = camera _replay( list ( lr ) , fr )
log_msgs = model _replay( list ( lr ) , fr )
failed = False
failed = False
if not update :
if not update :
@ -111,8 +115,9 @@ if __name__ == "__main__":
ignore = [ ' logMonoTime ' , ' valid ' ,
ignore = [ ' logMonoTime ' , ' valid ' ,
' modelV2.frameDropPerc ' ,
' modelV2.frameDropPerc ' ,
' modelV2.modelExecutionTime ' ]
' modelV2.modelExecutionTime ' ]
tolerance = None if not PC else 1e-3
results : Any = { TEST_ROUTE : { } }
results : Any = { TEST_ROUTE : { } }
results [ TEST_ROUTE ] [ " modeld " ] = compare_logs ( cmp_log , log_msgs , ignore_fields = ignore )
results [ TEST_ROUTE ] [ " modeld " ] = compare_logs ( cmp_log , log_msgs , tolerance = tolerance , ignore_fields = ignore )
diff1 , diff2 , failed = format_diff ( results , ref_commit )
diff1 , diff2 , failed = format_diff ( results , ref_commit )
print ( diff2 )
print ( diff2 )