Commit 454a8bd7 authored by Svetlana's avatar Svetlana

Driver controller works based on the dynamic lanes count detection

parent 485bd921
......@@ -8,6 +8,7 @@ component DriverController {
in Z timerLeftIn,
in Z timerRightIn,
in Z laneChangeIn,
in Z lanesCountIn,
out Q(-1:1)^{3} commandsOut, // [accelCmd, steerCmd, brakeCmd]
out Q steerCmd,
out Z timerLeftOut,
......@@ -23,8 +24,6 @@ component DriverController {
Q preMR;
Q desiredSpeed;
Q slowDown = 100; // Acceleration
Q distLLRecord = 30;
Q distRRRecord = 30;
Q preDistL = 60;
Q preDistR = 60;
Q steer_trend;
......@@ -34,169 +33,415 @@ component DriverController {
Z left_timer = timerLeftIn;
Z right_timer = timerRightIn;
if (preDistL < 20 && affordanceIn.distLL < 20)
left_clear = 0;
left_timer = 0;
else
left_timer += 1;
end
if (preDistR < 20 && affordanceIn.distRR < 20)
right_clear = 0;
right_timer = 0;
else
right_timer += 1;
end
preDistL = affordanceIn.distLL;
preDistR = affordanceIn.distRR;
if (left_timer > timer_set)
left_timer = timer_set;
left_clear = 1;
end
if (right_timer > timer_set)
right_timer = timer_set;
right_clear = 1;
end
if (lane_change == 0 && affordanceIn.distMM < 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingLL > -8 && left_clear == 1 && steer_trend >= 0)
lane_change = -2;
coeSteer = 6;
right_clear = 0;
right_timer = 0;
left_clear = 0;
left_timer = 0;
timer_set = 30;
elseif (affordanceIn.toMarkingRR < 8 && right_clear == 1 && steer_trend <= 0)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 0;
left_clear = 0;
left_timer = 0;
timer_set = 30;
else
if (lanesCountIn == 1)
if (affordanceIn.distMM < 20)
Q vMax = 20;
Q c = 2.772;
Q d = -0.693;
slowDown = vMax*(1-exp(-c/vMax * affordanceIn.distMM - d));
if slowDown < 0
Q vC = 2.772;
Q vD = -0.693;
// optimal velocity car-following model
slowDown = vMax * (1-exp(-(vC/vMax) * affordanceIn.distMM - vD));
if (slowDown < 0)
slowDown = 0;
end
end
elseif (lane_change == 0 && affordanceIn.distMM >= 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingLL < -8 && right_clear == 1 && steer_trend <= 0 && steer_trend > -0.2)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 20;
end
end
if (lane_change == 0)
if (-affordanceIn.toMarkingML + affordanceIn.toMarkingMR < 5.5)
coeSteer = 1.5;
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
centerLine = (affordanceIn.toMarkingML + affordanceIn.toMarkingMR) / 2;
preML = affordanceIn.toMarkingML;
preMR = affordanceIn.toMarkingMR;
if (affordanceIn.toMarkingM < 1)
coeSteer = 0.4;
coeSteer = 0.4;
end
else
if (-preML > preMR)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
centerLine = (affordanceIn.toMarkingL + affordanceIn.toMarkingM) / 2;
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
centerLine=(affordanceIn.toMarkingR + affordanceIn.toMarkingM) / 2;
end
coeSteer = 0.3;
end
elseif (lane_change == -2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (affordanceIn.toMarkingLL+affordanceIn.toMarkingML)/2;
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine+(affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2)/2;
// steering control, "shared->steerCmd" [-1,1] is the value sent back to TORCS
steerCmd = (affordanceIn.angle - centerLine/roadWidth) / 0.541052 / coeSteer;
if (coeSteer > 1 && steerCmd > 0.1) // reshape the steering control curve
steerCmd = steerCmd * (2.5 * steerCmd + 0.75);
end
commandsOut(2) = steerCmd;
desiredSpeed = 20; // 20m/s = 72 kmh
if (affordanceIn.fast != 1)
desiredSpeed = 20 - abs(steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5)) * 4.5;
end
if (desiredSpeed < 10)
desiredSpeed = 10;
end
if (desiredSpeed > slowDown)
desiredSpeed = slowDown;
end
// acceleration and brake
if (desiredSpeed >= speedIn)
Q accelCmd = 0.2*(desiredSpeed - speedIn + 1);
if (accelCmd > 1)
accelCmd = 1;
end
commandsOut(1) = accelCmd;
commandsOut(3) = 0; // brakeCmd
else
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = -1;
end
elseif (lane_change == -1)
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
Q brakeCmd = 0.1 * (speedIn - desiredSpeed);
if (brakeCmd > 1)
brakeCmd = 1;
end
commandsOut(3) = brakeCmd;
commandsOut(1) = 0; // accelCmd
end
elseif (lanesCountIn == 2)
if (preDistL < 20 && affordanceIn.distLL < 20)
left_clear = 0;
left_timer = 0;
else
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
lane_change = 0;
left_timer += 1;
end
elseif (lane_change == 2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (affordanceIn.toMarkingRR+affordanceIn.toMarkingMR)/2;
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine + (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2)/2;
end
if (preDistR < 20 && affordanceIn.distRR < 20)
right_clear = 0;
right_timer = 0;
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = 1;
right_timer += 1;
end
elseif (lane_change == 1)
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM < 5.5)/2;
preDistL = affordanceIn.distLL;
preDistR = affordanceIn.distRR;
if (left_timer > timer_set)
left_timer = timer_set;
left_clear = 1;
end
if (right_timer > timer_set)
right_timer = timer_set;
right_clear = 1;
end
if (lane_change == 0 && affordanceIn.distMM < 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingLL > -8 && left_clear == 1 && steer_trend >= 0)
lane_change = -2;
coeSteer = 6;
right_clear = 0;
right_timer = 0;
left_clear = 0;
left_timer = 0;
timer_set = 30;
elseif (affordanceIn.toMarkingRR < 8 && right_clear == 1 && steer_trend <= 0)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 0;
left_clear = 0;
left_timer = 0;
timer_set = 30;
else
Q vMax = 20;
Q c = 2.772;
Q d = -0.693;
slowDown = vMax*(1-exp(-c/vMax * affordanceIn.distMM - d));
if slowDown < 0
slowDown = 0;
end
end
elseif (lane_change == 0 && affordanceIn.distMM >= 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingLL < -8 && right_clear == 1 && steer_trend <= 0 && steer_trend > -0.2)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 20;
end
end
if (lane_change == 0)
if (-affordanceIn.toMarkingML + affordanceIn.toMarkingMR < 5.5)
coeSteer = 1.5;
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
preML = affordanceIn.toMarkingML;
preMR = affordanceIn.toMarkingMR;
if (affordanceIn.toMarkingM < 1)
coeSteer = 0.4;
end
else
if (-preML > preMR)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
end
coeSteer = 0.3;
end
elseif (lane_change == -2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
centerLine = (affordanceIn.toMarkingLL+affordanceIn.toMarkingML)/2;
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine+(affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = -1;
end
elseif (lane_change == -1)
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
lane_change = 0;
end
elseif (lane_change == 2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (affordanceIn.toMarkingRR+affordanceIn.toMarkingMR)/2;
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine + (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = 1;
end
elseif (lane_change == 1)
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
else
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
lane_change = 0;
end
end
end
end
steerCmd = (affordanceIn.angle - centerLine/roadWidth) / 0.541052 / coeSteer;
steerCmd = (affordanceIn.angle - centerLine/roadWidth) / 0.541052 / coeSteer;
if (lane_change == 0 && coeSteer > 1 && steerCmd > 0.1)
steerCmd = steerCmd * (2.5*steerCmd+0.75);
end
commandsOut(2) = steerCmd;
if (lane_change == 0 && coeSteer > 1 && steerCmd > 0.1)
steerCmd = steerCmd * (2.5*steerCmd+0.75);
end
commandsOut(2) = steerCmd;
desiredSpeed = 20; // 20m/s = 72 kmh
if (affordanceIn.fast != 1)
desiredSpeed = 20 - abs(steer_trend) * 4.5;
end
if (desiredSpeed < 10)
desiredSpeed = 10;
end
if (desiredSpeed > slowDown)
desiredSpeed = slowDown;
end
// acceleration and brake
if (desiredSpeed >= speedIn)
Q accelCmd = 0.2*(desiredSpeed - speedIn + 1);
if (accelCmd > 1)
accelCmd = 1;
end
commandsOut(1) = accelCmd;
commandsOut(3) = 0; // brakeCmd
else
Q brakeCmd = 0.1 * (speedIn - desiredSpeed);
if (brakeCmd > 1)
brakeCmd = 1;
end
desiredSpeed = 20; // 20m/s = 72 kmh
if (affordanceIn.fast != 1)
desiredSpeed = 20 - abs(steer_trend) * 4.5;
end
commandsOut(3) = brakeCmd;
commandsOut(1) = 0; // accelCmd
end
elseif (lanesCountIn == 3)
if (preDistL < 20 && affordanceIn.distLL < 20)
left_clear = 0;
left_timer = 0;
else
left_timer += 1;
end
if (desiredSpeed < 10)
desiredSpeed = 10;
end
if (preDistR < 20 && affordanceIn.distRR < 20)
right_clear = 0;
right_timer = 0;
else
right_timer += 1;
end
if (desiredSpeed > slowDown)
desiredSpeed = slowDown;
end
preDistL = affordanceIn.distLL;
preDistR = affordanceIn.distRR;
// acceleration and brake
if (desiredSpeed >= speedIn)
Q accelCmd = 0.2*(desiredSpeed - speedIn + 1);
if (accelCmd > 1)
accelCmd = 1;
if (left_timer > timer_set)
left_timer = timer_set;
left_clear = 1;
end
commandsOut(1) = accelCmd;
commandsOut(3) = 0; // brakeCmd
else
Q brakeCmd = 0.1 * (speedIn - desiredSpeed);
if (brakeCmd > 1)
brakeCmd = 1;
if (right_timer > timer_set)
right_timer = timer_set;
right_clear = 1;
end
if (lane_change == 0 && affordanceIn.distMM < 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingLL > -8 && left_clear == 1 && steer_trend >= 0 && steer_trend < 0.2)
lane_change = -2;
coeSteer = 6;
right_clear = 0;
right_timer = 0;
left_clear = 0;
left_timer = 30;
timer_set = 60;
elseif (affordanceIn.toMarkingRR < 8 && right_clear == 1 && steer_trend <= 0 && steer_trend > -0.2)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 30;
left_clear = 0;
left_timer = 0;
timer_set = 60;
else
Q vMax = 20;
Q c = 2.772;
Q d = -0.693;
slowDown = vMax*(1-exp(-c/vMax * affordanceIn.distMM - d));
if slowDown < 0
slowDown = 0;
end
end
elseif (lane_change == 0 && affordanceIn.distMM >= 15)
steer_trend = steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5);
if (affordanceIn.toMarkingRR > 8 && left_clear == 1 && steer_trend >= 0 && steer_trend < 0.2)
lane_change = -2;
coeSteer = 6;
left_clear = 0;
left_timer = 30;
elseif (affordanceIn.toMarkingLL < -8 && right_clear == 1 && steer_trend <= 0 && steer_trend > -0.2)
lane_change = 2;
coeSteer = 6;
right_clear = 0;
right_timer = 30;
end
end
commandsOut(3) = brakeCmd;
commandsOut(1) = 0; // accelCmd
if (lane_change == 0)
if (-affordanceIn.toMarkingML + affordanceIn.toMarkingMR < 5.5)
coeSteer = 1.5;
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
preML = affordanceIn.toMarkingML;
preMR = affordanceIn.toMarkingMR;
if (affordanceIn.toMarkingM < 1)
coeSteer = 0.4;
end
else
if (-preML > preMR)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
end
coeSteer = 0.3;
end
elseif (lane_change == -2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (affordanceIn.toMarkingLL+affordanceIn.toMarkingML)/2;
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine+(affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = -1;
end
elseif (lane_change == -1)
if (affordanceIn.toMarkingL > -5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingL+affordanceIn.toMarkingM)/2;
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
lane_change = 0;
end
elseif (lane_change == 2)
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (affordanceIn.toMarkingRR+affordanceIn.toMarkingMR)/2;
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (centerLine + (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2)/2;
end
else
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
coeSteer = 20;
lane_change = 1;
end
elseif (lane_change == 1)
if (affordanceIn.toMarkingR < 5 && affordanceIn.toMarkingM < 1.5)
centerLine = (affordanceIn.toMarkingR+affordanceIn.toMarkingM)/2;
if (-affordanceIn.toMarkingML+affordanceIn.toMarkingMR < 5.5)
centerLine = (centerLine+(affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2)/2;
else
centerLine = (affordanceIn.toMarkingML+affordanceIn.toMarkingMR)/2;
lane_change = 0;
end
end
end
steerCmd = (affordanceIn.angle - centerLine/roadWidth) / 0.541052 / coeSteer;
if (lane_change == 0 && coeSteer > 1 && steerCmd > 0.1)
steerCmd = steerCmd * (2.5*steerCmd+0.75);
end
commandsOut(2) = steerCmd;
desiredSpeed = 20; // 20m/s = 72 kmh
if (affordanceIn.fast != 1)
desiredSpeed = 20 - abs(steer_trend) * 4.5;
end
if (desiredSpeed < 10)
desiredSpeed = 10;
end
if (desiredSpeed > slowDown)
desiredSpeed = slowDown;
end
// acceleration and brake
if (desiredSpeed >= speedIn)
Q accelCmd = 0.2*(desiredSpeed - speedIn + 1);
if (accelCmd > 1)
accelCmd = 1;
end
commandsOut(1) = accelCmd;
commandsOut(3) = 0; // brakeCmd
else
Q brakeCmd = 0.1 * (speedIn - desiredSpeed);
if (brakeCmd > 1)
brakeCmd = 1;
end
commandsOut(3) = brakeCmd;
commandsOut(1) = 0; // accelCmd
end
else
commandsOut(1) = 0;
commandsOut(2) = 0;
commandsOut(3) = 0;
end
timerLeftOut = left_timer;
......
package dp.subcomponents;
component DriverController {
ports
in Q^{5} steeringRecordIn,
in Affordance affordanceIn,
in Q(0 m/s:0.1 m/s:100 m/s) speedIn,
out Q(-1:1)^{3} commandsOut, // [accelCmd, steerCmd, brakeCmd]
out Q steerCmd;
implementation Math {
Q roadWidth = 8;
Q centerLine;
Q coeSteer = 1.0;
Q preML;
Q preMR;
Q desiredSpeed;
Q slowDown = 100; // Acceleration
// Car following speed model: if a car is less than 20m ahead
if (affordanceIn.distMM < 20)
Q vMax = 20;
Q vC = 2.772;
Q vD = -0.693;
// optimal velocity car-following model
slowDown = vMax * (1-exp(-(vC/vMax) * affordanceIn.distMM - vD));
if (slowDown < 0)
slowDown = 0;
end
end
if (-affordanceIn.toMarkingML + affordanceIn.toMarkingMR < 5.5)
coeSteer = 1.5;
centerLine = (affordanceIn.toMarkingML + affordanceIn.toMarkingMR) / 2;
preML = affordanceIn.toMarkingML;
preMR = affordanceIn.toMarkingMR;
if (affordanceIn.toMarkingM < 1)
coeSteer = 0.4;
end
else
if (-preML > preMR)
centerLine = (affordanceIn.toMarkingL + affordanceIn.toMarkingM) / 2;
else
centerLine=(affordanceIn.toMarkingR + affordanceIn.toMarkingM) / 2;
end
coeSteer = 0.3;
end
// steering control, "shared->steerCmd" [-1,1] is the value sent back to TORCS
steerCmd = (affordanceIn.angle - centerLine/roadWidth) / 0.541052 / coeSteer;
if (coeSteer > 1 && steerCmd > 0.1) // reshape the steering control curve
steerCmd = steerCmd * (2.5 * steerCmd + 0.75);
end
commandsOut(2) = steerCmd;
desiredSpeed = 20; // 20m/s = 72 kmh
if (affordanceIn.fast != 1)
desiredSpeed = 20 - abs(steeringRecordIn(1) + steeringRecordIn(2) + steeringRecordIn(3) + steeringRecordIn(4) + steeringRecordIn(5)) * 4.5;
end
if (desiredSpeed < 10)
desiredSpeed = 10;
end
if (desiredSpeed > slowDown)
desiredSpeed = slowDown;
end
// acceleration and brake
if (desiredSpeed >= speedIn)
Q accelCmd = 0.2*(desiredSpeed - speedIn + 1);
if (accelCmd > 1)
accelCmd = 1;
end
commandsOut(1) = accelCmd;
commandsOut(3) = 0; // brakeCmd
else
Q brakeCmd = 0.1 * (speedIn - desiredSpeed);
if (brakeCmd > 1)
brakeCmd = 1;
end
commandsOut(3) = brakeCmd;
commandsOut(1) = 0; // accelCmd
end
}
}
......@@ -5,7 +5,7 @@ component LocalizationController {
in Affordance affordanceIn,
out B onLane,
out B onMarking,
out Z laneNumber,
out Z lanesCount,
out Lane lane;
implementation Math {
......@@ -17,15 +17,15 @@ component LocalizationController {
onLane = true;
onMarking = false;
if (affordanceIn.toMarkingLL <= -7.5 && affordanceIn.toMarkingRR >= 7.5)
laneNumber = 1;
lanesCount = 1;
lane = CENTER_LANE;
elseif (affordanceIn.toMarkingLL > -7.5 && affordanceIn.toMarkingRR < 7.5)
laneNumber = 3;
lanesCount = 3;
lane = CENTER_LANE;
elseif (affordanceIn.toMarkingLL > -7.5 || affordanceIn.toMarkingRR < 7.5)
laneNumber =<