#!/usr/bin/env python3 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# pylint: skip-file 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# flake8: noqa 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# type: ignore 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  math 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  multiprocessing 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tqdm  import  tqdm 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . locationd . paramsd  import  ParamsLearner ,  States 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tools . lib . logreader  import  LogReader 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tools . lib . route  import  Route 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								ROUTE  =  " b2f1615665781088|2021-03-14--17-27-47 " 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								PLOT  =  True 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  load_segment ( segment_name ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( f " Loading  { segment_name } " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  segment_name  is  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  try : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  list ( LogReader ( segment_name ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  except  ValueError  as  e : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( f " Error parsing  { segment_name } :  { e } " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  " __main__ " : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  route  =  Route ( ROUTE ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  msgs  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  with  multiprocessing . Pool ( 24 )  as  pool : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  d  in  pool . map ( load_segment ,  route . log_paths ( ) ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      msgs  + =  d 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  m  in  msgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  m . which ( )  ==  ' carParams ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      CP  =  m . carParams 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  params  =  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' carFingerprint ' :  CP . carFingerprint , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' steerRatio ' :  CP . steerRatio , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' stiffnessFactor ' :  1.0 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' angleOffsetAverageDeg ' :  0.0 , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  m  in  msgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  m . which ( )  ==  ' liveParameters ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      params [ ' steerRatio ' ]  =  m . liveParameters . steerRatio 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      params [ ' angleOffsetAverageDeg ' ]  =  m . liveParameters . angleOffsetAverageDeg 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  m  in  msgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  m . which ( )  ==  ' carState ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      last_carstate  =  m 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      break 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( params ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  learner  =  ParamsLearner ( CP ,  params [ ' steerRatio ' ] ,  params [ ' stiffnessFactor ' ] ,  math . radians ( params [ ' angleOffsetAverageDeg ' ] ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  msgs  =  [ m  for  m  in  tqdm ( msgs )  if  m . which ( )  in  ( ' liveLocationKalman ' ,  ' carState ' ,  ' liveParameters ' ) ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  msgs  =  sorted ( msgs ,  key = lambda  m :  m . logMonoTime ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ts  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ts_log  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  results  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  results_log  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  m  in  tqdm ( msgs ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  m . which ( )  ==  ' carState ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      last_carstate  =  m 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    elif  m . which ( )  ==  ' liveLocationKalman ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      t  =  last_carstate . logMonoTime  /  1e9 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      learner . handle_log ( t ,  ' carState ' ,  last_carstate . carState ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      t  =  m . logMonoTime  /  1e9 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      learner . handle_log ( t ,  ' liveLocationKalman ' ,  m . liveLocationKalman ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      x  =  learner . kf . x 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      sr  =  float ( x [ States . STEER_RATIO ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      st  =  float ( x [ States . STIFFNESS ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ao_avg  =  math . degrees ( x [ States . ANGLE_OFFSET ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ao  =  ao_avg  +  math . degrees ( x [ States . ANGLE_OFFSET_FAST ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      r  =  [ sr ,  st ,  ao_avg ,  ao ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  any ( math . isnan ( v )  for  v  in  r ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( " NaN " ,  t ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ts . append ( t ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      results . append ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    elif  m . which ( )  ==  ' liveParameters ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      t  =  m . logMonoTime  /  1e9 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      mm  =  m . liveParameters 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      r  =  [ mm . steerRatio ,  mm . stiffnessFactor ,  mm . angleOffsetAverageDeg ,  mm . angleOffsetDeg ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  any ( math . isnan ( v )  for  v  in  r ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( " NaN in log " ,  t ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ts_log . append ( t ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      results_log . append ( r ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  results  =  np . asarray ( results ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  results_log  =  np . asarray ( results_log ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  PLOT : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import  matplotlib . pyplot  as  plt 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . figure ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts ,  results [ : ,  0 ] ,  label = ' Steer Ratio ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ 0 ,  20 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  3 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts ,  results [ : ,  1 ] ,  label = ' Stiffness ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ 0 ,  2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  5 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts ,  results [ : ,  2 ] ,  label = ' Angle offset (average) ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts ,  results [ : ,  3 ] ,  label = ' Angle offset (instant) ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ - 5 ,  5 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  2 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts_log ,  results_log [ : ,  0 ] ,  label = ' Steer Ratio ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ 0 ,  20 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  4 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts_log ,  results_log [ : ,  1 ] ,  label = ' Stiffness ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ 0 ,  2 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . subplot ( 3 ,  2 ,  6 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts_log ,  results_log [ : ,  2 ] ,  label = ' Angle offset (average) ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . plot ( ts_log ,  results_log [ : ,  3 ] ,  label = ' Angle offset (instant) ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . ylim ( [ - 5 ,  5 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . grid ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . legend ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    plt . show ( )