diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index 3347861..a92d622 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -263,7 +263,6 @@ def main() -> NoReturn: sm = messaging.SubMaster(['cameraOdometry', 'carState', 'carParams'], poll='cameraOdometry') calibrator = Calibrator(param_put=True) - dbg_prev_valid = True # CLEARPILOT: track valid transitions while 1: timeout = 0 if sm.frame == -1 else 100 @@ -285,14 +284,13 @@ def main() -> NoReturn: # 4Hz driven by cameraOdometry if sm.frame % 5 == 0: - cal_valid = sm.all_checks() - # CLEARPILOT: log per-sub detail on transition to invalid — goes to calibrationd.log - if cal_valid != dbg_prev_valid and not cal_valid: - import sys - bad = [s for s in sm.alive if not (sm.alive[s] and sm.valid[s] and sm.freq_ok.get(s, True))] - details = [f"{s}(a={sm.alive[s]},v={sm.valid[s]},f={sm.freq_ok[s]})" for s in bad] - print(f"CLP liveCalibration valid=False: {' '.join(details)}", file=sys.stderr, flush=True) - dbg_prev_valid = cal_valid + # CLEARPILOT: publish valid based on calibration status, not upstream sm.all_checks(). + # Original openpilot gated valid on fresh inputs, but that caused a cascade: + # upstream freq glitches → liveCalibration.valid=False → locationd stays + # uninitialized → paramsd fed garbage → bogus steerRatio/stiffnessFactor → erratic + # steering. "valid" semantically means "calibration data is trustworthy"; that's a + # question about calibration convergence, not input freshness. + cal_valid = calibrator.cal_status == log.LiveCalibrationData.Status.calibrated calibrator.send_data(pm, cal_valid)