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', 'bearingDeg',
|
|
'accuracy', 'timestamp', 'source', 'vNED', 'verticalAccuracy', 'bearingAccuracyDeg', '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)
|
|
|