예제 #1
0
    def __init__(self, CP, CarController):
        self.CP = CP
        self.VM = VehicleModel(CP)
        self.frame = 0

        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.cruise_enabled_prev = False
        self.low_speed_alert = False

        # *** init the major players ***
        self.CS = CarState(CP)
        self.cp = get_can_parser(CP)
        self.cp2 = get_can2_parser(CP)
        self.cp_cam = get_camera_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP.carFingerprint)
예제 #2
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.low_speed_alert = False
        self.cruise_enabled_prev = False
        self.pcm_enable_prev = False
        self.pcm_enable_cmd = False

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)
예제 #3
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.steering_unpressed = 0
        self.low_speed_alert = False
        self.silent_steer_warning = True

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)
            self.cp_loopback = self.CS.get_loopback_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)
예제 #4
0
  def __init__(self, CP, sendcan=None):
    self.CP = CP
    self.VM = VehicleModel(CP)

    self.frame = 0
    self.gas_pressed_prev = False
    self.brake_pressed_prev = False
    self.can_invalid_count = 0
    self.cruise_enabled_prev = False

    # *** init the major players ***
    self.CS = CarState(CP)

    self.cp = get_can_parser(CP)

    # sending if read only is False
    if sendcan is not None:
      self.sendcan = sendcan
      self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera, CP.enableDsu, CP.enableApgs)
예제 #5
0
    def __init__(self, CP, CarController):
        self.CP = CP

        self.frame = 0
        self.can_invalid_count = 0
        self.acc_active_prev = 0
        self.gas_pressed_prev = False

        # *** init the major players ***
        self.CS = CarState(CP)
        self.VM = VehicleModel(CP)
        self.pt_cp = get_powertrain_can_parser(CP)
        self.cam_cp = get_camera_can_parser(CP)

        self.gas_pressed_prev = False

        self.CC = None
        if CarController is not None:
            self.CC = CarController(CP.carFingerprint)
예제 #6
0
  def __init__(self, CP, CarController, CarState):
    self.CP = CP
    self.VM = VehicleModel(CP)

    self.frame = 0
    self.low_speed_alert = False

    if CarState is not None:
      self.CS = CarState(CP)
      self.cp = self.CS.get_can_parser(CP)
      self.cp_cam = self.CS.get_cam_can_parser(CP)
      self.cp_body = self.CS.get_body_can_parser(CP)

    self.CC = None
    if CarController is not None:
      self.CC = CarController(self.cp.dbc_name, CP, self.VM)

    params = Params()
    self.allowGas = True if params.get("AllowGas", encoding='utf8') == "1" else False
예제 #7
0
    def __init__(self, CP, CarController):
        self.CP = CP

        self.frame = 0
        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.acc_active_prev = 0

        # *** init the major players ***
        canbus = CanBus()
        self.CS = CarState(CP, canbus)
        self.VM = VehicleModel(CP)
        self.pt_cp = get_powertrain_can_parser(CP, canbus)
        self.ch_cp = get_chassis_can_parser(CP, canbus)
        self.ch_cp_dbc_name = DBC[CP.carFingerprint]['chassis']

        self.CC = None
        if CarController is not None:
            self.CC = CarController(canbus, CP.carFingerprint)
예제 #8
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.steer_warning = 0
        self.steering_unpressed = 0
        self.low_speed_alert = False

        self.disengage_on_gas = not Params().get_bool("DisableDisengageOnGas")

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)
예제 #9
0
  def __init__(self, CP, sendcan=None):
    self.CP = CP

    self.frame = 0
    self.gas_pressed_prev = False
    self.brake_pressed_prev = False
    self.can_invalid_count = 0
    self.acc_active_prev = 0

    # *** init the major players ***
    canbus = CanBus()
    self.CS = CarState(CP, canbus)
    self.VM = VehicleModel(CP)
    self.pt_cp = get_powertrain_can_parser(CP, canbus)
    self.ch_cp_dbc_name = DBC[CP.carFingerprint]['chassis']

    # sending if read only is False
    if sendcan is not None:
      self.sendcan = sendcan
      self.CC = CarController(canbus, CP.carFingerprint, CP.enableCamera)
예제 #10
0
    def test_saturation(self, car_name, controller):
        CarInterface, CarController, CarState = interfaces[car_name]
        CP = CarInterface.get_params(car_name)
        CI = CarInterface(CP, CarController, CarState)
        VM = VehicleModel(CP)

        controller = controller(CP, CI)

        CS = car.CarState.new_message()
        CS.vEgo = 30

        last_actuators = car.CarControl.Actuators.new_message()

        params = log.LiveParametersData.new_message()

        for _ in range(1000):
            _, _, lac_log = controller.update(True, CS, CP, VM, params,
                                              last_actuators, True, 1, 0)

        self.assertTrue(lac_log.saturated)
예제 #11
0
  def __init__(self, CP, CarController):
    self.CP = CP
    self.VM = VehicleModel(CP)

    self.frame = 0
    self.gas_pressed_prev = False
    self.brake_pressed_prev = False
    self.cruise_enabled_prev = False

    # *** init the major players ***
    self.CS = CarState(CP)

    self.cp = get_can_parser(CP)
    self.cp_cam = get_cam_can_parser(CP)

    self.forwarding_camera = False

    self.CC = None
    if CarController is not None:
      self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera, CP.enableDsu, CP.enableApgs)
예제 #12
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.steer_warning = 0
        self.steering_unpressed = 0
        self.low_speed_alert = False

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)

        self.steer_wind_down_enabled = Params().get_bool("SteerWindDown")
        self.steer_warning_fix_enabled = Params().get_bool("SteerWarningFix")
예제 #13
0
    def __init__(self, CP, CarController, CarState):
        self.waiting = False
        self.keep_openpilot_engaged = True
        self.disengage_due_to_slow_speed = False
        self.sm = messaging.SubMaster(['pathPlan'])
        self.op_params = opParams()
        self.alca_min_speed = self.op_params.get('alca_min_speed')
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.low_speed_alert = False

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)
예제 #14
0
    def __init__(self, CP, CarController):
        self.CP = CP
        self.CC = None

        self.frame = 0

        self.gasPressedPrev = False
        self.brakePressedPrev = False
        self.cruiseStateEnabledPrev = False
        self.displayMetricUnitsPrev = None
        self.buttonStatesPrev = BUTTON_STATES.copy()

        # *** init the major players ***
        self.CS = CarState(CP, CANBUS)
        self.VM = VehicleModel(CP)
        self.pt_cp = get_mqb_pt_can_parser(CP, CANBUS)
        self.cam_cp = get_mqb_cam_can_parser(CP, CANBUS)

        # sending if read only is False
        if CarController is not None:
            self.CC = CarController(CANBUS, CP.carFingerprint)
예제 #15
0
def plannerd_thread(sm=None, pm=None):

    config_realtime_process(2, Priority.CTRL_LOW)

    cloudlog.info("plannerd is waiting for CarParams")
    CP = car.CarParams.from_bytes(Params().get("CarParams", block=True))
    cloudlog.info("plannerd got CarParams: %s", CP.carName)

    PL = Planner(CP)
    PP = PathPlanner(CP)

    VM = VehicleModel(CP)

    if sm is None:
        sm = messaging.SubMaster([
            'carState', 'controlsState', 'radarState', 'model',
            'liveParameters', 'dragonConf'
        ],
                                 poll=['radarState', 'model'])

    if pm is None:
        pm = messaging.PubMaster(
            ['plan', 'liveLongitudinalMpc', 'pathPlan', 'liveMpc'])

    sm['liveParameters'].valid = True
    sm['liveParameters'].sensorValid = True
    sm['liveParameters'].steerRatio = CP.steerRatio
    sm['liveParameters'].stiffnessFactor = 1.0

    # dp
    sm['dragonConf'].dpSlowOnCurve = False
    sm['dragonConf'].dpAccelProfile = 0

    while True:
        sm.update()

        if sm.updated['model']:
            PP.update(sm, pm, CP, VM)
        if sm.updated['radarState']:
            PL.update(sm, pm, CP, VM, PP)
예제 #16
0
def plannerd_thread(sm=None, pm=None, arne_sm=None):
    gc.disable()

    # start the loop
    set_realtime_priority(52)

    cloudlog.info("plannerd is waiting for CarParams")
    CP = car.CarParams.from_bytes(Params().get("CarParams", block=True))
    cloudlog.info("plannerd got CarParams: %s", CP.carName)

    PL = Planner(CP)
    PP = PathPlanner(CP)

    VM = VehicleModel(CP)

    if sm is None:
        sm = messaging.SubMaster([
            'carState', 'controlsState', 'radarState', 'model',
            'liveParameters', 'liveMapData'
        ])
    if arne_sm is None:
        arne_sm = messaging_arne.SubMaster(
            ['arne182Status', 'latControl', 'modelLongButton'])
    if pm is None:
        pm = messaging.PubMaster(
            ['plan', 'liveLongitudinalMpc', 'pathPlan', 'liveMpc'])

    sm['liveParameters'].valid = True
    sm['liveParameters'].sensorValid = True
    sm['liveParameters'].steerRatio = CP.steerRatio
    sm['liveParameters'].stiffnessFactor = 1.0

    while True:
        sm.update()
        arne_sm.update(0)

        if sm.updated['model']:
            PP.update(sm, pm, CP, VM)
        if sm.updated['radarState']:
            PL.update(sm, pm, CP, VM, PP, arne_sm)
예제 #17
0
def run_mpc(v_ref=30., x_init=0., y_init=0., psi_init=0., delta_init=0.,
            l_prob=1., r_prob=1., p_prob=1.,
            poly_l=np.array([0., 0., 0., 1.8]), poly_r=np.array([0., 0., 0., -1.8]), poly_p=np.array([0., 0., 0., 0.]),
            lane_width=3.6, poly_shift=0.):

  libmpc = libmpc_py.libmpc
  libmpc.init(1.0, 3.0, 1.0, 1.0)

  mpc_solution = libmpc_py.ffi.new("log_t *")

  p_l = copy.copy(poly_l)
  p_l[3] += poly_shift
  p_r = copy.copy(poly_r)
  p_r[3] += poly_shift
  p_p = copy.copy(poly_p)
  p_p[3] += poly_shift

  CP = CarInterface.get_params("HONDA CIVIC 2016 TOURING", {})
  VM = VehicleModel(CP)

  v_ref = v_ref
  curvature_factor = VM.curvature_factor(v_ref)

  l_poly = libmpc_py.ffi.new("double[4]", map(float, p_l))
  r_poly = libmpc_py.ffi.new("double[4]", map(float, p_r))
  p_poly = libmpc_py.ffi.new("double[4]", map(float, p_p))

  cur_state = libmpc_py.ffi.new("state_t *")
  cur_state[0].x = x_init
  cur_state[0].y = y_init
  cur_state[0].psi = psi_init
  cur_state[0].delta = delta_init

  # converge in no more than 20 iterations
  for _ in range(20):
    libmpc.run_mpc(cur_state, mpc_solution, l_poly, r_poly, p_poly, l_prob, r_prob, p_prob,
                   curvature_factor, v_ref, lane_width)

  return mpc_solution
예제 #18
0
    def __init__(self, CP, sendcan=None):
        self.CP = CP

        self.frame = 0
        self.last_enable_pressed = 0
        self.last_enable_sent = 0
        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.can_invalid_count = 0

        self.cp = get_can_parser(CP)

        # *** init the major players ***
        self.CS = CarState(CP)
        self.VM = VehicleModel(CP)

        # sending if read only is False
        if sendcan is not None:
            self.sendcan = sendcan
            self.CC = CarController(self.cp.dbc_name, CP.enableCamera)

        self.compute_gb = get_compute_gb_models
예제 #19
0
  def __init__(self, CP, sendcan=None):
    self.CP = CP
    self.VM = VehicleModel(CP)
    self.idx = 0
    self.lanes = 0
    self.lkas_request = 0

    self.gas_pressed_prev = False
    self.brake_pressed_prev = False
    self.can_invalid_count = 0
    self.cruise_enabled_prev = False
    self.low_speed_alert = False

    # *** init the major players ***
    self.CS = CarState(CP)
    self.cp = get_can_parser(CP)
    self.cp_cam, self.cp_cam2 = get_camera_parser(CP)

    # sending if read only is False
    if sendcan is not None:
      self.sendcan = sendcan
      self.CC = CarController(self.cp.dbc_name, CP.carFingerprint, CP.enableCamera)
예제 #20
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.steering_unpressed = 0
        self.low_speed_alert = False
        self.silent_steer_warning = True

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)
            self.cp_loopback = self.CS.get_loopback_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)

        # KRKeegan Option to Enable Gas on Cruise
        params = Params()
        self.enable_gas_on_cruise = params.get_bool("EnableGasOnCruise")
예제 #21
0
    def __init__(self, CP, CarController):
        self.CP = CP
        self.VM = VehicleModel(CP)
        self.idx = 0
        self.lanes = 0
        self.lkas_request = 0

        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.cruise_enabled_prev = False
        self.low_speed_alert = False
        self.lkas_button_on_prev = False
        self.vEgo_prev = False
        self.turning_indicator_alert = False

        # *** init the major players ***
        self.CS = CarState(CP)
        self.cp = get_can_parser(CP)
        self.cp_cam = get_camera_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP.carFingerprint)
예제 #22
0
  def __init__(self, CP, CarController, CarState):
    self.CP = CP
    self.VM = VehicleModel(CP)

    self.frame = 0
    self.steering_unpressed = 0
    self.low_speed_alert = False
    self.silent_steer_warning = True

    if CarState is not None:
      self.CS = CarState(CP)
      self.cp = self.CS.get_can_parser(CP)
      self.cp_cam = self.CS.get_cam_can_parser(CP)
      self.cp_body = self.CS.get_body_can_parser(CP)
      self.cp_loopback = self.CS.get_loopback_can_parser(CP)

    self.CC = None
    if CarController is not None:
      self.CC = CarController(self.cp.dbc_name, CP, self.VM)

    params = Params()
    self.disable_auto_resume = params.get('jvePilot.settings.autoResume', encoding='utf8') != "1"
    self.disable_on_gas = params.get('jvePilot.settings.disableOnGas', encoding='utf8') == "1"
예제 #23
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.low_speed_alert = False

        self.CS = CarState(CP)
        self.cp = self.CS.get_can_parser(CP)
        self.cp_cam = self.CS.get_cam_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)

        # dp
        self.dragon_toyota_stock_dsu = False
        self.dragon_enable_steering_on_signal = False
        self.dragon_allow_gas = False
        self.ts_last_check = 0.
        self.dragon_lat_ctrl = True
        self.dp_last_modified = None
        self.dp_gear_check = True
예제 #24
0
    def __init__(self, CP, sendcan=None):
        self.CP = CP

        self.frame = 0
        self.last_enable_pressed = 0
        self.last_enable_sent = 0
        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.can_invalid_count = 0

        self.cp = get_can_parser(CP)  # 2018.09.10 2:53PM move to 108
        # *** init the major playeselfdrive/car/kia/carstate.pyrs ***
        # canbus = CanBus()
        self.CS = CarState(
            CP
        )  #2018.09.07 11:33AM remove copy from subaru add in canbus borrow from subaru interface.py
        self.VM = VehicleModel(CP)
        # self.cp = get_can_parser(CP)    #2018.09.05 borrow from subaru delete powertrain

        # sending if read only is False
        if sendcan is not None:
            self.sendcan = sendcan
            #2018.09.05 11:41PM change dbc_name to canbus
            self.CC = CarController(
                self.cp.dbc_name, CP.enableCamera
            )  # 2018.09.10 add CP.carFingerprint, 2018.09.18 remove fingerprint
            print("self.cc interface.py dp.dbc_name")
            print(self.cp.dbc_name)
            print("interface.py CP.carFingerprint")
            # print(CP.carFingerprint)
            print(CP.enableCamera)

    # if self.CS.CP.carFingerprint == CAR.DUMMY:   #2018.09.06 12:43AM dummy car for not use
    #    self.compute_gb = get_compute_gb_acura()
    # else:
        self.compute_gb = compute_gb_honda  #2018.09.06 2:56PM remove parentheses
예제 #25
0
    def __init__(self, CP, CarController, CarState):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.steer_warning = 0
        self.steering_unpressed = 0
        self.low_speed_alert = False

        ####added by jc01rho
        self.flag_pcmEnable_able = True
        self.flag_pcmEnable_initialSet = False

        self.initial_pcmEnable_counter = 0

        if CarState is not None:
            self.CS = CarState(CP)
            self.cp = self.CS.get_can_parser(CP)
            self.cp_cam = self.CS.get_cam_can_parser(CP)
            self.cp_body = self.CS.get_body_can_parser(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name, CP, self.VM)
예제 #26
0
    def __init__(self, CP, CarController):
        self.CP = CP

        self.frame = 0
        self.last_enable_pressed = 0
        self.last_enable_sent = 0
        self.gas_pressed_prev = False
        self.brake_pressed_prev = False

        self.cp = get_can_parser(CP)
        self.cp_cam = get_cam_can_parser(CP)

        # *** init the major players ***
        self.CS = CarState(CP)
        self.VM = VehicleModel(CP)

        self.CC = None
        if CarController is not None:
            self.CC = CarController(self.cp.dbc_name)

        if self.CS.CP.carFingerprint == CAR.ACURA_ILX:
            self.compute_gb = get_compute_gb_acura()
        else:
            self.compute_gb = compute_gb_honda
예제 #27
0
    def __init__(self, CP, sendcan=None):
        self.CP = CP
        self.VM = VehicleModel(CP)

        self.frame = 0
        self.gas_pressed_prev = False
        self.brake_pressed_prev = False
        self.can_invalid_count = 0
        self.cruise_enabled_prev = False

        # Double cruise stalk pull enable
        # 2 taps of on/off will enable/disable
        self.last_cruise_stalk_pull_time = 0
        self.cruise_stalk_pull_time = 0
        #self.cruise_stalk_pull = False in carstate
        self.last_cruise_stalk_pull = False
        self.double_stalk_pull = False
        self.user_enabled = False
        self.current_time = 0
        self.last_angle_steers = 0

        #CAN check between arduino and OP
        self.can_check = 0
        self.last_can_check_time = 0

        # *** init the major players ***
        self.CS = CarState(CP)

        self.cp = get_can_parser(CP)

        # sending if read only is False
        if sendcan is not None:
            self.sendcan = sendcan
            self.CC = CarController(self.cp.dbc_name, CP.carFingerprint,
                                    CP.enableCamera, CP.enableDsu,
                                    CP.enableApgs)
예제 #28
0
  def __init__(self, sm=None, pm=None, can_sock=None):
    config_realtime_process(3, Priority.CTRL_HIGH)

    # Setup sockets
    self.pm = pm
    if self.pm is None:
      self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState',
                                     'carControl', 'carEvents', 'carParams'])

    self.sm = sm
    if self.sm is None:
      self.sm = messaging.SubMaster(['thermal', 'health', 'model', 'liveCalibration',
                                     'dMonitoringState', 'plan', 'pathPlan', 'liveLocationKalman'])

    self.can_sock = can_sock
    if can_sock is None:
      can_timeout = None if os.environ.get('NO_CAN_TIMEOUT', False) else 100
      self.can_sock = messaging.sub_sock('can', timeout=can_timeout)

    # wait for one health and one CAN packet
    hw_type = messaging.recv_one(self.sm.sock['health']).health.hwType
    has_relay = hw_type in [HwType.blackPanda, HwType.uno, HwType.dos]
    print("Waiting for CAN messages...")
    get_one_can(self.can_sock)

    self.CI, self.CP = get_car(self.can_sock, self.pm.sock['sendcan'], has_relay)

    # read params
    params = Params()
    self.is_metric = params.get("IsMetric", encoding='utf8') == "1"
    self.is_ldw_enabled = params.get("IsLdwEnabled", encoding='utf8') == "1"
    internet_needed = (params.get("Offroad_ConnectivityNeeded", encoding='utf8') is not None) and (params.get("DisableUpdates") != b"1")
    community_feature_toggle = params.get("CommunityFeaturesToggle", encoding='utf8') == "1"
    openpilot_enabled_toggle = params.get("OpenpilotEnabledToggle", encoding='utf8') == "1"
    passive = params.get("Passive", encoding='utf8') == "1" or \
              internet_needed or not openpilot_enabled_toggle

    # detect sound card presence and ensure successful init
    sounds_available = HARDWARE.get_sound_card_online()

    car_recognized = self.CP.carName != 'mock'
    # If stock camera is disconnected, we loaded car controls and it's not dashcam mode
    controller_available = self.CP.enableCamera and self.CI.CC is not None and not passive and not self.CP.dashcamOnly
    community_feature_disallowed = self.CP.communityFeature and not community_feature_toggle
    self.read_only = not car_recognized or not controller_available or \
                       self.CP.dashcamOnly or community_feature_disallowed
    if self.read_only:
      self.CP.safetyModel = car.CarParams.SafetyModel.noOutput

    # Write CarParams for radard and boardd safety mode
    cp_bytes = self.CP.to_bytes()
    params.put("CarParams", cp_bytes)
    put_nonblocking("CarParamsCache", cp_bytes)

    self.CC = car.CarControl.new_message()
    self.AM = AlertManager()
    self.events = Events()

    self.LoC = LongControl(self.CP, self.CI.compute_gb)
    self.VM = VehicleModel(self.CP)

    if self.CP.lateralTuning.which() == 'pid':
      self.LaC = LatControlPID(self.CP)
    elif self.CP.lateralTuning.which() == 'indi':
      self.LaC = LatControlINDI(self.CP)
    elif self.CP.lateralTuning.which() == 'lqr':
      self.LaC = LatControlLQR(self.CP)

    self.state = State.disabled
    self.enabled = False
    self.active = False
    self.can_rcv_error = False
    self.soft_disable_timer = 0
    self.v_cruise_kph = 255
    self.v_cruise_kph_last = 0
    self.mismatch_counter = 0
    self.can_error_counter = 0
    self.last_blinker_frame = 0
    self.saturated_count = 0
    self.distance_traveled = 0
    self.last_functional_fan_frame = 0
    self.events_prev = []
    self.current_alert_types = [ET.PERMANENT]

    self.sm['liveCalibration'].calStatus = Calibration.CALIBRATED
    self.sm['thermal'].freeSpace = 1.
    self.sm['dMonitoringState'].events = []
    self.sm['dMonitoringState'].awarenessStatus = 1.
    self.sm['dMonitoringState'].faceDetected = False

    self.startup_event = get_startup_event(car_recognized, controller_available, hw_type)

    if not sounds_available:
      self.events.add(EventName.soundsUnavailable, static=True)
    if internet_needed:
      self.events.add(EventName.internetConnectivityNeeded, static=True)
    if community_feature_disallowed:
      self.events.add(EventName.communityFeatureDisallowed, static=True)
    if not car_recognized:
      self.events.add(EventName.carUnrecognized, static=True)
    if hw_type == HwType.whitePanda:
      self.events.add(EventName.whitePandaUnsupported, static=True)

    # controlsd is driven by can recv, expected at 100Hz
    self.rk = Ratekeeper(100, print_delay_threshold=None)
    self.prof = Profiler(False)  # off by default
예제 #29
0
    def __init__(self, sm=None, pm=None, can_sock=None):
        gc.disable()
        set_realtime_priority(3)

        self.trace_log = trace1.Loger("controlsd")
        # Setup sockets
        self.pm = pm
        if self.pm is None:
            self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState', \
                                           'carControl', 'carEvents', 'carParams'])

        self.sm = sm
        if self.sm is None:
            socks = [
                'thermal', 'health', 'model', 'liveCalibration',
                'dMonitoringState', 'plan', 'pathPlan', 'liveLocationKalman'
            ]
            self.sm = messaging.SubMaster(socks,
                                          ignore_alive=['dMonitoringState'])

            #self.sm = messaging.SubMaster(['thermal', 'health', 'model', 'liveCalibration', \
            #                               'dMonitoringState', 'plan', 'pathPlan', 'liveLocationKalman'])

        print(" start_Controls  messages...1")
        self.can_sock = can_sock
        if can_sock is None:
            can_timeout = None if os.environ.get('NO_CAN_TIMEOUT',
                                                 False) else 100
            self.can_sock = messaging.sub_sock('can', timeout=can_timeout)

        print(" start_Controls  messages...2")
        # wait for one health and one CAN packet
        hw_type = messaging.recv_one(self.sm.sock['health']).health.hwType
        has_relay = hw_type in [HwType.blackPanda, HwType.uno]
        print("Waiting for CAN messages...")
        messaging.get_one_can(self.can_sock)

        self.CI, self.CP = get_car(self.can_sock, self.pm.sock['sendcan'],
                                   has_relay)

        # read params
        params = Params()
        self.is_metric = params.get("IsMetric", encoding='utf8') == "1"
        self.is_ldw_enabled = params.get("IsLdwEnabled",
                                         encoding='utf8') == "1"
        internet_needed = params.get("Offroad_ConnectivityNeeded",
                                     encoding='utf8') is not None
        community_feature_toggle = params.get("CommunityFeaturesToggle",
                                              encoding='utf8') == "1"
        openpilot_enabled_toggle = params.get("OpenpilotEnabledToggle",
                                              encoding='utf8') == "1"
        passive = params.get("Passive", encoding='utf8') == "1" or \
                  internet_needed or not openpilot_enabled_toggle

        # detect sound card presence and ensure successful init
        sounds_available = not os.path.isfile('/EON') or (os.path.isfile('/proc/asound/card0/state') \
                                and open('/proc/asound/card0/state').read().strip() == 'ONLINE')

        car_recognized = self.CP.carName != 'mock'
        # If stock camera is disconnected, we loaded car controls and it's not dashcam mode
        controller_available = self.CP.enableCamera and self.CI.CC is not None and not passive
        community_feature_disallowed = self.CP.communityFeature and not community_feature_toggle
        self.read_only = not car_recognized or not controller_available or \
                           self.CP.dashcamOnly or community_feature_disallowed
        if self.read_only:
            self.CP.safetyModel = car.CarParams.SafetyModel.noOutput

        # Write CarParams for radard and boardd safety mode
        cp_bytes = self.CP.to_bytes()
        params.put("CarParams", cp_bytes)
        put_nonblocking("CarParamsCache", cp_bytes)
        put_nonblocking("LongitudinalControl",
                        "1" if self.CP.openpilotLongitudinalControl else "0")

        self.CC = car.CarControl.new_message()
        self.AM = AlertManager()
        self.events = Events()

        self.LoC = LongControl(self.CP, self.CI.compute_gb)
        self.VM = VehicleModel(self.CP)

        print('self.CP.lateralTuning.which()={}'.format(
            self.CP.lateralTuning.which()))
        if self.CP.lateralTuning.which() == 'pid':
            self.LaC = LatControlPID(self.CP)
        elif self.CP.lateralTuning.which() == 'indi':
            self.LaC = LatControlINDI(self.CP)
        elif self.CP.lateralTuning.which() == 'lqr':
            self.LaC = LatControlLQR(self.CP)

        self.state = State.disabled
        self.enabled = False
        self.active = False
        self.can_rcv_error = False
        self.soft_disable_timer = 0
        self.v_cruise_kph = 255
        self.v_cruise_kph_last = 0
        self.mismatch_counter = 0
        self.can_error_counter = 0
        self.consecutive_can_error_count = 0
        self.last_blinker_frame = 0
        self.saturated_count = 0
        self.events_prev = []
        self.current_alert_types = []

        self.sm['liveCalibration'].calStatus = Calibration.INVALID
        self.sm['thermal'].freeSpace = 1.
        self.sm['dMonitoringState'].events = []
        self.sm['dMonitoringState'].awarenessStatus = 1.
        self.sm['dMonitoringState'].faceDetected = False

        self.startup_event = get_startup_event(car_recognized,
                                               controller_available, hw_type)

        if not sounds_available:
            self.events.add(EventName.soundsUnavailable, static=True)
        if internet_needed:
            self.events.add(EventName.internetConnectivityNeeded, static=True)
        if community_feature_disallowed:
            self.events.add(EventName.communityFeatureDisallowed, static=True)
        if self.read_only and not passive:
            self.events.add(EventName.carUnrecognized, static=True)
        # if hw_type == HwType.whitePanda:
        #   self.events.add(EventName.whitePandaUnsupported, static=True)

        uname = subprocess.check_output(["uname", "-v"],
                                        encoding='utf8').strip()
        if uname == "#1 SMP PREEMPT Wed Jun 10 12:40:53 PDT 2020":
            self.events.add(EventName.neosUpdateRequired, static=True)

        # controlsd is driven by can recv, expected at 100Hz
        self.rk = Ratekeeper(100, print_delay_threshold=None)
        self.prof = Profiler(False)  # off by default

        self.hyundai_lkas = self.read_only  #read_only
        self.init_flag = True
예제 #30
0
파일: radard.py 프로젝트: wlrnet/chffrplus
def radard_thread(gctx=None):
  set_realtime_priority(2)

  # wait for stats about the car to come in from controls
  cloudlog.info("radard is waiting for CarParams")
  CP = car.CarParams.from_bytes(Params().get("CarParams", block=True))
  mocked= CP.radarName == "mock"
  VM = VehicleModel(CP)
  cloudlog.info("radard got CarParams")

  # import the radar from the fingerprint
  cloudlog.info("radard is importing %s", CP.radarName)
  exec('from selfdrive.radar.'+CP.radarName+'.interface import RadarInterface')

  context = zmq.Context()

  # *** subscribe to features and model from visiond
  poller = zmq.Poller()
  model = messaging.sub_sock(context, service_list['model'].port, conflate=True, poller=poller)
  live100 = messaging.sub_sock(context, service_list['live100'].port, conflate=True, poller=poller)

  PP = PathPlanner()
  RI = RadarInterface()

  last_md_ts = 0
  last_l100_ts = 0

  # *** publish live20 and liveTracks
  live20 = messaging.pub_sock(context, service_list['live20'].port)
  liveTracks = messaging.pub_sock(context, service_list['liveTracks'].port)

  path_x = np.arange(0.0, 140.0, 0.1)    # 140 meters is max

  # Time-alignment
  rate = 20.   # model and radar are both at 20Hz
  tsv = 1./rate
  v_len = 20         # how many speed data points to remember for t alignment with rdr data

  active = 0
  steer_angle = 0.
  steer_override = False

  tracks = defaultdict(dict)

  # Kalman filter stuff:
  ekfv = EKFV1D()
  speedSensorV = SimpleSensor(XV, 1, 2)

  # v_ego
  v_ego = None
  v_ego_array = np.zeros([2, v_len])
  v_ego_t_aligned = 0.

  rk = Ratekeeper(rate, print_delay_threshold=np.inf)
  while 1:
    rr = RI.update()

    ar_pts = {}
    for pt in rr.points:
      ar_pts[pt.trackId] = [pt.dRel + RDR_TO_LDR, pt.yRel, pt.vRel, pt.measured]

    # receive the live100s
    l100 = None
    md = None

    for socket, event in poller.poll(0):
      if socket is live100:
        l100 = messaging.recv_one(socket)
      elif socket is model:
        md = messaging.recv_one(socket)

    if l100 is not None:
      active = l100.live100.active
      v_ego = l100.live100.vEgo
      steer_angle = l100.live100.angleSteers
      steer_override = l100.live100.steerOverride

      v_ego_array = np.append(v_ego_array, [[v_ego], [float(rk.frame)/rate]], 1)
      v_ego_array = v_ego_array[:, 1:]

      last_l100_ts = l100.logMonoTime

    if v_ego is None:
      continue

    if md is not None:
      last_md_ts = md.logMonoTime

    # *** get path prediction from the model ***
    PP.update(v_ego, md)

    # run kalman filter only if prob is high enough
    if PP.lead_prob > 0.7:
      ekfv.update(speedSensorV.read(PP.lead_dist, covar=PP.lead_var))
      ekfv.predict(tsv)
      ar_pts[VISION_POINT] = (float(ekfv.state[XV]), np.polyval(PP.d_poly, float(ekfv.state[XV])),
                              float(ekfv.state[SPEEDV]), False)
    else:
      ekfv.state[XV] = PP.lead_dist
      ekfv.covar = (np.diag([PP.lead_var, ekfv.var_init]))
      ekfv.state[SPEEDV] = 0.
      if VISION_POINT in ar_pts:
        del ar_pts[VISION_POINT]

    # *** compute the likely path_y ***
    if (active and not steer_override) or mocked:
      # use path from model (always when mocking as steering is too noisy)
      path_y = np.polyval(PP.d_poly, path_x)
    else:
      # use path from steer, set angle_offset to 0 it does not only report the physical offset
      path_y = calc_lookahead_offset(v_ego, steer_angle, path_x, VM, angle_offset=0)[0]

    # *** remove missing points from meta data ***
    for ids in tracks.keys():
      if ids not in ar_pts:
        tracks.pop(ids, None)

    # *** compute the tracks ***
    for ids in ar_pts:
      # ignore standalone vision point, unless we are mocking the radar
      if ids == VISION_POINT and not mocked:
        continue
      rpt = ar_pts[ids]

      # align v_ego by a fixed time to align it with the radar measurement
      cur_time = float(rk.frame)/rate
      v_ego_t_aligned = np.interp(cur_time - RI.delay, v_ego_array[1], v_ego_array[0])
      d_path = np.sqrt(np.amin((path_x - rpt[0]) ** 2 + (path_y - rpt[1]) ** 2))
      # add sign
      d_path *= np.sign(rpt[1] - np.interp(rpt[0], path_x, path_y))

      # create the track if it doesn't exist or it's a new track
      if ids not in tracks:
        tracks[ids] = Track()
      tracks[ids].update(rpt[0], rpt[1], rpt[2], d_path, v_ego_t_aligned, rpt[3], steer_override)

    # allow the vision model to remove the stationary flag if distance and rel speed roughly match
    if VISION_POINT in ar_pts:
      fused_id = None
      best_score = NO_FUSION_SCORE
      for ids in tracks:
        dist_to_vision = np.sqrt((0.5*(ar_pts[VISION_POINT][0] - tracks[ids].dRel)) ** 2 + (2*(ar_pts[VISION_POINT][1] - tracks[ids].yRel)) ** 2)
        rel_speed_diff = abs(ar_pts[VISION_POINT][2] - tracks[ids].vRel)
        tracks[ids].update_vision_score(dist_to_vision, rel_speed_diff)
        if best_score > tracks[ids].vision_score:
          fused_id = ids
          best_score = tracks[ids].vision_score

      if fused_id is not None:
        tracks[fused_id].vision_cnt += 1
        tracks[fused_id].update_vision_fusion()

    if DEBUG:
      print "NEW CYCLE"
      if VISION_POINT in ar_pts:
        print "vision", ar_pts[VISION_POINT]

    idens = tracks.keys()
    track_pts = np.array([tracks[iden].get_key_for_cluster() for iden in idens])

    # If we have multiple points, cluster them
    if len(track_pts) > 1:
      link = linkage_vector(track_pts, method='centroid')
      cluster_idxs = fcluster(link, 2.5, criterion='distance')
      clusters = [None]*max(cluster_idxs)

      for idx in xrange(len(track_pts)):
        cluster_i = cluster_idxs[idx]-1

        if clusters[cluster_i] == None:
          clusters[cluster_i] = Cluster()
        clusters[cluster_i].add(tracks[idens[idx]])
    elif len(track_pts) == 1:
      # TODO: why do we need this?
      clusters = [Cluster()]
      clusters[0].add(tracks[idens[0]])
    else:
      clusters = []

    if DEBUG:
      for i in clusters:
        print i
    # *** extract the lead car ***
    lead_clusters = [c for c in clusters
                     if c.is_potential_lead(v_ego)]
    lead_clusters.sort(key=lambda x: x.dRel)
    lead_len = len(lead_clusters)

    # *** extract the second lead from the whole set of leads ***
    lead2_clusters = [c for c in lead_clusters
                      if c.is_potential_lead2(lead_clusters)]
    lead2_clusters.sort(key=lambda x: x.dRel)
    lead2_len = len(lead2_clusters)

    # *** publish live20 ***
    dat = messaging.new_message()
    dat.init('live20')
    dat.live20.mdMonoTime = last_md_ts
    dat.live20.canMonoTimes = list(rr.canMonoTimes)
    dat.live20.radarErrors = list(rr.errors)
    dat.live20.l100MonoTime = last_l100_ts
    if lead_len > 0:
      lead_clusters[0].toLive20(dat.live20.leadOne)
      if lead2_len > 0:
        lead2_clusters[0].toLive20(dat.live20.leadTwo)
      else:
        dat.live20.leadTwo.status = False
    else:
      dat.live20.leadOne.status = False

    dat.live20.cumLagMs = -rk.remaining*1000.
    live20.send(dat.to_bytes())

    # *** publish tracks for UI debugging (keep last) ***
    dat = messaging.new_message()
    dat.init('liveTracks', len(tracks))

    for cnt, ids in enumerate(tracks.keys()):
      if DEBUG:
        print "id: %4.0f x:  %4.1f  y: %4.1f  vr: %4.1f d: %4.1f  va: %4.1f  vl: %4.1f  vlk: %4.1f alk: %4.1f  s: %1.0f" % \
          (ids, tracks[ids].dRel, tracks[ids].yRel, tracks[ids].vRel,
           tracks[ids].dPath, tracks[ids].vLat,
           tracks[ids].vLead, tracks[ids].vLeadK,
           tracks[ids].aLeadK,
           tracks[ids].stationary)
      dat.liveTracks[cnt].trackId = ids
      dat.liveTracks[cnt].dRel = float(tracks[ids].dRel)
      dat.liveTracks[cnt].yRel = float(tracks[ids].yRel)
      dat.liveTracks[cnt].vRel = float(tracks[ids].vRel)
      dat.liveTracks[cnt].aRel = float(tracks[ids].aRel)
      dat.liveTracks[cnt].stationary = tracks[ids].stationary
      dat.liveTracks[cnt].oncoming = tracks[ids].oncoming
    liveTracks.send(dat.to_bytes())

    rk.monitor_time()