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.
		
		
		
		
			
				
					97 lines
				
				3.6 KiB
			
		
		
			
		
	
	
					97 lines
				
				3.6 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/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)
							 |