This commit is contained in:
rav4kumar
2025-10-31 07:05:03 -07:00
parent 3ced0d6115
commit 5ef2f5d1fb
2 changed files with 36 additions and 13 deletions
@@ -23,11 +23,11 @@ MAX_ACCEL_BREAKPOINTS = [0., 4., 6., 9., 16., 25., 30., 55.]
# Braking Profiles
MIN_ACCEL_PROFILES = {
AccelPersonality.eco: [-0.0000002, -0.0000002, -0.2, -0.2, -1.20],
AccelPersonality.normal: [-0.0000002, -0.0000002, -0.3, -0.3, -1.20],
AccelPersonality.sport: [-0.0000003, -0.0000003, -0.4, -0.4, -1.20],
AccelPersonality.eco: [-0.0000002, -0.0000002, -0.24, -1.20],
AccelPersonality.normal: [-0.0000002, -0.0000002, -0.26, -1.20],
AccelPersonality.sport: [-0.0000003, -0.0000003, -0.28, -1.20],
}
MIN_ACCEL_BREAKPOINTS = [0., 5., 8., 14., 25.]
MIN_ACCEL_BREAKPOINTS = [0., 5., 8., 25.]
DECEL_SMOOTH_ALPHA = 0.08 # Very aggressive smoothing for decel (lower = smoother)
ACCEL_SMOOTH_ALPHA = 0.20 # Less aggressive for accel (higher = more responsive)
@@ -31,10 +31,21 @@ class FollowDistanceController:
self.params = Params()
self.frame = 0
self.personality = LongPersonality.standard
self.current_multiplier = 1.40
self.target_multiplier = self.current_multiplier
self.current_multiplier = None
self.first_run = True
self.personality_change_cooldown = 0
self.personality_cooldown_frames = int(PERSONALITY_CHANGE_COOLDOWN_S / DT_MDL)
self._load_personality()
def _load_personality(self):
try:
saved = self.params.get('LongitudinalPersonality')
if saved is not None:
val = int(saved)
if val in [LongPersonality.relaxed, LongPersonality.standard, LongPersonality.aggressive]:
self.personality = val
except (ValueError, TypeError):
pass
def _update_from_params(self):
if self.frame % int(1. / DT_MDL) != 0:
@@ -44,10 +55,16 @@ class FollowDistanceController:
self.personality_change_cooldown -= 1
return
new_personality = int(self.params.get('LongitudinalPersonality'))
if new_personality != self.personality:
self.personality = new_personality
self.personality_change_cooldown = self.personality_cooldown_frames
try:
param = self.params.get('LongitudinalPersonality')
if param is not None:
val = int(param)
if val in [LongPersonality.relaxed, LongPersonality.standard, LongPersonality.aggressive]:
if val != self.personality:
self.personality = val
self.personality_change_cooldown = self.personality_cooldown_frames
except (ValueError, TypeError):
pass
def _get_smoothing_factor(self, v_ego: float) -> float:
speed_factor = np.clip(v_ego / SMOOTHING_SPEED_THRESHOLD, 0.3, 1.0)
@@ -63,11 +80,17 @@ class FollowDistanceController:
def get_follow_distance_multiplier(self, v_ego: float) -> float:
self._update_from_params()
self.target_multiplier = float(np.interp(v_ego, FOLLOW_BREAKPOINTS, FOLLOW_PROFILES[self.personality]))
v_ego = max(0.0, v_ego)
target = float(np.interp(v_ego, FOLLOW_BREAKPOINTS, FOLLOW_PROFILES[self.personality]))
if self.first_run:
self.current_multiplier = target
self.first_run = False
return self.current_multiplier
#exponential smoothing with speedadaptive factor
smoothing_factor = self._get_smoothing_factor(v_ego)
self.current_multiplier = (smoothing_factor * self.current_multiplier + (1.0 - smoothing_factor) * self.target_multiplier)
alpha = self._get_smoothing_factor(v_ego)
self.current_multiplier = alpha * self.current_multiplier + (1.0 - alpha) * target
return self.current_multiplier
def update(self):