@ -57,6 +57,10 @@ class Localizer():
self . calibrated = 0
self . calibrated = 0
self . H = get_H ( )
self . H = get_H ( )
self . posenet_invalid_count = 0
self . posenet_speed = 0
self . car_speed = 0
@staticmethod
@staticmethod
def msg_from_state ( converter , calib_from_device , H , predicted_state , predicted_cov ) :
def msg_from_state ( converter , calib_from_device , H , predicted_state , predicted_cov ) :
predicted_std = np . sqrt ( np . diagonal ( predicted_cov ) )
predicted_std = np . sqrt ( np . diagonal ( predicted_cov ) )
@ -141,6 +145,12 @@ class Localizer():
def liveLocationMsg ( self , time ) :
def liveLocationMsg ( self , time ) :
fix = self . msg_from_state ( self . converter , self . calib_from_device , self . H , self . kf . x , self . kf . P )
fix = self . msg_from_state ( self . converter , self . calib_from_device , self . H , self . kf . x , self . kf . P )
if abs ( self . posenet_speed - self . car_speed ) > max ( 0.4 * self . car_speed , 5.0 ) :
self . posenet_invalid_count + = 1
else :
self . posenet_invalid_count = 0
fix . posenetOK = self . posenet_invalid_count < 4
#fix.gpsWeek = self.time.week
#fix.gpsWeek = self.time.week
#fix.gpsTimeOfWeek = self.time.tow
#fix.gpsTimeOfWeek = self.time.tow
fix . unixTimestampMillis = self . unix_timestamp_millis
fix . unixTimestampMillis = self . unix_timestamp_millis
@ -198,12 +208,12 @@ class Localizer():
self . update_kalman ( current_time , ObservationKind . ECEF_POS , ecef_pos , R = ecef_pos_R )
self . update_kalman ( current_time , ObservationKind . ECEF_POS , ecef_pos , R = ecef_pos_R )
self . update_kalman ( current_time , ObservationKind . ECEF_VEL , ecef_vel , R = ecef_vel_R )
self . update_kalman ( current_time , ObservationKind . ECEF_VEL , ecef_vel , R = ecef_vel_R )
def handle_car_state ( self , current_time , log ) :
def handle_car_state ( self , current_time , log ) :
self . speed_counter + = 1
self . speed_counter + = 1
if self . speed_counter % SENSOR_DECIMATION == 0 :
if self . speed_counter % SENSOR_DECIMATION == 0 :
self . update_kalman ( current_time , ObservationKind . ODOMETRIC_SPEED , [ log . vEgo ] )
self . update_kalman ( current_time , ObservationKind . ODOMETRIC_SPEED , [ log . vEgo ] )
self . car_speed = abs ( log . vEgo )
if log . vEgo == 0 :
if log . vEgo == 0 :
self . update_kalman ( current_time , ObservationKind . NO_ROT , [ 0 , 0 , 0 ] )
self . update_kalman ( current_time , ObservationKind . NO_ROT , [ 0 , 0 , 0 ] )
@ -218,6 +228,7 @@ class Localizer():
np . concatenate ( [ rot_device , 10 * rot_device_std ] ) )
np . concatenate ( [ rot_device , 10 * rot_device_std ] ) )
trans_device = self . device_from_calib . dot ( log . trans )
trans_device = self . device_from_calib . dot ( log . trans )
trans_device_std = self . device_from_calib . dot ( log . transStd )
trans_device_std = self . device_from_calib . dot ( log . transStd )
self . posenet_speed = np . linalg . norm ( trans_device )
self . update_kalman ( current_time ,
self . update_kalman ( current_time ,
ObservationKind . CAMERA_ODO_TRANSLATION ,
ObservationKind . CAMERA_ODO_TRANSLATION ,
np . concatenate ( [ trans_device , 10 * trans_device_std ] ) )
np . concatenate ( [ trans_device , 10 * trans_device_std ] ) )
@ -263,7 +274,7 @@ class Localizer():
def locationd_thread ( sm , pm , disabled_logs = [ ] ) :
def locationd_thread ( sm , pm , disabled_logs = [ ] ) :
if sm is None :
if sm is None :
socks = [ ' gpsLocationExternal ' , ' sensorEvents ' , ' cameraOdometry ' , ' liveCalibration ' ]
socks = [ ' gpsLocationExternal ' , ' sensorEvents ' , ' cameraOdometry ' , ' liveCalibration ' , ' carState ' ]
sm = messaging . SubMaster ( socks )
sm = messaging . SubMaster ( socks )
if pm is None :
if pm is None :
pm = messaging . PubMaster ( [ ' liveLocationKalman ' ] )
pm = messaging . PubMaster ( [ ' liveLocationKalman ' ] )
@ -293,6 +304,8 @@ def locationd_thread(sm, pm, disabled_logs=[]):
msg . logMonoTime = t
msg . logMonoTime = t
msg . liveLocationKalman = localizer . liveLocationMsg ( t * 1e-9 )
msg . liveLocationKalman = localizer . liveLocationMsg ( t * 1e-9 )
msg . liveLocationKalman . inputsOK = sm . all_alive_and_valid ( )
pm . send ( ' liveLocationKalman ' , msg )
pm . send ( ' liveLocationKalman ' , msg )