add signals
parent
0f133c61a1
commit
5ffa766bdf
2
opendbc
2
opendbc
|
@ -1 +1 @@
|
||||||
Subproject commit 7994ffa766f5367dc39e9474a59b2b9abe3d3f64
|
Subproject commit 4925c2a9993b0587a052856626614a976d8e616b
|
|
@ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine
|
||||||
from selfdrive.car.interfaces import CarStateBase
|
from selfdrive.car.interfaces import CarStateBase
|
||||||
from opendbc.can.parser import CANParser
|
from opendbc.can.parser import CANParser
|
||||||
from selfdrive.config import Conversions as CV
|
from selfdrive.config import Conversions as CV
|
||||||
from selfdrive.car.ocelot.values import CAR, DBC, STEER_THRESHOLD
|
from selfdrive.car.ocelot.values import DBC, BUTTON_STATES
|
||||||
|
|
||||||
|
|
||||||
class CarState(CarStateBase):
|
class CarState(CarStateBase):
|
||||||
|
@ -16,34 +16,37 @@ class CarState(CarStateBase):
|
||||||
self.setSpeed = 0
|
self.setSpeed = 0
|
||||||
self.enabled = False
|
self.enabled = False
|
||||||
self.oldEnabled = False
|
self.oldEnabled = False
|
||||||
|
self.oldSpeedUp = False
|
||||||
|
self.oldSpeedDn = False
|
||||||
|
self.setSpeed = 10
|
||||||
|
self.buttonStates = BUTTON_STATES.copy()
|
||||||
|
|
||||||
def update(self, cp, cp_body):
|
def update(self, cp, cp_body):
|
||||||
ret = car.CarState.new_message()
|
ret = car.CarState.new_message()
|
||||||
|
|
||||||
#Car specific information
|
#Car specific information
|
||||||
if self.CP.carFingerprint == CAR.SMART_ROADSTER_COUPE:
|
ret.doorOpen =any([cp_body.vl["DOORS"]['FL_DOOR'], cp_body.vl["DOORS"]['FR_DOOR'],
|
||||||
ret.doorOpen = False #any([cp_body.vl["BODYCONTROL"]['RIGHT_DOOR'], cp_body.vl["BODYCONTROL"]['LEFT_DOOR']]) != 0
|
cp_body.vl["DOORS"]['RL_DOOR'], cp_body.vl["DOORS"]['RR_DOOR']]) != 0
|
||||||
ret.seatbeltUnlatched = False
|
ret.seatbeltUnlatched = cp_body.vl["SEATBELTS"]["DRIVER_SEATBELT"]
|
||||||
ret.leftBlinker = False #cp_body.vl["BODYCONTROL"]['LEFT_SIGNAL']
|
ret.leftBlinker = (cp_body.vl["SIGNAL_STALK"]['TURN_SIGNALS'] == 1)
|
||||||
ret.rightBlinker = False #cp_body.vl["BODYCONTROL"]['RIGHT_SIGNAL']
|
ret.rightBlinker = (cp_body.vl["SIGNAL_STALK"]['TURN_SIGNALS'] == 3)
|
||||||
ret.espDisabled = False #cp_body.vl["ABS"]['ESP_STATUS']
|
ret.espDisabled = False #cp_body.vl["ABS"]['ESP_STATUS']
|
||||||
ret.wheelSpeeds.fl = 0 #cp_body.vl["SMARTROADSTERWHEELSPEEDS"]['WHEELSPEED_FL'] * CV.MPH_TO_MS
|
ret.wheelSpeeds.fl = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_FL'] * CV.MPH_TO_MS
|
||||||
ret.wheelSpeeds.fr = 0 #cp_body.vl["SMARTROADSTERWHEELSPEEDS"]['WHEELSPEED_FR'] * CV.MPH_TO_MS
|
ret.wheelSpeeds.fr = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_FR'] * CV.MPH_TO_MS
|
||||||
ret.wheelSpeeds.rl = 0 #cp_body.vl["SMARTROADSTERWHEELSPEEDS"]['WHEELSPEED_RL'] * CV.MPH_TO_MS
|
ret.wheelSpeeds.rl = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_RL'] * CV.MPH_TO_MS
|
||||||
ret.wheelSpeeds.rr = 0 #cp_body.vl["SMARTROADSTERWHEELSPEEDS"]['WHEELSPEED_RR'] * CV.MPH_TO_MS
|
ret.wheelSpeeds.rr = cp_body.vl["WHEEL_SPEEDS"]['WHEEL_RR'] * CV.MPH_TO_MS
|
||||||
ret.brakeLights = False #cp_body.vl["ABS"]['BRAKEPEDAL']
|
ret.brakeLights = cp_body.vl["GAS_BRAKE"]['BRAKE_PRESSED']
|
||||||
can_gear = 0 #int(cp_body.vl["GEARBOX"]['GEARPOSITION'])
|
can_gear = int(cp_body.vl["GEAR_PACKET"]['GEAR'])
|
||||||
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
|
ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None))
|
||||||
|
|
||||||
#Ibooster data
|
#Ibooster data
|
||||||
ret.brakePressed = False #cp.vl["BRAKE_STATUS"]['IBOOSTER_BRAKE_APPLIED']
|
ret.brakePressed = cp.vl["OCELOT_BRAKE_STATUS"]['DRIVER_BRAKE_APPLIED']
|
||||||
|
|
||||||
# if CP.enableGasInterceptor:
|
ret.gas = ((cp_body.vl["PEDAL_GAS_SENSOR"]['PED_GAS'] / 2) + cp_body.vl["PEDAL_GAS_SENSOR"]['PED_GAS2']) / 2.
|
||||||
# ret.gas = (cp_body.vl["GAS_SENSOR"]['PED_GAS'] + cp_body.vl["GAS_SENSOR"]['PED_GAS2']) / 2.
|
ret.gasPressed = ret.gas > 260
|
||||||
# ret.gasPressed = ret.gas > 15
|
|
||||||
|
|
||||||
ret.gas = 0
|
# ret.gas = 0
|
||||||
ret.gasPressed = False
|
# ret.gasPressed = False
|
||||||
|
|
||||||
#calculate speed from wheel speeds
|
#calculate speed from wheel speeds
|
||||||
ret.vEgoRaw = mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])
|
ret.vEgoRaw = mean([ret.wheelSpeeds.fl, ret.wheelSpeeds.fr, ret.wheelSpeeds.rl, ret.wheelSpeeds.rr])
|
||||||
|
@ -51,37 +54,61 @@ class CarState(CarStateBase):
|
||||||
ret.standstill = ret.vEgoRaw < 0.001
|
ret.standstill = ret.vEgoRaw < 0.001
|
||||||
|
|
||||||
#Toyota SAS
|
#Toyota SAS
|
||||||
ret.steeringAngleDeg = 0 #cp.vl["TOYOTA_STEERING_ANGLE_SENSOR1"]['TOYOTA_STEER_ANGLE'] + cp.vl["TOYOTA_STEERING_ANGLE_SENSOR1"]['TOYOTA_STEER_FRACTION']
|
ret.steeringAngleDeg = cp.vl["STEER_ANGLE_SENSOR"]['STEER_ANGLE']
|
||||||
ret.steeringRateDeg = 0 #cp.vl["TOYOTA_STEERING_ANGLE_SENSOR1"]['TOYOTA_STEER_RATE']
|
ret.steeringRateDeg = cp.vl["VSC"]['STEER_RATE']
|
||||||
|
|
||||||
|
|
||||||
#Steering information from smart standin ECU
|
#Steering information from smart standin ECU
|
||||||
ret.steeringTorque = 0 #cp.vl["STEERING_STATUS"]['STEER_TORQUE_DRIVER']
|
raw_torque = 0
|
||||||
ret.steeringTorqueEps = 0 #cp.vl["STEERING_STATUS"]['STEER_TORQUE_EPS']
|
if (cp.vl["STEER_TORQUE"]['DIRECTION'] == 1):
|
||||||
|
raw_torque = cp.vl["STEER_TORQUE"]['DRIVER_TORQUE'] * -1
|
||||||
|
else:
|
||||||
|
raw_torque = cp.vl["STEER_TORQUE"]['DRIVER_TORQUE']
|
||||||
|
ret.steeringTorque = raw_torque
|
||||||
|
|
||||||
|
# TODO: handle steering actuator
|
||||||
|
ret.steeringTorqueEps = raw_torque * 10 #cp.vl["STEERING_STATUS"]['STEER_TORQUE_EPS']
|
||||||
ret.steeringPressed = False #abs(ret.steeringTorque) > STEER_THRESHOLD
|
ret.steeringPressed = False #abs(ret.steeringTorque) > STEER_THRESHOLD
|
||||||
ret.steerWarning = False #cp.vl["STEERING_STATUS"]['STEERING_OK'] != 0
|
ret.steerWarning = False #cp.vl["STEERING_STATUS"]['STEERING_OK'] != 0
|
||||||
|
|
||||||
ret.cruiseState.available = True
|
main_on = bool(cp.vl["CRUISE_BUTTONS"]['MAIN_ON'])
|
||||||
|
|
||||||
|
ret.cruiseState.available = main_on
|
||||||
ret.cruiseState.standstill = False
|
ret.cruiseState.standstill = False
|
||||||
ret.cruiseState.nonAdaptive = False
|
ret.cruiseState.nonAdaptive = False
|
||||||
|
|
||||||
#Logic for OP to manage whether it's enabled or not as controls board only sends button inputs
|
self.buttonStates["accelCruise"] = bool(cp.vl["CRUISE_BUTTONS"]['SET_PLUS'])
|
||||||
self.oldEnabled = self.enabled
|
self.buttonStates["decelCruise"] = bool(cp.vl["CRUISE_BUTTONS"]['SET_MINUS'])
|
||||||
|
self.buttonStates["setCruise"] = bool(cp.vl["CRUISE_BUTTONS"]['CANCEL'])
|
||||||
|
|
||||||
self.setSpeed = ret.cruiseState.speed
|
if not main_on:
|
||||||
#if enabled from off (rising edge) set the speed to the current speed rounded to 5mph
|
self.enabled = False
|
||||||
if self.enabled and not(self.oldEnabled):
|
|
||||||
ret.cruiseState.speed = (self.myround((ret.vEgo * CV.MS_TO_MPH), 5)) * CV.MPH_TO_MS
|
if bool(cp.vl["CRUISE_BUTTONS"]['MAIN_ON']):
|
||||||
|
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
|
||||||
|
|
||||||
#increase or decrease speed in 5mph increments
|
#increase or decrease speed in 5mph increments
|
||||||
# if cp.vl["HIM_CTRLS"]['SPEEDUP_BTN']:
|
if cp.vl["CRUISE_BUTTONS"]['SET_PLUS']:
|
||||||
# ret.cruiseState.speed = self.setSpeed + 5*CV.MPH_TO_MS
|
self.setSpeed = self.setSpeed + 5
|
||||||
|
|
||||||
# if cp.vl["HIM_CTRLS"]['SPEEDDN_BTN']:
|
if cp.vl["CRUISE_BUTTONS"]['SET_MINUS']:
|
||||||
# ret.cruiseState.speed = self.setSpeed - 5*CV.MPH_TO_MS
|
self.setSpeed = self.setSpeed - 5
|
||||||
|
|
||||||
|
ret.cruiseState.speed = self.setSpeed * CV.MPH_TO_MS
|
||||||
ret.cruiseState.enabled = self.enabled
|
ret.cruiseState.enabled = self.enabled
|
||||||
|
|
||||||
|
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"])
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@ -92,12 +119,15 @@ class CarState(CarStateBase):
|
||||||
|
|
||||||
signals = [
|
signals = [
|
||||||
# sig_name, sig_address, default
|
# sig_name, sig_address, default
|
||||||
("BRAKE_OK", "ACTUATOR_BRAKE_STATUS", 0),
|
("BRAKE_OK", "OCELOT_BRAKE_STATUS", 0),
|
||||||
("STEERING_OK", "ACTUATOR_STEERING_STATUS", 0),
|
("DRIVER_BRAKE_APPLIED", "OCELOT_BRAKE_STATUS", 0),
|
||||||
|
("PED_GAS", "PEDAL_GAS_SENSOR", 0),
|
||||||
|
("PED_GAS2", "PEDAL_GAS_SENSOR", 0),
|
||||||
]
|
]
|
||||||
|
|
||||||
checks = [
|
checks = [
|
||||||
("ACTUATOR_BRAKE_STATUS", 80),
|
("OCELOT_BRAKE_STATUS", 80),
|
||||||
|
("PEDAL_GAS_SENSOR", 50),
|
||||||
]
|
]
|
||||||
|
|
||||||
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
|
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0)
|
||||||
|
@ -106,6 +136,26 @@ class CarState(CarStateBase):
|
||||||
def get_body_can_parser(CP):
|
def get_body_can_parser(CP):
|
||||||
|
|
||||||
signals = [
|
signals = [
|
||||||
|
("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),
|
||||||
|
("FL_ROOR", "DOORS", 0),
|
||||||
|
("FR_ROOR", "DOORS", 0),
|
||||||
|
("RL_ROOR", "DOORS", 0),
|
||||||
|
("RR_ROOR", "DOORS", 0),
|
||||||
|
("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),
|
||||||
]
|
]
|
||||||
|
|
||||||
# use steering message to check if panda is connected to frc
|
# use steering message to check if panda is connected to frc
|
||||||
|
|
|
@ -15,6 +15,14 @@ class CAR:
|
||||||
SMART_ROADSTER_COUPE = "SMART ROADSTER COUPE 2003-2006"
|
SMART_ROADSTER_COUPE = "SMART ROADSTER COUPE 2003-2006"
|
||||||
ALBATROSS = "ALBATROSS"
|
ALBATROSS = "ALBATROSS"
|
||||||
|
|
||||||
|
BUTTON_STATES = {
|
||||||
|
"accelCruise": False,
|
||||||
|
"decelCruise": False,
|
||||||
|
"cancel": False,
|
||||||
|
"setCruise": False,
|
||||||
|
"resumeCruise": False,
|
||||||
|
"gapAdjustCruise": False
|
||||||
|
}
|
||||||
|
|
||||||
FINGERPRINTS = {
|
FINGERPRINTS = {
|
||||||
CAR.SMART_ROADSTER_COUPE: [{
|
CAR.SMART_ROADSTER_COUPE: [{
|
||||||
|
@ -32,5 +40,5 @@ STEER_THRESHOLD = 100
|
||||||
|
|
||||||
DBC = {
|
DBC = {
|
||||||
CAR.SMART_ROADSTER_COUPE: dbc_dict('ocelot_can', 'ford_focus_adas', 'ocelot_smart_roadster_pt'),
|
CAR.SMART_ROADSTER_COUPE: dbc_dict('ocelot_can', 'ford_focus_adas', 'ocelot_smart_roadster_pt'),
|
||||||
CAR.ALBATROSS: dbc_dict('ocelot_controls', 'ford_focus_adas', 'ocelot_smart_roadster_pt'),
|
CAR.ALBATROSS: dbc_dict('ocelot_controls', 'ford_focus_adas', 'ford_transit_connect_2015'),
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
from common.numpy_fast import clip
|
from common.numpy_fast import clip
|
||||||
from common.params import Params
|
from common.params import Params
|
||||||
from copy import copy
|
from copy import copy
|
||||||
|
@ -58,7 +58,7 @@ def steer_thread():
|
||||||
|
|
||||||
button_1_last = button_1
|
button_1_last = button_1
|
||||||
|
|
||||||
#print "enable", enabled, "steer", actuators.steer, "accel", actuators.gas - actuators.brake
|
print("enable", enabled, "steer", actuators.steer, "accel", actuators.gas - actuators.brake)
|
||||||
|
|
||||||
hud_alert = 0
|
hud_alert = 0
|
||||||
if joystick.testJoystick.buttons[3]:
|
if joystick.testJoystick.buttons[3]:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# This process publishes joystick events. Such events can be suscribed by
|
# This process publishes joystick events. Such events can be suscribed by
|
||||||
# mocked car controller scripts.
|
# mocked car controller scripts.
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python3
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
# copied from common.transformations/camera.py
|
# copied from common.transformations/camera.py
|
||||||
eon_focal_length = 910.0 # pixels
|
eon_focal_length = 910.0 # pixels
|
||||||
eon_dcam_focal_length = 860.0 # pixels
|
eon_dcam_focal_length = 860.0 # pixels
|
||||||
|
|
||||||
webcam_focal_length = -908.0/1.5 # pixels
|
webcam_focal_length = 914.014724315 # pixels
|
||||||
|
|
||||||
eon_intrinsics = np.array([
|
eon_intrinsics = np.array([
|
||||||
[eon_focal_length, 0., 1164/2.],
|
[eon_focal_length, 0., 1164/2.],
|
||||||
|
@ -18,8 +18,8 @@ eon_dcam_intrinsics = np.array([
|
||||||
[ 0, 0, 1]])
|
[ 0, 0, 1]])
|
||||||
|
|
||||||
webcam_intrinsics = np.array([
|
webcam_intrinsics = np.array([
|
||||||
[webcam_focal_length, 0., 1280/2/1.5],
|
[webcam_focal_length, 0., 1280/2],
|
||||||
[ 0., webcam_focal_length, 720/2/1.5],
|
[ 0., webcam_focal_length, 800/2],
|
||||||
[ 0., 0., 1.]])
|
[ 0., 0., 1.]])
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
@ -29,15 +29,14 @@ if __name__ == "__main__":
|
||||||
print("trans_webcam_to_eon_rear:\n", trans_webcam_to_eon_rear)
|
print("trans_webcam_to_eon_rear:\n", trans_webcam_to_eon_rear)
|
||||||
print("trans_webcam_to_eon_front:\n", trans_webcam_to_eon_front)
|
print("trans_webcam_to_eon_front:\n", trans_webcam_to_eon_front)
|
||||||
|
|
||||||
cap = cv2.VideoCapture(1)
|
cap = cv2.VideoCapture(0)
|
||||||
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 853)
|
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 853)
|
||||||
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
|
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
|
||||||
|
|
||||||
while (True):
|
while (True):
|
||||||
ret, img = cap.read()
|
ret, img = cap.read()
|
||||||
if ret:
|
if ret:
|
||||||
# img = cv2.warpPerspective(img, trans_webcam_to_eon_rear, (1164,874), borderMode=cv2.BORDER_CONSTANT, borderValue=0)
|
img = cv2.warpPerspective(img, trans_webcam_to_eon_rear, (1164,874), borderMode=cv2.BORDER_CONSTANT, borderValue=0)
|
||||||
img = cv2.warpPerspective(img, trans_webcam_to_eon_front, (1164, 874), borderMode=cv2.BORDER_CONSTANT, borderValue=0)
|
# img = cv2.warpPerspective(img, trans_webcam_to_eon_front, (1164, 874), borderMode=cv2.BORDER_CONSTANT, borderValue=0)
|
||||||
print(img.shape, end='\r')
|
|
||||||
cv2.imshow('preview', img)
|
cv2.imshow('preview', img)
|
||||||
cv2.waitKey(10)
|
cv2.waitKey(10)
|
||||||
|
|
Loading…
Reference in New Issue