@ -22,20 +22,24 @@ DESIRES = {
LaneChangeDirection . none : {
LaneChangeDirection . none : {
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . laneChangeStarting : log . PathPlan . Desire . none ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . none ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . none ,
} ,
} ,
LaneChangeDirection . left : {
LaneChangeDirection . left : {
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . laneChangeStarting : log . PathPlan . Desire . laneChangeLeft ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . laneChangeLeft ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . laneChangeLeft ,
} ,
} ,
LaneChangeDirection . right : {
LaneChangeDirection . right : {
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . off : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . preLaneChange : log . PathPlan . Desire . none ,
LaneChangeState . laneChangeStarting : log . PathPlan . Desire . laneChangeRight ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . laneChangeRight ,
LaneChangeState . laneChangeFinishing : log . PathPlan . Desire . laneChangeRight ,
} ,
} ,
}
}
def calc_states_after_delay ( states , v_ego , steer_angle , curvature_factor , steer_ratio , delay ) :
def calc_states_after_delay ( states , v_ego , steer_angle , curvature_factor , steer_ratio , delay ) :
states [ 0 ] . x = v_ego * delay
states [ 0 ] . x = v_ego * delay
states [ 0 ] . psi = v_ego * curvature_factor * math . radians ( steer_angle ) / steer_ratio * delay
states [ 0 ] . psi = v_ego * curvature_factor * math . radians ( steer_angle ) / steer_ratio * delay
@ -55,6 +59,7 @@ class PathPlanner():
self . lane_change_state = LaneChangeState . off
self . lane_change_state = LaneChangeState . off
self . lane_change_direction = LaneChangeDirection . none
self . lane_change_direction = LaneChangeDirection . none
self . lane_change_timer = 0.0
self . lane_change_timer = 0.0
self . lane_change_ll_prob = 1.0
self . prev_one_blinker = False
self . prev_one_blinker = False
def setup_mpc ( self ) :
def setup_mpc ( self ) :
@ -110,19 +115,30 @@ class PathPlanner():
# off
# off
if self . lane_change_state == LaneChangeState . off and one_blinker and not self . prev_one_blinker and not below_lane_change_speed :
if self . lane_change_state == LaneChangeState . off and one_blinker and not self . prev_one_blinker and not below_lane_change_speed :
self . lane_change_state = LaneChangeState . preLaneChange
self . lane_change_state = LaneChangeState . preLaneChange
self . lane_change_ll_prob = 1.0
# pre
# pre
elif self . lane_change_state == LaneChangeState . preLaneChange :
elif self . lane_change_state == LaneChangeState . preLaneChange :
if not one_blinker or below_lane_change_speed :
if not one_blinker or below_lane_change_speed :
self . lane_change_state = LaneChangeState . off
self . lane_change_state = LaneChangeState . off
elif torque_applied :
elif torque_applied :
self . lane_change_state = LaneChangeState . laneChangeStarting
# starting
elif self . lane_change_state == LaneChangeState . laneChangeStarting :
# fade out lanelines over 1s
self . lane_change_ll_prob = max ( self . lane_change_ll_prob - DT_MDL , 0.0 )
# 98% certainty
if lane_change_prob < 0.02 and self . lane_change_ll_prob < 0.01 :
self . lane_change_state = LaneChangeState . laneChangeFinishing
self . lane_change_state = LaneChangeState . laneChangeFinishing
# finishing
# finishing
elif self . lane_change_state == LaneChangeState . laneChangeFinishing and lane_change_prob < 0.5 :
elif self . lane_change_state == LaneChangeState . laneChangeFinishing :
if one_blinker :
# fade in laneline over 1s
self . lane_change_ll_prob = min ( self . lane_change_ll_prob + DT_MDL , 1.0 )
if one_blinker and self . lane_change_ll_prob > 0.99 :
self . lane_change_state = LaneChangeState . preLaneChange
self . lane_change_state = LaneChangeState . preLaneChange
else :
elif self . lane_change_ll_prob > 0.99 :
self . lane_change_state = LaneChangeState . off
self . lane_change_state = LaneChangeState . off
if self . lane_change_state in [ LaneChangeState . off , LaneChangeState . preLaneChange ] :
if self . lane_change_state in [ LaneChangeState . off , LaneChangeState . preLaneChange ] :
@ -136,8 +152,8 @@ class PathPlanner():
# Turn off lanes during lane change
# Turn off lanes during lane change
if desire == log . PathPlan . Desire . laneChangeRight or desire == log . PathPlan . Desire . laneChangeLeft :
if desire == log . PathPlan . Desire . laneChangeRight or desire == log . PathPlan . Desire . laneChangeLeft :
self . LP . l_prob = 0.
self . LP . l_prob * = self . lane_change_ll_prob
self . LP . r_prob = 0.
self . LP . r_prob * = self . lane_change_ll_prob
self . libmpc . init_weights ( MPC_COST_LAT . PATH / 10.0 , MPC_COST_LAT . LANE , MPC_COST_LAT . HEADING , self . steer_rate_cost )
self . libmpc . init_weights ( MPC_COST_LAT . PATH / 10.0 , MPC_COST_LAT . LANE , MPC_COST_LAT . HEADING , self . steer_rate_cost )
else :
else :
self . libmpc . init_weights ( MPC_COST_LAT . PATH , MPC_COST_LAT . LANE , MPC_COST_LAT . HEADING , self . steer_rate_cost )
self . libmpc . init_weights ( MPC_COST_LAT . PATH , MPC_COST_LAT . LANE , MPC_COST_LAT . HEADING , self . steer_rate_cost )