#!/usr/bin/env python3 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								''' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								printing  the  gap  between  interrupts  in  a  histogram  to  check  if  the 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								frequency  is  what  we  expect ,  the  bmx  is  not  interrupt  driven  for  as  we 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								get  interrupts  in  a  2 kHz  rate . 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								''' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  argparse 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  sys 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  collections  import  defaultdict 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  openpilot . tools . lib . logreader  import  LogReader 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  openpilot . tools . lib . route  import  Route 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  matplotlib . pyplot  as  plt 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SRC_BMX  =  " bmx055 " 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								SRC_LSM  =  " lsm6ds3 " 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  parseEvents ( log_reader ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bmx_data  =  defaultdict ( list ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lsm_data  =  defaultdict ( list ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  m  in  log_reader : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  m . which ( )  not  in  [ ' accelerometer ' ,  ' gyroscope ' ] : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      continue 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    d  =  getattr ( m ,  m . which ( ) ) . to_dict ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  d [ " source " ]  ==  SRC_BMX  and  " acceleration "  in  d : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      bmx_data [ " accel " ] . append ( d [ " timestamp " ]  /  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  d [ " source " ]  ==  SRC_BMX  and  " gyroUncalibrated "  in  d : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      bmx_data [ " gyro " ] . append ( d [ " timestamp " ]  /  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  d [ " source " ]  ==  SRC_LSM  and  " acceleration "  in  d : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      lsm_data [ " accel " ] . append ( d [ " timestamp " ]  /  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  d [ " source " ]  ==  SRC_LSM  and  " gyroUncalibrated "  in  d : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      lsm_data [ " gyro " ] . append ( d [ " timestamp " ]  /  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  bmx_data ,  lsm_data 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  cleanData ( data ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  len ( data )  ==  0 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  [ ] ,  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  data . sort ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  diffs  =  np . diff ( data ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  data ,  diffs 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  logAvgValues ( data ,  sensor ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  len ( data )  ==  0 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( f " { sensor } : no data to average " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  avg  =  sum ( data )  /  len ( data ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  hz   =  1  /  avg 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( f " { sensor } : data_points:  { len ( data ) }  avg [ns]:  { avg }  avg [Hz]:  { hz } " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  " __main__ " : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser  =  argparse . ArgumentParser ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( " route " ,  type = str ,  help = " route name " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( " segment " ,  type = int ,  help = " segment number " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  args  =  parser . parse_args ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  r  =  Route ( args . route ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  logs  =  r . log_paths ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  len ( logs )  ==  0 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " NO data routes " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sys . exit ( 0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  args . segment  > =  len ( logs ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( f " RouteID:  { args . segment }  out of range, max:  { len ( logs )  - 1 } " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sys . exit ( 0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lr  =  LogReader ( logs [ args . segment ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bmx_data ,  lsm_data  =  parseEvents ( lr ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # sort bmx accel data, and then cal all the diffs, and to a histogram of those 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bmx_accel ,  bmx_accel_diffs  =  cleanData ( bmx_data [ " accel " ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  bmx_gyro ,  bmx_gyro_diffs  =  cleanData ( bmx_data [ " gyro " ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lsm_accel ,  lsm_accel_diffs  =  cleanData ( lsm_data [ " accel " ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lsm_gyro ,  lsm_gyro_diffs  =  cleanData ( lsm_data [ " gyro " ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # get out the averages 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  logAvgValues ( bmx_accel_diffs ,  " bmx accel " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  logAvgValues ( bmx_gyro_diffs ,  " bmx gyro  " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  logAvgValues ( lsm_accel_diffs ,  " lsm accel " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  logAvgValues ( lsm_gyro_diffs ,  " lsm gyro  " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  fig ,  axs  =  plt . subplots ( 1 ,  2 ,  tight_layout = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axs [ 0 ] . hist ( bmx_accel_diffs ,  bins = 50 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axs [ 0 ] . set_title ( " bmx_accel " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axs [ 1 ] . hist ( bmx_gyro_diffs ,  bins = 50 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axs [ 1 ] . set_title ( " bmx_gyro " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  figl ,  axsl  =  plt . subplots ( 1 ,  2 ,  tight_layout = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axsl [ 0 ] . hist ( lsm_accel_diffs ,  bins = 50 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axsl [ 0 ] . set_title ( " lsm_accel " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axsl [ 1 ] . hist ( lsm_gyro_diffs ,  bins = 50 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  axsl [ 1 ] . set_title ( " lsm_gyro " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( " check plot... " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . show ( )