|
|
|
@ -57,6 +57,10 @@ class Localizer(): |
|
|
|
|
self.calibrated = 0 |
|
|
|
|
self.H = get_H() |
|
|
|
|
|
|
|
|
|
self.posenet_invalid_count = 0 |
|
|
|
|
self.posenet_speed = 0 |
|
|
|
|
self.car_speed = 0 |
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
|
|
def msg_from_state(converter, calib_from_device, H, predicted_state, predicted_cov): |
|
|
|
|
predicted_std = np.sqrt(np.diagonal(predicted_cov)) |
|
|
|
@ -141,6 +145,12 @@ class Localizer(): |
|
|
|
|
def liveLocationMsg(self, time): |
|
|
|
|
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.gpsTimeOfWeek = self.time.tow |
|
|
|
|
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_VEL, ecef_vel, R=ecef_vel_R) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def handle_car_state(self, current_time, log): |
|
|
|
|
self.speed_counter += 1 |
|
|
|
|
|
|
|
|
|
if self.speed_counter % SENSOR_DECIMATION == 0: |
|
|
|
|
self.update_kalman(current_time, ObservationKind.ODOMETRIC_SPEED, [log.vEgo]) |
|
|
|
|
self.car_speed = abs(log.vEgo) |
|
|
|
|
if log.vEgo == 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])) |
|
|
|
|
trans_device = self.device_from_calib.dot(log.trans) |
|
|
|
|
trans_device_std = self.device_from_calib.dot(log.transStd) |
|
|
|
|
self.posenet_speed = np.linalg.norm(trans_device) |
|
|
|
|
self.update_kalman(current_time, |
|
|
|
|
ObservationKind.CAMERA_ODO_TRANSLATION, |
|
|
|
|
np.concatenate([trans_device, 10*trans_device_std])) |
|
|
|
@ -263,7 +274,7 @@ class Localizer(): |
|
|
|
|
|
|
|
|
|
def locationd_thread(sm, pm, disabled_logs=[]): |
|
|
|
|
if sm is None: |
|
|
|
|
socks = ['gpsLocationExternal', 'sensorEvents', 'cameraOdometry', 'liveCalibration'] |
|
|
|
|
socks = ['gpsLocationExternal', 'sensorEvents', 'cameraOdometry', 'liveCalibration', 'carState'] |
|
|
|
|
sm = messaging.SubMaster(socks) |
|
|
|
|
if pm is None: |
|
|
|
|
pm = messaging.PubMaster(['liveLocationKalman']) |
|
|
|
@ -293,6 +304,8 @@ def locationd_thread(sm, pm, disabled_logs=[]): |
|
|
|
|
msg.logMonoTime = t |
|
|
|
|
|
|
|
|
|
msg.liveLocationKalman = localizer.liveLocationMsg(t * 1e-9) |
|
|
|
|
msg.liveLocationKalman.inputsOK = sm.all_alive_and_valid() |
|
|
|
|
|
|
|
|
|
pm.send('liveLocationKalman', msg) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|