| 
						
						
							
								
							
						
						
					 | 
				
				 | 
				 | 
				
					@ -44,19 +44,19 @@ class Laikad: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      ecef_pos = self.gnss_kf.x[GStates.ECEF_POS].tolist() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      ecef_vel = self.gnss_kf.x[GStates.ECEF_VELOCITY].tolist() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      pos_std = float(np.linalg.norm(self.gnss_kf.P[GStates.ECEF_POS])) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      vel_std = float(np.linalg.norm(self.gnss_kf.P[GStates.ECEF_VELOCITY])) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      pos_std = self.gnss_kf.P[GStates.ECEF_POS].flatten().tolist() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      vel_std = self.gnss_kf.P[GStates.ECEF_VELOCITY].flatten().tolist() | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      bearing_deg, bearing_std = get_bearing_from_gnss(ecef_pos, ecef_vel, vel_std) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      meas_msgs = [create_measurement_msg(m) for m in corrected_measurements] | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      dat = messaging.new_message("gnssMeasurements") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      measurement_msg = log.GnssMeasurements.Measurement.new_message | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      measurement_msg = log.LiveLocationKalman.Measurement.new_message | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      dat.gnssMeasurements = { | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "positionECEF": measurement_msg(value=ecef_pos, std=pos_std, valid=localizer_valid), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "velocityECEF": measurement_msg(value=ecef_vel, std=vel_std, valid=localizer_valid), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "bearingDeg": measurement_msg(value=[bearing_deg], std=bearing_std, valid=localizer_valid), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "bearingDeg": measurement_msg(value=[bearing_deg], std=[bearing_std], valid=localizer_valid), | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "ubloxMonoTime": ublox_mono_time, | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        "correctedMeasurements": meas_msgs | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      } | 
				
			
			
		
	
	
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
				
				 | 
				 | 
				
					@ -77,7 +77,7 @@ class Laikad: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      filter_time = self.gnss_kf.filter.filter_time | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      if filter_time is None: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        cloudlog.info("Init gnss kalman filter") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      elif (t - filter_time) > MAX_TIME_GAP: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      elif abs(t - filter_time) > MAX_TIME_GAP: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        cloudlog.error("Time gap of over 10s detected, gnss kalman reset") | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					      else: | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					        cloudlog.error("Gnss kalman filter state is nan") | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
				
				 | 
				 | 
				
					@ -136,7 +136,7 @@ def get_bearing_from_gnss(ecef_pos, ecef_vel, vel_std): | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					  ned_vel = np.einsum('ij,j ->i', converter.ned_from_ecef_matrix, ecef_vel) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					  bearing = np.arctan2(ned_vel[1], ned_vel[0]) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					  bearing_std = np.arctan2(vel_std, np.linalg.norm(ned_vel)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					  bearing_std = np.arctan2(np.linalg.norm(vel_std), np.linalg.norm(ned_vel)) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					  return float(np.rad2deg(bearing)), float(bearing_std) | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
		
			
				
					 | 
					 | 
				
				 | 
				 | 
				
					
 | 
				
			
			
		
	
	
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
				
				 | 
				 | 
				
					
  |