openpilot/selfdrive/car/ocelot/carstate.py

182 lines
6.7 KiB
Python
Raw Normal View History

2022-02-21 14:05:24 -07:00
from cereal import car
from common.numpy_fast import mean
from opendbc.can.can_define import CANDefine
from selfdrive.car.interfaces import CarStateBase
from opendbc.can.parser import CANParser
from selfdrive.config import Conversions as CV
2022-04-03 13:07:33 -06:00
from selfdrive.car.ocelot.values import DBC, BUTTON_STATES
2022-02-21 14:05:24 -07:00
class CarState(CarStateBase):
def __init__(self, CP):
super().__init__(CP)
print(DBC[CP.carFingerprint]['chassis'])
can_define = CANDefine(DBC[CP.carFingerprint]['chassis'])
self.shifter_values = can_define.dv["GEAR_PACKET"]['GEAR']
self.setSpeed = 0
self.enabled = False
self.oldEnabled = False
2022-04-03 13:07:33 -06:00
self.oldSpeedUp = False
self.oldSpeedDn = False
self.setSpeed = 10
self.buttonStates = BUTTON_STATES.copy()
2022-02-21 14:05:24 -07:00
def update(self, cp, cp_body):
ret = car.CarState.new_message()
#Car specific information
2022-04-03 13:07:33 -06:00
ret.doorOpen =any([cp_body.vl["DOORS"]['FL_DOOR'], cp_body.vl["DOORS"]['FR_DOOR'],
cp_body.vl["DOORS"]['RL_DOOR'], cp_body.vl["DOORS"]['RR_DOOR']]) != 0
2022-04-03 15:41:33 -06:00
ret.seatbeltUnlatched = bool(cp_body.vl["SEATBELTS"]["DRIVER_SEATBELT"])
2022-04-03 13:07:33 -06:00
ret.leftBlinker = (cp_body.vl["SIGNAL_STALK"]['TURN_SIGNALS'] == 1)
ret.rightBlinker = (cp_body.vl["SIGNAL_STALK"]['TURN_SIGNALS'] == 3)
ret.espDisabled = False #cp_body.vl["ABS"]['ESP_STATUS']
ret.wheelSpeeds.fl = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_FL'] * CV.MPH_TO_MS
ret.wheelSpeeds.fr = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_FR'] * CV.MPH_TO_MS
ret.wheelSpeeds.rl = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_RL'] * CV.MPH_TO_MS
ret.wheelSpeeds.rr = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_RR'] * CV.MPH_TO_MS
2022-04-03 15:41:33 -06:00
ret.brakeLights = bool(cp_body.vl["GAS_BRAKE"]['BRAKE_PRESSED'])
2022-04-03 13:07:33 -06:00
can_gear = int(cp_body.vl["GEAR_PACKET"]['GEAR'])
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
2022-02-21 14:05:24 -07:00
#Ibooster data
2022-04-03 15:41:33 -06:00
ret.brakePressed = bool(cp.vl["OCELOT_BRAKE_STATUS"]['DRIVER_BRAKE_APPLIED'])
2022-02-21 14:05:24 -07:00
2022-04-03 15:41:33 -06:00
ret.gas = ((cp.vl["PEDAL_GAS_SENSOR"]['PED_GAS'] / 2) + cp.vl["PEDAL_GAS_SENSOR"]['PED_GAS2']) / 2.
2022-04-03 13:07:33 -06:00
ret.gasPressed = ret.gas > 260
2022-02-21 14:05:24 -07:00
2022-04-03 13:07:33 -06:00
# ret.gas = 0
# ret.gasPressed = False
2022-02-21 14:05:24 -07:00
#calculate speed from wheel speeds
ret.vEgoRaw = mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
ret.standstill = ret.vEgoRaw < 0.001
#Toyota SAS
2022-04-03 15:41:33 -06:00
ret.steeringAngleDeg = cp_body.vl["STEER_ANGLE_SENSOR"]['STEER_ANGLE']
ret.steeringRateDeg = cp_body.vl["VSC"]['STEER_RATE']
2022-02-21 14:05:24 -07:00
#Steering information from smart standin ECU
2022-04-03 13:07:33 -06:00
raw_torque = 0
2022-04-03 15:41:33 -06:00
if (cp_body.vl["STEER_TORQUE"]['DIRECTION'] == 1):
raw_torque = cp_body.vl["STEER_TORQUE"]['DRIVER_TORQUE'] * -1
2022-04-03 13:07:33 -06:00
else:
2022-04-03 15:41:33 -06:00
raw_torque = cp_body.vl["STEER_TORQUE"]['DRIVER_TORQUE']
2022-04-03 13:07:33 -06:00
ret.steeringTorque = raw_torque
# TODO: handle steering actuator
ret.steeringTorqueEps = raw_torque * 10 #cp.vl["STEERING_STATUS"]['STEER_TORQUE_EPS']
2022-02-21 14:05:24 -07:00
ret.steeringPressed = False #abs(ret.steeringTorque) > STEER_THRESHOLD
ret.steerWarning = False #cp.vl["STEERING_STATUS"]['STEERING_OK'] != 0
2022-04-03 15:41:33 -06:00
main_on = bool(cp_body.vl["CRUISE_BUTTONS"]['MAIN_ON'])
2022-04-03 13:07:33 -06:00
ret.cruiseState.available = main_on
2022-02-21 14:05:24 -07:00
ret.cruiseState.standstill = False
ret.cruiseState.nonAdaptive = False
2022-04-03 15:41:33 -06:00
self.buttonStates["accelCruise"] = bool(cp_body.vl["CRUISE_BUTTONS"]['SET_PLUS'])
self.buttonStates["decelCruise"] = bool(cp_body.vl["CRUISE_BUTTONS"]['SET_MINUS'])
self.buttonStates["setCruise"] = bool(cp_body.vl["CRUISE_BUTTONS"]['CANCEL'])
2022-04-03 13:07:33 -06:00
if not main_on:
self.enabled = False
2022-02-21 14:05:24 -07:00
2022-04-03 15:41:33 -06:00
if bool(cp_body.vl["CRUISE_BUTTONS"]['MAIN_ON']):
2022-04-03 13:07:33 -06:00
if bool(self.buttonStates["setCruise"]) and not self.oldEnabled:
self.enabled = not self.enabled
if self.enabled:
self.setSpeed = (int(round((ret.vEgo * CV.MS_TO_MPH)/5)) * 5)
if ret.standstill:
self.setSpeed = 10
2022-02-21 14:05:24 -07:00
#increase or decrease speed in 5mph increments
2022-04-03 15:41:33 -06:00
if cp_body.vl["CRUISE_BUTTONS"]['SET_PLUS']:
2022-04-03 13:07:33 -06:00
self.setSpeed = self.setSpeed + 5
2022-02-21 14:05:24 -07:00
2022-04-03 15:41:33 -06:00
if cp_body.vl["CRUISE_BUTTONS"]['SET_MINUS']:
2022-04-03 13:07:33 -06:00
self.setSpeed = self.setSpeed - 5
2022-02-21 14:05:24 -07:00
2022-04-03 13:07:33 -06:00
ret.cruiseState.speed = self.setSpeed * CV.MPH_TO_MS
2022-02-21 14:05:24 -07:00
ret.cruiseState.enabled = self.enabled
2022-04-03 13:07:33 -06:00
ret.stockAeb = False
ret.leftBlindspot = False
ret.rightBlindspot = False
self.oldEnabled = bool(self.buttonStates["setCruise"])
self.oldSpeedDn = bool(self.buttonStates["decelCruise"])
self.oldSpeedUp = bool(self.buttonStates["accelCruise"])
2022-02-21 14:05:24 -07:00
return ret
@staticmethod
def get_can_parser(CP):
signals = [
# sig_name, sig_address, default
2022-04-03 13:07:33 -06:00
("BRAKE_OK", "OCELOT_BRAKE_STATUS", 0),
("DRIVER_BRAKE_APPLIED", "OCELOT_BRAKE_STATUS", 0),
("PED_GAS", "PEDAL_GAS_SENSOR", 0),
("PED_GAS2", "PEDAL_GAS_SENSOR", 0),
2022-02-21 14:05:24 -07:00
]
checks = [
2022-04-03 13:07:33 -06:00
("OCELOT_BRAKE_STATUS", 80),
("PEDAL_GAS_SENSOR", 50),
2022-02-21 14:05:24 -07:00
]
2022-04-03 15:41:33 -06:00
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)
2022-02-21 14:05:24 -07:00
@staticmethod
def get_body_can_parser(CP):
signals = [
2022-04-03 13:07:33 -06:00
("MAIN_ON", "CRUISE_BUTTONS", 0),
("SET_MINUS", "CRUISE_BUTTONS", 0),
("SET_PLUS", "CRUISE_BUTTONS", 0),
("CANCEL", "CRUISE_BUTTONS", 0),
("STEER_ANGLE", "STEER_ANGLE_SENSOR", 0),
("DIRECTION", "STEER_TORQUE", 0),
("DRIVER_TORQUE", "STEER_TORQUE", 0),
("BRAKE_PRESSED", "GAS_BRAKE", 0),
2022-04-03 15:41:33 -06:00
("FL_DOOR", "DOORS", 0),
("FR_DOOR", "DOORS", 0),
("RL_DOOR", "DOORS", 0),
("RR_DOOR", "DOORS", 0),
2022-04-03 13:07:33 -06:00
("DRIVER_SEATBELT", "SEATBELTS", 0),
("WHEEL_FL", "WHEEL_SPEEDS", 0),
("WHEEL_FR", "WHEEL_SPEEDS", 0),
("WHEEL_RL", "WHEEL_SPEEDS", 0),
("WHEEL_RR", "WHEEL_SPEEDS", 0),
("STEER_RATE", "VSC", 0),
("GEAR", "GEAR_PACKET", 0),
("TURN_SIGNALS", "SIGNAL_STALK", 0),
2022-02-21 14:05:24 -07:00
]
# use steering message to check if panda is connected to frc
checks = [
2022-04-03 15:41:33 -06:00
("STEER_ANGLE_SENSOR", 50),
("WHEEL_SPEEDS", 50),
("CRUISE_BUTTONS", 50),
2022-02-21 14:05:24 -07:00
]
# if CP.carFingerprint == CAR.SMART_ROADSTER_COUPE:
# signals.append(("RIGHT_DOOR", "BODYCONTROL",0))
# signals.append(("LEFT_DOOR", "BODYCONTROL",0))
# signals.append(("LEFT_SIGNAL", "BODYCONTROL",0))
# signals.append(("RIGHT_SIGNAL", "BODYCONTROL",0))
# signals.append(("ESP_STATUS", "ABS",0))
# signals.append(("WHEELSPEED_FL", "SMARTROADSTERWHEELSPEEDS",0))
# signals.append(("WHEELSPEED_FR", "SMARTROADSTERWHEELSPEEDS",0))
# signals.append(("WHEELSPEED_RL", "SMARTROADSTERWHEELSPEEDS",0))
# signals.append(("WHEELSPEED_RR", "SMARTROADSTERWHEELSPEEDS",0))
# signals.append(("BRAKEPEDAL", "ABS",0))
# signals.append(("GEARPOSITION","GEARBOX", 0))
2022-04-03 15:41:33 -06:00
return CANParser(DBC[CP.carFingerprint]['chassis'], signals, checks, 0)