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.
		
		
		
		
		
			
		
			
				
					
					
						
							66 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							66 lines
						
					
					
						
							2.7 KiB
						
					
					
				| #!/usr/bin/env python3
 | |
| import cereal.messaging as messaging
 | |
| from laika import constants
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|   sm = messaging.SubMaster(['ubloxGnss', 'qcomGnss'])
 | |
| 
 | |
|   meas = None
 | |
|   while 1:
 | |
|     sm.update()
 | |
|     if sm['ubloxGnss'].which() == "measurementReport":
 | |
|       meas = sm['ubloxGnss'].measurementReport.measurements
 | |
|     if not sm.updated['qcomGnss'] or meas is None:
 | |
|       continue
 | |
|     report = sm['qcomGnss'].measurementReport
 | |
|     if report.source not in [0, 1]:
 | |
|       continue
 | |
|     GLONASS = report.source == 1
 | |
|     recv_time = report.milliseconds / 1000
 | |
| 
 | |
|     car = []
 | |
|     print("qcom has ", list(sorted([x.svId for x in report.sv])))
 | |
|     print("ublox has", list(sorted([x.svId for x in meas if x.gnssId == (6 if GLONASS else 0)])))
 | |
|     for i in report.sv:
 | |
|       # match to ublox
 | |
|       tm = None
 | |
|       for m in meas:
 | |
|         if i.svId == m.svId and m.gnssId == 0 and m.sigId == 0 and not GLONASS:
 | |
|           tm = m
 | |
|         if (i.svId-64) == m.svId and m.gnssId == 6 and m.sigId == 0 and GLONASS:
 | |
|           tm = m
 | |
|       if tm is None:
 | |
|         continue
 | |
| 
 | |
|       if not i.measurementStatus.measurementNotUsable and i.measurementStatus.satelliteTimeIsKnown:
 | |
|         sat_time = (i.unfilteredMeasurementIntegral + i.unfilteredMeasurementFraction + i.latency) / 1000
 | |
|         ublox_psuedorange = tm.pseudorange
 | |
|         qcom_psuedorange = (recv_time - sat_time)*constants.SPEED_OF_LIGHT
 | |
|         if GLONASS:
 | |
|           glonass_freq = tm.glonassFrequencyIndex - 7
 | |
|           ublox_speed = -(constants.SPEED_OF_LIGHT / (constants.GLONASS_L1 + glonass_freq*constants.GLONASS_L1_DELTA)) * (tm.doppler)
 | |
|         else:
 | |
|           ublox_speed = -(constants.SPEED_OF_LIGHT / constants.GPS_L1) * tm.doppler
 | |
|         qcom_speed = i.unfilteredSpeed
 | |
|         car.append((i.svId, tm.pseudorange, ublox_speed, qcom_psuedorange, qcom_speed, tm.cno))
 | |
| 
 | |
|     if len(car) == 0:
 | |
|       print("nothing to compare")
 | |
|       continue
 | |
| 
 | |
|     pr_err, speed_err = 0., 0.
 | |
|     for c in car:
 | |
|       ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed = c[1:5]
 | |
|       pr_err += ublox_psuedorange - qcom_psuedorange
 | |
|       speed_err += ublox_speed - qcom_speed
 | |
|     pr_err /= len(car)
 | |
|     speed_err /= len(car)
 | |
|     print("avg psuedorange err %f avg speed err %f" % (pr_err, speed_err))
 | |
|     for c in sorted(car, key=lambda x: abs(x[1] - x[3] - pr_err)):  # type: ignore
 | |
|       svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed, cno = c
 | |
|       print("svid: %3d  pseudorange: %10.2f m  speed: %8.2f m/s   meas: %12.2f  speed: %10.2f   meas_err: %10.3f speed_err: %8.3f cno: %d" %
 | |
|         (svid, ublox_psuedorange, ublox_speed, qcom_psuedorange, qcom_speed,
 | |
|         ublox_psuedorange - qcom_psuedorange - pr_err, ublox_speed - qcom_speed - speed_err, cno))
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |