@ -354,6 +354,7 @@ void Localizer::handle_gps(double current_time, const cereal::GpsLocationData::R 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    this - > reset_kalman ( NAN ,  initial_pose_ecef_quat ,  ecef_pos ,  ecef_vel ,  ecef_pos_R ,  ecef_vel_R ) ;   
					 
					 
					 
					    this - > reset_kalman ( NAN ,  initial_pose_ecef_quat ,  ecef_pos ,  ecef_vel ,  ecef_pos_R ,  ecef_vel_R ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }   
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  this - > last_gps_msg  =  sensor_time ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  this - > kf - > predict_and_observe ( sensor_time ,  OBSERVATION_ECEF_POS ,  {  ecef_pos  } ,  {  ecef_pos_R  } ) ;   
					 
					 
					 
					  this - > kf - > predict_and_observe ( sensor_time ,  OBSERVATION_ECEF_POS ,  {  ecef_pos  } ,  {  ecef_pos_R  } ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  this - > kf - > predict_and_observe ( sensor_time ,  OBSERVATION_ECEF_VEL ,  {  ecef_vel  } ,  {  ecef_vel_R  } ) ;   
					 
					 
					 
					  this - > kf - > predict_and_observe ( sensor_time ,  OBSERVATION_ECEF_VEL ,  {  ecef_vel  } ,  {  ecef_vel_R  } ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -588,12 +589,12 @@ void Localizer::handle_msg(const cereal::Event::Reader& log) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    this - > handle_sensor ( t ,  log . getAccelerometer ( ) ) ;   
					 
					 
					 
					    this - > handle_sensor ( t ,  log . getAccelerometer ( ) ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( log . isGyroscope ( ) )  {   
					 
					 
					 
					  }  else  if  ( log . isGyroscope ( ) )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    this - > handle_sensor ( t ,  log . getGyroscope ( ) ) ;   
					 
					 
					 
					    this - > handle_sensor ( t ,  log . getGyroscope ( ) ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  //} else if (log.isGpsLocation()) {
   
					 
					 
					 
					  }  else  if  ( log . isGpsLocation ( ) )  {   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					  //  this->handle_gps(t, log.getGpsLocation(), GPS_QUECTEL_SENSOR_TIME_OFFSET);
   
					 
					 
					 
					    this - > handle_gps ( t ,  log . getGpsLocation ( ) ,  GPS_QUECTEL_SENSOR_TIME_OFFSET ) ;    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					  //} else if (log.isGpsLocationExternal()) {
   
					 
					 
					 
					  }  else  if  ( log . isGpsLocationExternal ( ) )  {   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					  //  this->handle_gps(t, log.getGpsLocationExternal(), GPS_UBLOX_SENSOR_TIME_OFFSET);
   
					 
					 
					 
					    this - > handle_gps ( t ,  log . getGpsLocationExternal ( ) ,  GPS_UBLOX_SENSOR_TIME_OFFSET ) ;    
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( log . isGnssMeasurements ( ) )  {   
					 
					 
					 
					  //} else if (log.isGnssMeasurements()) {
   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
					    this - > handle_gnss ( t ,  log . getGnssMeasurements ( ) ) ;    
					 
					 
					 
					  //  this->handle_gnss(t, log.getGnssMeasurements());
   
				
			 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( log . isCarState ( ) )  {   
					 
					 
					 
					  }  else  if  ( log . isCarState ( ) )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    this - > handle_car_state ( t ,  log . getCarState ( ) ) ;   
					 
					 
					 
					    this - > handle_car_state ( t ,  log . getCarState ( ) ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  }  else  if  ( log . isCameraOdometry ( ) )  {   
					 
					 
					 
					  }  else  if  ( log . isCameraOdometry ( ) )  {   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -657,11 +658,17 @@ void Localizer::determine_gps_mode(double current_time) { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					int  Localizer : : locationd_thread ( )  {  
					 
					 
					 
					int  Localizer : : locationd_thread ( )  {  
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  ublox_available  =  Params ( ) . getBool ( " UbloxAvailable " ,  true ) ;   
					 
					 
					 
					  ublox_available  =  Params ( ) . getBool ( " UbloxAvailable " ,  true ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  const  std : : initializer_list < const  char  * >  service_list  =  { " gnssMeasurements " ,  " cameraOdometry " ,  " liveCalibration " ,   
					 
					 
					 
					  const  char *  gps_location_socket ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  if  ( ublox_available )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    gps_location_socket  =  " gpsLocationExternal " ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }  else  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    gps_location_socket  =  " gpsLocation " ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  }   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					  const  std : : initializer_list < const  char  * >  service_list  =  { gps_location_socket ,  " cameraOdometry " ,  " liveCalibration " ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					                                                          " carState " ,  " carParams " ,  " accelerometer " ,  " gyroscope " } ;   
					 
					 
					 
					                                                          " carState " ,  " carParams " ,  " accelerometer " ,  " gyroscope " } ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  // TODO: remove carParams once we're always sending at 100Hz
   
					 
					 
					 
					  // TODO: remove carParams once we're always sending at 100Hz
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  SubMaster  sm ( service_list ,  { } ,  nullptr ,  { " gnssMeasurements " ,  " carParams " } ) ;   
					 
					 
					 
					  SubMaster  sm ( service_list ,  { } ,  nullptr ,  { gps_location_socket ,  " carParams " } ) ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					  PubMaster  pm ( { " liveLocationKalman " } ) ;   
					 
					 
					 
					  PubMaster  pm ( { " liveLocationKalman " } ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					  uint64_t  cnt  =  0 ;   
					 
					 
					 
					  uint64_t  cnt  =  0 ;