|
|
@ -1,6 +1,5 @@ |
|
|
|
#!/usr/bin/env python3 |
|
|
|
#!/usr/bin/env python3 |
|
|
|
import os |
|
|
|
import os |
|
|
|
import json |
|
|
|
|
|
|
|
import time |
|
|
|
import time |
|
|
|
import capnp |
|
|
|
import capnp |
|
|
|
import numpy as np |
|
|
|
import numpy as np |
|
|
@ -65,7 +64,7 @@ class LocationEstimator: |
|
|
|
self.observation_errors = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} |
|
|
|
self.observation_errors = {kind: np.zeros(3, dtype=np.float32) for kind in obs_kinds} |
|
|
|
|
|
|
|
|
|
|
|
def reset(self, t: float, x_initial: np.ndarray = PoseKalman.initial_x, P_initial: np.ndarray = PoseKalman.initial_P): |
|
|
|
def reset(self, t: float, x_initial: np.ndarray = PoseKalman.initial_x, P_initial: np.ndarray = PoseKalman.initial_P): |
|
|
|
self.kf.reset(t, x_initial, P_initial) |
|
|
|
self.kf.init_state(x_initial, covs=P_initial, filter_time=t) |
|
|
|
|
|
|
|
|
|
|
|
def _validate_sensor_source(self, source: log.SensorEventData.SensorSource): |
|
|
|
def _validate_sensor_source(self, source: log.SensorEventData.SensorSource): |
|
|
|
# some segments have two IMUs, ignore the second one |
|
|
|
# some segments have two IMUs, ignore the second one |
|
|
@ -186,8 +185,8 @@ class LocationEstimator: |
|
|
|
rot_device_noise = rot_device_std ** 2 |
|
|
|
rot_device_noise = rot_device_std ** 2 |
|
|
|
trans_device_noise = trans_device_std ** 2 |
|
|
|
trans_device_noise = trans_device_std ** 2 |
|
|
|
|
|
|
|
|
|
|
|
cam_odo_rot_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_ROTATION, rot_device, rot_device_noise) |
|
|
|
cam_odo_rot_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_ROTATION, rot_device, np.array([np.diag(rot_device_noise)])) |
|
|
|
cam_odo_trans_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_TRANSLATION, trans_device, trans_device_noise) |
|
|
|
cam_odo_trans_res = self.kf.predict_and_observe(t, ObservationKind.CAMERA_ODO_TRANSLATION, trans_device, np.array([np.diag(trans_device_noise)])) |
|
|
|
self.camodo_yawrate_distribution = np.array([rot_device[2], rot_device_std[2]]) |
|
|
|
self.camodo_yawrate_distribution = np.array([rot_device[2], rot_device_std[2]]) |
|
|
|
if cam_odo_rot_res is not None: |
|
|
|
if cam_odo_rot_res is not None: |
|
|
|
_, new_x, _, new_P, _, _, (cam_odo_rot_err,), _, _ = cam_odo_rot_res |
|
|
|
_, new_x, _, new_P, _, _, (cam_odo_rot_err,), _, _ = cam_odo_rot_res |
|
|
@ -278,11 +277,12 @@ def main(): |
|
|
|
input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services} |
|
|
|
input_invalid_threshold = {s: input_invalid_limit[s] - 0.5 for s in critcal_services} |
|
|
|
input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services} |
|
|
|
input_invalid_decay = {s: calculate_invalid_input_decay(input_invalid_limit[s], INPUT_INVALID_RECOVERY, SERVICE_LIST[s].frequency) for s in critcal_services} |
|
|
|
|
|
|
|
|
|
|
|
initial_pose = params.get("LocationFilterInitialState") |
|
|
|
initial_pose_data = params.get("LocationFilterInitialState") |
|
|
|
if initial_pose is not None: |
|
|
|
if initial_pose_data is not None: |
|
|
|
initial_pose = json.loads(initial_pose) |
|
|
|
with log.Event.from_bytes(initial_pose_data) as lp_msg: |
|
|
|
x_initial = np.array(initial_pose["x"], dtype=np.float64) |
|
|
|
filter_state = lp_msg.livePose.debugFilterState |
|
|
|
P_initial = np.diag(np.array(initial_pose["P"], dtype=np.float64)) |
|
|
|
x_initial = np.array(filter_state.value, dtype=np.float64) if len(filter_state.value) != 0 else PoseKalman.initial_x |
|
|
|
|
|
|
|
P_initial = np.diag(np.array(filter_state.std, dtype=np.float64)) if len(filter_state.std) != 0 else PoseKalman.initial_P |
|
|
|
estimator.reset(None, x_initial, P_initial) |
|
|
|
estimator.reset(None, x_initial, P_initial) |
|
|
|
|
|
|
|
|
|
|
|
while True: |
|
|
|
while True: |
|
|
|