diff --git a/selfdrive/locationd/locationd.py b/selfdrive/locationd/locationd.py index 32872b6a12..0df43d0dcd 100644 --- a/selfdrive/locationd/locationd.py +++ b/selfdrive/locationd/locationd.py @@ -57,10 +57,9 @@ class Localizer(): self.calibrated = 0 self.H = get_H() - def liveLocationMsg(self, time): - predicted_state = self.kf.x - predicted_cov = self.kf.P - predicted_std = np.sqrt(np.diagonal(self.kf.P)) + @staticmethod + def msg_from_state(converter, calib_from_device, H, predicted_state, predicted_cov): + predicted_std = np.sqrt(np.diagonal(predicted_cov)) fix_ecef = predicted_state[States.ECEF_POS] fix_ecef_std = predicted_std[States.ECEF_POS_ERR] @@ -71,35 +70,33 @@ class Localizer(): orientation_ecef = euler_from_quat(predicted_state[States.ECEF_ORIENTATION]) orientation_ecef_std = predicted_std[States.ECEF_ORIENTATION_ERR] - acc_calib = self.calib_from_device.dot(predicted_state[States.ACCELERATION]) - acc_calib_std = np.sqrt(np.diagonal(self.calib_from_device.dot( - predicted_cov[States.ACCELERATION_ERR, States.ACCELERATION_ERR]).dot( - self.calib_from_device.T))) - ang_vel_calib = self.calib_from_device.dot(predicted_state[States.ANGULAR_VELOCITY]) - ang_vel_calib_std = np.sqrt(np.diagonal(self.calib_from_device.dot( - predicted_cov[States.ANGULAR_VELOCITY_ERR, States.ANGULAR_VELOCITY_ERR]).dot( - self.calib_from_device.T))) + acc_calib = calib_from_device.dot(predicted_state[States.ACCELERATION]) + acc_calib_std = np.sqrt(np.diagonal(calib_from_device.dot( + predicted_cov[States.ACCELERATION_ERR, States.ACCELERATION_ERR]).dot( + calib_from_device.T))) + ang_vel_calib = calib_from_device.dot(predicted_state[States.ANGULAR_VELOCITY]) + ang_vel_calib_std = np.sqrt(np.diagonal(calib_from_device.dot( + predicted_cov[States.ANGULAR_VELOCITY_ERR, States.ANGULAR_VELOCITY_ERR]).dot( + calib_from_device.T))) device_from_ecef = rot_from_quat(predicted_state[States.ECEF_ORIENTATION]).T vel_device = device_from_ecef.dot(vel_ecef) device_from_ecef_eul = euler_from_quat(predicted_state[States.ECEF_ORIENTATION]).T idxs = list(range(States.ECEF_ORIENTATION_ERR.start, States.ECEF_ORIENTATION_ERR.stop)) + list(range(States.ECEF_VELOCITY_ERR.start, States.ECEF_VELOCITY_ERR.stop)) condensed_cov = predicted_cov[idxs][:,idxs] - H = self.H(*list(np.concatenate([device_from_ecef_eul, vel_ecef]))) - vel_device_cov = H.dot(condensed_cov).dot(H.T) + HH = H(*list(np.concatenate([device_from_ecef_eul, vel_ecef]))) + vel_device_cov = HH.dot(condensed_cov).dot(HH.T) vel_device_std = np.sqrt(np.diagonal(vel_device_cov)) - vel_calib = self.calib_from_device.dot(vel_device) - vel_calib_std = np.sqrt(np.diagonal(self.calib_from_device.dot( - vel_device_cov).dot( - self.calib_from_device.T))) + vel_calib = calib_from_device.dot(vel_device) + vel_calib_std = np.sqrt(np.diagonal(calib_from_device.dot( + vel_device_cov).dot(calib_from_device.T))) orientation_ned = ned_euler_from_ecef(fix_ecef, orientation_ecef) #orientation_ned_std = ned_euler_from_ecef(fix_ecef, orientation_ecef + orientation_ecef_std) - orientation_ned - ned_vel = self.converter.ecef2ned(fix_ecef + vel_ecef) - self.converter.ecef2ned(fix_ecef) + ned_vel = converter.ecef2ned(fix_ecef + vel_ecef) - converter.ecef2ned(fix_ecef) #ned_vel_std = self.converter.ecef2ned(fix_ecef + vel_ecef + vel_ecef_std) - self.converter.ecef2ned(fix_ecef + vel_ecef) - fix = messaging.log.LiveLocationKalman.new_message() fix.positionGeodetic.value = to_float(fix_pos_geo) #fix.positionGeodetic.std = to_float(fix_pos_geo_std) @@ -139,6 +136,10 @@ class Localizer(): fix.accelerationCalibrated.value = to_float(acc_calib) fix.accelerationCalibrated.std = to_float(acc_calib_std) fix.accelerationCalibrated.valid = True + return fix + + def liveLocationMsg(self, time): + fix = self.msg_from_state(self.converter, self.calib_from_device, self.H, self.kf.x, self.kf.P) #fix.gpsWeek = self.time.week #fix.gpsTimeOfWeek = self.time.tow