Skip to content

Commit 8f69a93

Browse files
committed
Update latest changes from volvo-v0.8.6
1 parent 5aa676a commit 8f69a93

File tree

5 files changed

+54
-46
lines changed

5 files changed

+54
-46
lines changed

selfdrive/car/fw_versions.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,15 +74,13 @@ def p16(val):
7474
MAZDA_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
7575
p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER)
7676

77-
# brand, request, response, response offset
7877

7978
VOLVO_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \
8079
p16(0xf1a2)
8180
VOLVO_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \
8281
p16(0xf1a2)
8382

84-
# supports subaddressing, request, response
85-
83+
# brand, request, response, response offset
8684
REQUESTS = [
8785
# Hyundai
8886
(

selfdrive/car/volvo/carcontroller.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ def update(self, enabled, CS, frame,
152152
fingerprint = self.CP.carFingerprint
153153

154154
if enabled and CS.out.vEgo > self.CP.minSteerSpeed:
155-
current_steer_angle = CS.out.steeringAngle
156-
self.SteerCommand.angle_request = actuators.steerAngle # Desired value from pathplanner
155+
current_steer_angle = CS.out.steeringAngleDeg
156+
self.SteerCommand.angle_request = actuators.steeringAngleDeg # Desired value from pathplanner
157157

158158
# # windup slower
159159
if self.angle_request_prev * self.SteerCommand.angle_request > 0. and abs(self.SteerCommand.angle_request) > abs(self.angle_request_prev):
@@ -164,11 +164,11 @@ def update(self, enabled, CS, frame,
164164
self.SteerCommand.angle_request = clip(self.SteerCommand.angle_request, self.angle_request_prev - angle_rate_lim, self.angle_request_prev + angle_rate_lim)
165165

166166
# Create trqlim from angle request (before constraints)
167+
self.SteerCommand.trqlim = 0
167168
if fingerprint in PLATFORM.C1:
168-
self.SteerCommand.trqlim = -127 if current_steer_angle > self.SteerCommand.angle_request else 127
169+
#self.SteerCommand.trqlim = -127 if current_steer_angle > self.SteerCommand.angle_request else 127
169170
self.SteerCommand.steer_direction = CCP.STEER
170171
elif fingerprint in PLATFORM.EUCD:
171-
self.SteerCommand.trqlim = 0
172172
# MIGHT be needed for EUCD
173173
self.SteerCommand.steer_direction = CCP.STEER_RIGHT if current_steer_angle > self.SteerCommand.angle_request else CCP.STEER_LEFT
174174
self.SteerCommand.steer_direction = self.dir_change(self.SteerCommand.steer_direction, current_steer_angle-self.SteerCommand.angle_request) # Filter the direction change
@@ -177,7 +177,7 @@ def update(self, enabled, CS, frame,
177177
self.SteerCommand.steer_direction = CCP.STEER_NO
178178
self.SteerCommand.trqlim = 0
179179
if fingerprint in PLATFORM.C1:
180-
self.SteerCommand.angle_request = clip(CS.out.steeringAngle, -359.95, 359.90) # Cap values at max min values (Cap 2 steps from max min). Max=359.99445, Min=-360.0384
180+
self.SteerCommand.angle_request = clip(CS.out.steeringAngleDeg, -359.95, 359.90) # Cap values at max min values (Cap 2 steps from max min). Max=359.99445, Min=-360.0384
181181
else:
182182
self.SteerCommand.angle_request = 0
183183

selfdrive/car/volvo/carstate.py

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def update(self, cp, cp_cam):
107107
ret.standstill = ret.vEgoRaw < 0.1
108108

109109
# Steering
110-
ret.steeringAngle = cp.vl["PSCM1"]['SteeringAngleServo']
110+
ret.steeringAngleDeg = cp.vl["PSCM1"]['SteeringAngleServo']
111111
ret.steeringTorque = 0 # Needed? No signal to check against yet
112112
ret.steeringPressed = bool(cp.vl["CCButtons"]['ACCSetBtn'] or \
113113
cp.vl["CCButtons"]['ACCMinusBtn'] or \
@@ -188,15 +188,15 @@ def update(self, cp, cp_cam):
188188
self.PSCMInfo.LKAActive = int(cp.vl['PSCM1']['LKAActive'])
189189
self.PSCMInfo.SteeringAngleServo = float(cp.vl['PSCM1']['SteeringAngleServo'])
190190

191-
# Platform specific
191+
# Platform specific
192192
if self.CP.carFingerprint in PLATFORM.C1:
193193
self.PSCMInfo.byte3 = int(cp.vl['PSCM1']['byte3'])
194194
elif self.CP.carFingerprint in PLATFORM.EUCD:
195195
self.PSCMInfo.SteeringWheelRateOfChange = float(cp.vl['PSCM1']['SteeringWheelRateOfChange'])
196196

197197
# FSMInfo
198198
# Common both platforms
199-
199+
200200
if self.CP.carFingerprint in PLATFORM.C1:
201201
# TODO Why use these? In future shold be ok to delete.
202202
self.FSMInfo.TrqLim = int(cp_cam.vl['FSM1']['TrqLim'])
@@ -241,7 +241,7 @@ def update(self, cp, cp_cam):
241241
def get_can_parser(CP):
242242
# ptcan on bus 0
243243
# this function generates lists for signal, messages and initial values
244-
244+
245245
# Common signals for both platforms
246246
signals = [
247247
# sig_name, sig_address, default
@@ -253,15 +253,15 @@ def get_can_parser(CP):
253253
("ACCMinusBtn", "CCButtons", 0),
254254
("TimeGapIncreaseBtn", "CCButtons", 0),
255255
("TimeGapDecreaseBtn", "CCButtons", 0),
256-
256+
257257
# Common PSCM signals
258258
("SteeringAngleServo", "PSCM1", 0),
259259
("LKATorque", "PSCM1", 0),
260260
("LKAActive", "PSCM1", 0),
261261
("byte0", "PSCM1", 0),
262262
("byte4", "PSCM1", 0),
263263
("byte7", "PSCM1", 0),
264-
264+
265265
# diagnostic
266266
("byte03", "diagCEMResp", 0),
267267
("byte47", "diagCEMResp", 0),
@@ -270,13 +270,17 @@ def get_can_parser(CP):
270270
("byte03", "diagCVMResp", 0),
271271
("byte47", "diagCVMResp", 0),
272272
]
273-
273+
274274
checks = [
275275
# sig_address, frequency
276276
("CCButtons", 100),
277-
("PSCM1", 50),
277+
("PSCM1", 50),
278278
("VehicleSpeed1", 50),
279279
("MiscCarInfo", 25),
280+
("diagCEMResp", 0),
281+
("diagPSCMResp", 0),
282+
("diagCVMResp", 0),
283+
280284
]
281285

282286
# Car specific signals
@@ -288,26 +292,27 @@ def get_can_parser(CP):
288292
signals.append(("BrakePress1", "BrakeMessages", 0))
289293
signals.append(("BrakeStatus", "BrakeMessages", 0))
290294
signals.append(("GearShifter", "TCM0", 0))
291-
292-
# Servo
295+
296+
# Servo
293297
signals.append(("byte3", "PSCM1", 0))
294298

295299
# Buttons
296300
signals.append(('ACCStopBtn', "CCButtons", 0))
297-
298-
# Checks
301+
302+
# Checks
299303
checks.append(("BrakeMessages", 50))
300304
checks.append(("ACC", 17))
301305
checks.append(("PedalandBrake", 100))
302-
306+
checks.append(("TCM0", 10))
307+
303308
if CP.carFingerprint in PLATFORM.EUCD:
304309
# Gas / Brake
305310
signals.append(("AccPedal", "AccPedal", 0))
306311
signals.append(("BrakePedal", "BrakePedal", 0))
307312

308313
# Servo
309314
signals.append(("SteeringWheelRateOfChange", "PSCM1", 0))
310-
315+
311316
# Buttons
312317
# Inv = Inverted state, init value set to passive
313318
signals.append(("ACCOnOffBtnInv", "CCButtons", 1))
@@ -340,7 +345,7 @@ def get_adas_can_parser(CP):
340345
@staticmethod
341346
def get_cam_can_parser(CP):
342347
# camera on bus 2
343-
# Common signals
348+
# Common signals
344349
signals = [
345350
# sig_name, sig_address, default
346351
("byte03", "diagFSMResp", 0),
@@ -350,8 +355,9 @@ def get_cam_can_parser(CP):
350355
# Common checks
351356
checks = [
352357
# sig_address, frequency
358+
("diagFSMResp", 0),
353359
]
354-
360+
355361
# Car specific
356362
if CP.carFingerprint in PLATFORM.C1:
357363
# LKA Request
@@ -372,12 +378,12 @@ def get_cam_can_parser(CP):
372378
# Checks
373379
checks.append(('FSM0', 100))
374380
checks.append(('FSM1', 50))
375-
381+
376382
# TODO add checks and signals nescessary
377383
elif CP.carFingerprint in PLATFORM.EUCD:
378384
# ACC Status
379385
signals.append(("ACCStatus", "FSM0", 0))
380-
386+
381387
# LKA Request
382388
signals.append(("TrqLim", "FSM2", 0x80))
383389
signals.append(("LKAAngleReq", "FSM2", 0x2000))
@@ -387,10 +393,10 @@ def get_cam_can_parser(CP):
387393
signals.append(("SET_X_02", "FSM2", 0x00))
388394
signals.append(("SET_X_10", "FSM2", 0x00))
389395
signals.append(("SET_X_A4", "FSM2", 0x00))
390-
396+
391397
# Checks
392398
checks.append(('FSM0', 100))
393399
checks.append(('FSM2', 50))
394400

395-
401+
396402
return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 2)

selfdrive/car/volvo/interface.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ def compute_gb(accel, speed):
2020
return float(accel) / 4.0
2121

2222
@staticmethod
23-
def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False, car_fw=[]):
24-
ret = CarInterfaceBase.get_std_params(candidate, fingerprint, has_relay)
23+
def get_params(candidate, fingerprint=gen_empty_fingerprint(), car_fw=None):
24+
ret = CarInterfaceBase.get_std_params(candidate, fingerprint)
2525

2626
# Volvo port is a community feature, since we don't own one to test
2727
ret.communityFeature = True
@@ -48,15 +48,14 @@ def get_params(candidate, fingerprint=gen_empty_fingerprint(), has_relay=False,
4848

4949
# Common parameters
5050
ret.carName = "volvo"
51-
ret.enableCamera = True # Will not set safety mode if not True
5251
ret.radarOffCan = True # No radar objects on can
5352

5453
# Steering settings - tuning parameters for lateral control.
5554
#ret.steerLimitAlert = True # Do this do anything?
5655
ret.steerControlType = car.CarParams.SteerControlType.angle
5756
ret.minSteerSpeed = 1. * CV.KPH_TO_MS
5857
ret.steerRateCost = 1. # Used in pathplanner for punishing? Steering derivative?
59-
ret.steerActuatorDelay = 0.24 # Actuator delay from input to output.
58+
ret.steerActuatorDelay = 0.48 # Actuator delay from input to output.
6059

6160
# No PID control used. Set to a value, otherwise pid loop crashes.
6261
#ret.steerMaxBP = [0.] # m/s

selfdrive/car/volvo/values.py

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,29 +36,38 @@
3636

3737
class CarControllerParams():
3838
# constants, collected from v40 dbc lka_direction.
39+
# Normally the car uses STEER_RIGHT and STEER_LEFT.
40+
# However it's possible to use STEER in C1MCA.
41+
# Servo then accepts steering in both directions.
3942
STEER_NO = 0
4043
STEER_RIGHT = 1
4144
STEER_LEFT = 2
4245
STEER = 3
4346

4447
# maximum degress offset/rate of change on request from current/last steering angle
45-
MAX_ACT_ANGLE_REQUEST_DIFF = 25 # A bigger angle difference will trigger disengage.
46-
STEER_ANGLE_DELTA_REQ_DIFF = 0.25
48+
# Not used, old code
49+
#MAX_ACT_ANGLE_REQUEST_DIFF = 3 # A bigger angle difference will trigger disengage.
50+
#STEER_ANGLE_DELTA_REQ_DIFF = 0.25 # Not used for C1MCA
4751

4852
# Limits
49-
ANGLE_DELTA_BP = [0., 5., 15., 27., 36.] # 0, 18, 54, 97.2, 129.6 km/h
50-
ANGLE_DELTA_V = [2, 1.2, .15, .1, .08] # windup limit
51-
ANGLE_DELTA_VU = [3, 1.8, 0.4, .2, .1] # unwind limit
53+
ANGLE_DELTA_BP = [0., 8.33, 13.89, 19.44, 25., 30.55, 36.1] # 0, 30, 50, 70, 90, 110, 130 km/h
54+
ANGLE_DELTA_V = [2., 1.2, .25, .20, .15, .10, .10] # windup limit
55+
ANGLE_DELTA_VU = [2., 1.2, .25, .20, .15, .10, .10] # unwind limit
5256

5357
# number of 0 torque samples in a row before trying to restore steering.
54-
N_ZERO_TRQ = 10
58+
# Got one false trigger on motorway with 10.
59+
# Increase to 12 is probably a good tradeoff between false triggers
60+
# and detecting fault.
61+
N_ZERO_TRQ = 12
5562

5663
# EUCD
57-
# When changing steer direction steering request need to be blocked.
58-
# This calibration sets the number of samples to block it and no steering instead.
64+
# When changing steer direction steering request need to be blocked.
65+
# Otherwise servo wont "listen" to the request.
66+
# This calibration sets the number of samples to block steering request.
5967
BLOCK_LEN = 8
60-
# don't change steer direction inside deadzone,
61-
# might not be needed in future after discovering STEER command.
68+
# When close to desired steering angle, don't change steer direction inside deadzone.
69+
# Since we need to release control of the steering wheel for a brief moment, steering wheel will
70+
# unwind by itself.
6271
DEADZONE = 0.1
6372

6473

@@ -77,17 +86,14 @@ class CAR:
7786
V40 = "VOLVO V40 2017"
7887
V60 = "VOLVO V60 2015"
7988

80-
8189
class PLATFORM:
8290
C1 = [CAR.V40]
8391
EUCD = [CAR.V60]
8492

85-
8693
ECU_ADDRESS = {
8794
CAR.V40: {"BCM": 0x760, "ECM": 0x7E0, "DIM": 0x720, "CEM": 0x726, "FSM": 0x764, "PSCM": 0x730, "TCM": 0x7E1, "CVM": 0x793},
8895
}
8996

90-
9197
# TODO: Find good DID for identifying SW version
9298
# 0xf1a1, 0xf1a3 not on CVM.
9399
# Possible options 0xf1a2, 0xf1a4, 0xf1a5
@@ -109,7 +115,6 @@ class PLATFORM:
109115
(Ecu.eps, ECU_ADDRESS[CAR.V40]["PSCM"], None): [b'31288595 AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a2
110116
#(Ecu.eps, ECU_ADDRESS[CAR.V40]["PSCM"], None): [b'31678017\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a4
111117
#(Ecu.eps, ECU_ADDRESS[CAR.V40]["PSCM"], None): [b'31681147 AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a5
112-
#(Ecu.fwdCamera, ECU_ADDRESS[CAR.V40]["FSM"], None): [b'31400454 AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a2
113118
(Ecu.fwdCamera, ECU_ADDRESS[CAR.V40]["FSM"], None): [b'31400454 AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a2
114119
#(Ecu.fwdCamera, ECU_ADDRESS[CAR.V40]["FSM"], None): [b'31660982 AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a4
115120
#(Ecu.fwdCamera, ECU_ADDRESS[CAR.V40]["FSM"], None): [b'31660983 AA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'], # 0xf1a5

0 commit comments

Comments
 (0)