suboptimumg.log_analysis.gps_laps#
- type suboptimumg.log_analysis.gps_laps.Point = tuple[float, float]#
- suboptimumg.log_analysis.gps_laps.align_laps(laps, baseline_lap=None)[source]#
Align each lap’s
posXandposYDataInstances to a baseline using cKDTree + Nelder-Mead to minimize mean log-nearest-neighbour distance. Only considers translations of the GPS points.- Parameters:
laps (list[SingleRunData]) – List of SingleRunData objects corresponding to each lap, typically generated by split_laps_from_gps.
baseline_lap (int) – Index into
lapsto use as the alignment reference. If None, dynamically picks the fastest lap as the basline
- Returns:
Index of the baseline lap used for alignment.
- Return type:
int
- suboptimumg.log_analysis.gps_laps.detect_lap_crossings(pos_x, pos_y, timestamps, sf_line, min_lap_time=10.0)[source]#
Detect start/finish line crossings and return their timestamps. Crossings separated by less than
min_lap_timeare ignored to suppress false positives (e.g. GPS jitters).- Parameters:
pos_x (NDArray[float64]) – X and Y coordinates in meters, same length as timestamps.
pos_y (NDArray[float64]) – X and Y coordinates in meters, same length as timestamps.
timestamps (NDArray[float64])
sf_line (((x1, y1), (x2, y2))) – Start/finish line endpoints in local X/Y meters.
min_lap_time (float) – Minimum elapsed time between accepted crossings (same unit as timestamps).
- Returns:
Timestamps of each accepted S/F crossing, in order.
- Return type:
list[float]
- suboptimumg.log_analysis.gps_laps.split_laps_from_gps(data, sf_line, min_lap_time=10.0)[source]#
Detect laps via GPS and split SingleRunData into per-lap segments.
- Parameters:
data (SingleRunData) – Must contain
posXandposY.sf_line (((x1, y1), (x2, y2))) – Start/finish line endpoints in local X/Y meters.
min_lap_time (float) – Minimum elapsed time between crossings (same unit as data timestamps).
- Return type:
List[SingleRunData]