import os import time from cereal import car from common.kalman.simple_kalman import KF1D from common.realtime import DT_CTRL from selfdrive.car import gen_empty_fingerprint GearShifter = car.CarState.GearShifter # generic car and radar interfaces class CarInterfaceBase(): def __init__(self, CP, CarController): pass @staticmethod def calc_accel_override(a_ego, a_target, v_ego, v_target): return 1. @staticmethod def compute_gb(accel, speed): raise NotImplementedError @staticmethod def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False, car_fw=[]): raise NotImplementedError # returns a car.CarState, pass in car.CarControl def update(self, c, can_strings): raise NotImplementedError # return sendcan, pass in a car.CarControl def apply(self, c): raise NotImplementedError class RadarInterfaceBase(): def __init__(self, CP): self.pts = {} self.delay = 0 self.radar_ts = CP.radarTimeStep def update(self, can_strings): ret = car.RadarData.new_message() if 'NO_RADAR_SLEEP' not in os.environ: time.sleep(self.radar_ts) # radard runs on RI updates return ret class CarStateBase: def __init__(self, CP): self.CP = CP self.car_fingerprint = CP.carFingerprint self.left_blinker_on = 0 self.right_blinker_on = 0 self.cruise_buttons = 0 # Q = np.matrix([[10.0, 0.0], [0.0, 100.0]]) # R = 1e3 self.v_ego_kf = KF1D(x0=[[0.0], [0.0]], A=[[1.0, DT_CTRL], [0.0, 1.0]], C=[1.0, 0.0], K=[[0.12287673], [0.29666309]]) def update_speed_kf(self, v_ego_raw): if abs(v_ego_raw - self.v_ego_kf.x[0][0]) > 2.0: # Prevent large accelerations when car starts at non zero speed self.v_ego_kf.x = [[v_ego_raw], [0.0]] v_ego_x = self.v_ego_kf.update(v_ego_raw) return float(v_ego_x[0]), float(v_ego_x[1]) @staticmethod def parse_gear_shifter(gear): return {'P': GearShifter.park, 'R': GearShifter.reverse, 'N': GearShifter.neutral, 'E': GearShifter.eco, 'T': GearShifter.manumatic, 'D': GearShifter.drive, 'S': GearShifter.sport, 'L': GearShifter.low, 'B': GearShifter.brake}.get(gear, GearShifter.unknown)