You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							96 lines
						
					
					
						
							3.6 KiB
						
					
					
				
			
		
		
	
	
							96 lines
						
					
					
						
							3.6 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| import os
 | |
| import sys
 | |
| import argparse
 | |
| 
 | |
| from cereal import log
 | |
| from common.basedir import BASEDIR
 | |
| os.environ['BASEDIR'] = BASEDIR
 | |
| 
 | |
| 
 | |
| def get_arg_parser():
 | |
|   parser = argparse.ArgumentParser(
 | |
|       description="Compare two result files",
 | |
|       formatter_class=argparse.ArgumentDefaultsHelpFormatter)
 | |
| 
 | |
|   parser.add_argument("dir1", nargs='?', default='/data/ubloxdc',
 | |
|                       help="Directory path 1 from which events are loaded")
 | |
| 
 | |
|   parser.add_argument("dir2", nargs='?', default='/data/ubloxdpy',
 | |
|                       help="Directory path 2 from which msgs are loaded")
 | |
| 
 | |
|   return parser
 | |
| 
 | |
| 
 | |
| def read_file(fn):
 | |
|   with open(fn, 'rb') as f:
 | |
|     return f.read()
 | |
| 
 | |
| 
 | |
| def compare_results(dir1, dir2):
 | |
|   onlyfiles1 = [f for f in os.listdir(dir1) if os.path.isfile(os.path.join(dir1, f))]
 | |
|   onlyfiles1.sort()
 | |
| 
 | |
|   onlyfiles2 = [f for f in os.listdir(dir2) if os.path.isfile(os.path.join(dir2, f))]
 | |
|   onlyfiles2.sort()
 | |
| 
 | |
|   if len(onlyfiles1) != len(onlyfiles2):
 | |
|     print('len mismatch: {} != {}'.format(len(onlyfiles1), len(onlyfiles2)))
 | |
|     return -1
 | |
|   events1 = [log.Event.from_bytes(read_file(os.path.join(dir1, f))) for f in onlyfiles1]
 | |
|   events2 = [log.Event.from_bytes(read_file(os.path.join(dir2, f))) for f in onlyfiles2]
 | |
| 
 | |
|   for i in range(len(events1)):
 | |
|     if events1[i].which() != events2[i].which():
 | |
|       print('event {} type mismatch: {} != {}'.format(i, events1[i].which(), events2[i].which()))
 | |
|       return -2
 | |
|     if events1[i].which() == 'gpsLocationExternal':
 | |
|       old_gps = events1[i].gpsLocationExternal
 | |
|       gps = events2[i].gpsLocationExternal
 | |
|       # print(gps, old_gps)
 | |
|       attrs = ['flags', 'latitude', 'longitude', 'altitude', 'speed', 'bearing',
 | |
|                'accuracy', 'timestamp', 'source', 'vNED', 'verticalAccuracy', 'bearingAccuracy', 'speedAccuracy']
 | |
|       for attr in attrs:
 | |
|         o = getattr(old_gps, attr)
 | |
|         n = getattr(gps, attr)
 | |
|         if attr == 'vNED':
 | |
|           if len(o) != len(n):
 | |
|             print('Gps vNED len mismatch', o, n)
 | |
|             return -3
 | |
|           else:
 | |
|             for i in range(len(o)):
 | |
|               if abs(o[i] - n[i]) > 1e-3:
 | |
|                 print('Gps vNED mismatch', o, n)
 | |
|                 return
 | |
|         elif o != n:
 | |
|           print('Gps mismatch', attr, o, n)
 | |
|           return -4
 | |
|     elif events1[i].which() == 'ubloxGnss':
 | |
|       old_gnss = events1[i].ubloxGnss
 | |
|       gnss = events2[i].ubloxGnss
 | |
|       if old_gnss.which() == 'measurementReport' and gnss.which() == 'measurementReport':
 | |
|         attrs = ['gpsWeek', 'leapSeconds', 'measurements', 'numMeas', 'rcvTow', 'receiverStatus', 'schema']
 | |
|         for attr in attrs:
 | |
|           o = getattr(old_gnss.measurementReport, attr)
 | |
|           n = getattr(gnss.measurementReport, attr)
 | |
|           if str(o) != str(n):
 | |
|             print('measurementReport {} mismatched'.format(attr))
 | |
|             return -5
 | |
|         if not (str(old_gnss.measurementReport) == str(gnss.measurementReport)):
 | |
|           print('Gnss measurementReport mismatched!')
 | |
|           print('gnss measurementReport old', old_gnss.measurementReport.measurements)
 | |
|           print('gnss measurementReport new', gnss.measurementReport.measurements)
 | |
|           return -6
 | |
|       elif old_gnss.which() == 'ephemeris' and gnss.which() == 'ephemeris':
 | |
|         if not (str(old_gnss.ephemeris) == str(gnss.ephemeris)):
 | |
|           print('Gnss ephemeris mismatched!')
 | |
|           print('gnss ephemeris old', old_gnss.ephemeris)
 | |
|           print('gnss ephemeris new', gnss.ephemeris)
 | |
|           return -7
 | |
|   print('All {} events matched!'.format(len(events1)))
 | |
|   return 0
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   args = get_arg_parser().parse_args(sys.argv[1:])
 | |
|   compare_results(args.dir1, args.dir2)
 | |
| 
 |