Projekt

Allgemein

Profil

Fehler #127

Von Julius Haman vor 9 Tagen aktualisiert

Distanz und Zeitstempel eines Trainingspunkts passen nicht sauber zusammen. Die Distanz wächst je Poll-Tick um Geschwindigkeit × echte Tick-Dauer (Timer-Jitter, etwa 0,9 bis 1,1 s). Der Zeitstempel (`TrainingPoint.Time`) war ist die auf ganze Sekunden abgeschnittene Trainingszeit, und seit #115 gab gibt es höchstens einen Punkt je Sekunde. Dadurch wich weicht der Zeitabstand zweier Punkte um bis zu ±1 s von der Zeit ab, in der die Distanz gewachsen ist. 

 ### Auswirkung 
 Wer die Geschwindigkeit aus Distanz und Zeit ableitet, bekommt starke Schwankungen bei gleichmäßiger Fahrt. Beispiel Training20261001.fit: Intervalle mit 9,2 km/h direkt neben 36 bis 41 km/h, obwohl die Fahrt gleichmäßig war. Gesamtdistanz und Durchschnitt stimmen. Betroffen sind Distanz-Zeit-Auswertungen in anderen Programmen (z.B. Garmin Connect). Connect, wenn keine Geschwindigkeit in der Datei steht); die Exporte schreiben seit #122/#123 die gespeicherte Geschwindigkeit explizit und sind davon weniger betroffen. 

 ### Lösung Lösungsansatz 
 Die Aufzeichnung speichert den echten Messzeitpunkt, statt Daten auf die ganze Sekunde geradezuziehen. Anpassungen an Zielformate geschehen im Export, nicht in den Rohdaten. 

 * **Zeit:** `TrainingPoint.Time` hält Dezimalsekunden (NUMERIC, ms-genau, z.B. 42,437) statt ganzer Sekunden. Spaltentyp-Änderung in der Migration Version3140; Bestandswerte (ganze Sekunden) bleiben unverändert gültig. `Training.Duration` bleibt ganzzahlig. 
 * **Recorder:** Zeit, Distanz, Geschwindigkeit, Mittelwerte und Kalorien beruhen auf der echten Tickzeit (Mittelwerte und Kalorien mit ms-Zeitdelta). Die Interpolation der Distanz je Trainingspunkt auf die Sekundenmarke entfällt. 
 * **Poll-Timer:** interpolieren, statt den Wert des Ticks zu speichern: Der Timer feuert nicht mehr im festen Takt, sondern der nächste Tick wird erst nach dem vorigen angestoßen. Antwortet das Ergometer erst nach 5 s, folgt der nächste Poll etwa 1 Punkt für Sekunde n bekommt die Distanz bei exakt n s danach; es staut sich nichts auf, (linear zwischen den Tick-Werten davor und es entsteht kein Burst nachlaufender Ticks. Der Simulator behält seinen eigenen Takt. Die serielle Verbindungslogik ist unverändert. danach). 
 * **Profilzeit:** Die Position in Puls- und Leistungsprofilen wird aus der Tretzeit in Sekunden berechnet (nur bei Trittfrequenz > 0, um das Alternativ die Zeit des Punkts auf die echte Zeitdelta fortgeschrieben) Tick-Zeit runden statt aus einem Tick-Zähler. Der Zähler setzte 1 Tick = 1 s voraus und ließ ein Profil bei Jitter oder Lücken zu langsam laufen. abschneiden (kleinerer Eingriff, behebt aber nur einen Teil). 
 * **Export TCX:** Trackpoint-Zeit mit Millisekunden (das Format erlaubt Sekundenbruchteile), Rohdaten unverändert. 
 * **Export FIT, HRM, CSV:** Diese Formate kennen nur ganze Sekunden bzw. ein festes 1-s-Intervall (FIT: `RecordMesg.Timestamp` ohne Millisekunden). Die Punkte werden deshalb beim Export auf ein 1-Hz-Raster gesetzt (`TrainingPointInterpolation.ToWholeSeconds`): Distanz, Höhe, Position Geschwindigkeit, Mittelwerte, Kalorien und Geschwindigkeit linear interpoliert, Puls, Trittfrequenz und Leistung wie zuletzt gemessen. Das Raster reicht bis zur Sekunde des letzten Punkts (aufgerundet), damit der Datenstrom nicht vor der Gesamtdistanz endet. Live-Tacho bleiben unverändert. 

 Geprüft mit einem simulierten Kurztraining: Im TCX stimmen Distanzzuwachs je Zeitabstand und gespeicherte Geschwindigkeit überein (Abweichung ≤ 0,3 %, Rundung der Distanz); im FIT liegen die Records auf ganzen Sekunden mit gleichmäßigen Distanzzuwächsen, der letzte Record entspricht der Session-Distanz. 

 ### Offen 
 * Bestandstrainings werden bewusst nicht korrigiert: Die echten Tick-Zeiten wurden nie gespeichert, eine Rekonstruktion aus der gespeicherten Geschwindigkeit wäre nur eine Näherung (und bei nachträglich berechneter Geschwindigkeit älterer Trainings gar nicht möglich) und würde Messdaten unwiderruflich ändern. Ihre Zeiten bleiben ganze Sekunden. Die Exporte schreiben die gespeicherte Geschwindigkeit seit #122/#123 ohnehin explizit. 
 * Ein Test mit echter Fahrt steht noch aus: Poll-Timer bei hängendem Gerät, Leistungs- Der Eingriff liegt in RecordTrainingPoint und Pulsprofil (Profilzeit) und Upload der Dateien braucht Tests für die Interpolation (Jitter-Fälle). Für das ViewModel gibt es kein Test-Gerüst, die Interpolation sollte deshalb in Garmin Connect. 
 * `Training.Duration` wird wie bisher abgeschnitten (5,997 s → 5). Die Session-Dauer im Export kann dadurch knapp 1 s kürzer sein als der Datenstrom; bewusst unverändert, weil eine Rundung auch Anzeige und Bestandslogik beträfe. testbare Hilfsklasse. 
 * Version: 3.1.4. 
 Umgesetzt wurde die Interpolation der Distanz (und davon abhängig Position/Höhe) auf die Sekundenmarke in einer testbaren Hilfsklasse (TrainingPointInterpolation); ein Test mit echter Fahrt steht noch aus.

Zurück