VEU.WathBody/Форматы_тренировок_и_рекоме...

136 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Форматы импорта/экспорта тренировок: обзор и рекомендации
Дата составления: 17.10.2026
Привязка к проекту: приложение для силовых тренировок «Феникс 6X» (Garmin Fenix 6 Edition), см. «Техническое задание.md»
---
## 1. Общая картина: две категории форматов
Все популярные форматы делятся на две принципиально разные группы, и их часто путают:
1. **Форматы активностей** — файлы с записью уже выполненной тренировки: телеметрия (пульс, GPS, мощность), круги/подходы, время.
2. **Форматы структурированных планов** — файлы с *планом* тренировки: последовательность интервалов с целевой мощностью/пульсом/темпом, которую тренажёр или часы показывают пользователю в реальном времени.
Для «Феникса 6X» основная категория — первая (запись выполненных силовых тренировок), но формат планов важен, если в будущем появится загрузка готовых программ на часы.
---
## 2. Форматы активностей (записанные тренировки)
### 2.1. FIT (Flexible and Interoperable Data Transfer) — основной стандарт
- **Разработчик:** Garmin (спецификация открыта, есть официальный FIT SDK).
- **Тип:** компактный бинарный формат с типизированными «сообщениями» (Activity, Session, Record, Lap, Set, Hr и т.д.).
- **Поддержка:** Garmin, Strava, Polar, Suunto, Coros, Zwift, TrainerRoad, intervals.icu, Komoot и практически вся индустрия.
- **Плюсы:**
- Самые полные данные при минимальном размере файла (в разы меньше TCX/GPX при том же объёме телеметрии).
- Поддерживает данные силовых тренировок: тип активности `strength_training`, сообщения `Set` (подходы), `Lap` (круги), счётчики повторений, вес, отдельные замеры пульса с миллисекундной точностью.
- Хранит метаданные устройства, зон пульса, FTP и др.
- **Минусы:** бинарный — нельзя читать «глазами» или обычным парсером XML/JSON; нужен SDK или библиотека.
- **Роль в индустрии:** де-факто стандарт «первичного» формата. Strava и Garmin рекомендуют именно FIT как оригинал; TCX/GPX считаются производными.
### 2.2. TCX (Training Center XML)
- **Разработчик:** Garmin (наследие Garmin Training Center).
- **Тип:** XML.
- **Плюсы:** читается любым XML-парсером; поддерживает круги (Lap), курс-поинты, базовую телеметрию (пульс, каденс, мощность).
- **Минусы:** объём файла значительно больше FIT; нет ряда современных полей (силовые подходы, вес в подходе, расширенные данные датчиков); формат фактически заморожен в развитии.
- **Роль:** распространённый «запасной» формат импорта/экспорта. Поддерживается Strava, MapMyFitness, TrainingPeaks и др.
### 2.3. GPX (GPS Exchange Format)
- **Тип:** XML, открытый стандарт.
- **Плюсы:** максимальная универсальность — понимают все картографические сервисы и спортивные приложения; идеален для маршрутов.
- **Минусы:** по сути только GPS-трек и отметки времени (waypoints); пульс и каденс — лишь в виде нестандартных расширений, мощность и силовые данные отсутствуют.
- **Роль:** формат для маршрутов и треков, а не для полноценной телеметрии. Для силовых тренировок бесполезен (нет перемещения), но полезен для будущего функционала бега/велосипеда.
### 2.4. Прочие
- **HRM** — текстовый формат старых нагрудных датчиков Garmin; встречается только как legacy-импорт.
- **PWX** — XML-формат Peaksware (TrainingPeaks); нишевый, для обмена с Train/Lift-инструментами.
- **CSV** — не спортивный формат, а универсальная табличная выгрузка; используется в отчётах (веб-интерфейс сервера в ТЗ уже предусматривает экспорт в CSV).
---
## 3. Форматы структурированных планов (интервальные тренировки)
- **ZWO** — XML-формат Zwift, современный стандарт де-факто для структурированных тренировок в помещении: шаги с целевой мощностью в % FTP, пульсом, каденсом, текстовыми подсказками. Поддерживается intervals.icu, TrainingPeaks, большинством тренажёрных приложений (кроме некоторых, например MyWhoosh).
- **ERG** — простой текстовый формат времён TrainerRoad: пары «время → целевая мощность в % FTP».
- **MRC** — то же, что ERG, но мощность в абсолютных ваттах.
- **FIT (workout-профиль)** — тот же бинарный FIT, но с workout-сообщениями; основной способ доставки структурированной тренировки на устройства Garmin (через Garmin Connect).
- **PWX** — также используется TrainingPeaks для планов.
Конвертация между ZWO / FIT / ERG / MRC — рутинная операция, есть онлайн-инструменты (What's on Zwift, GOTOES) и открытые парсеры.
---
## 4. Сравнительная таблица
| Формат | Категория | Тип | Полнота данных | Размер | Силовые тренировки | Поддержка индустрией |
|---|---|---|---|---|---|---|
| FIT | активность | бинарный | максимальная | минимальный | да (`strength_training`, Set, Lap) | практически повсеместная |
| TCX | активность | XML | средняя | средний/большой | частично (только Lap) | широкая |
| GPX | активность | XML | только GPS-трек | большой | нет | универсальная |
| ZWO | план | XML | хорошая (мощность/пульс) | малый | нет | тренажёрные приложения |
| ERG/MRC | план | текст | мощность | минимальный | нет | TrainerRoad-наследие |
| PWX | активность/план | XML | хорошая | средний | частично | экосистема TrainingPeaks |
| CSV | выгрузка | текст | произвольная | минимальный | да (как таблица) | все, но без телеметрии |
---
## 5. Рекомендации для проекта «Феникс 6X»
### 5.1. Канал данных из Garmin
ТЗ (п. 2.3) уже выбрано верно: данные силовых тренировок забираются из Garmin Connect API в виде **.fit** — это правильный выбор, поскольку:
- FIT — единственный формат, в котором часы Fenix 6 пишут полный набор данных силовой тренировки (подходы-Set, круги-Lap, непрерывный трек пульса, счёт повторений).
- TCX/GPX-экспорт из Garmin Connect теряет значительную часть этой информации (в TCX остаются только круги, в GPX — ничего силового).
### 5.2. Парсинг FIT на сервере
- Python: официальный `garmin-fit-sdk` (Garmin) или community-библиотеки `fitdecode` / `python-fitparse`.
- Node.js: официальный `@garmin-fit/sdk` или `fit-file-parser`.
- Java/C#: официальный FIT SDK от Garmin.
- Что извлекать для «Феникса 6X»: `Session` (тип активности, время), `Lap` (границы подходов — соответствуют нажатиям кнопки Lap по ТЗ), `Record` (дискретный пульс для графика и средних за подход), `Set` (повторения/вес, если писал профиль Strength).
### 5.3. Импорт/экспорт приложения
Рекомендуемый набор:
1. **Экспорт активности: FIT (основной) + GPX (опционально, для будущих видов спорта с треками).** FIT-файл, сгенерированный приложением, можно положить в Garmin Connect / Strava вручную или через API.
2. **Импорт: FIT, TCX, GPX.** Покрывает данные из Garmin, Strava, HealthFit (Apple Watch), Suunto, Polar и почти любых сервисов. Импорт TCX/GPX нужен как fallback для источников без FIT.
3. **Внутренний формат хранения и API сервера: JSON** (структура собственной БД), CSV — только как отчётная выгрузка веб-интерфейса (уже предусмотрено ТЗ).
4. **Планы тренировок (если появятся):** целевой формат — FIT workout для доставки на часы Garmin; при необходимости конвертация из ZWO.
### 5.4. Чего избегать
- Не использовать GPX как основной формат — для силовых тренировок он бесполезен.
- Не изобретать собственный бинарный формат — FIT закрывает все потребности и обеспечивает совместимость с экосистемой Garmin, ради которой проект и затевался.
- Не опираться на TCX для силовых данных — формат не хранит подходы/вес/повторения.
---
## 6. Полезные инструменты
- **Garmin FIT SDK** (официальный, бесплатный): https://developer.garmin.com/fit/ — спецификация, SDK для C/C++/Java/JS/C#/Python.
- **What's on Zwift converter** — конвертация ZWO ↔ ERG ↔ MRC ↔ FIT: https://whatsonzwift.com/convert/workouts
- **GOTOES** — объединение и конвертация FIT/GPX/TCX/CSV: https://gotoes.org/strava/Combine_GPX_TCX_FIT_Files.php
- **FitFileViewer** — десктопный просмотрщик FIT-файлов (Electron, открытый код) для отладки парсинга.
- **GoldenCheetah / intervals.icu** — референсные реализации разбора FIT-данных.
---
## 7. Источники
- GPX, TCX, FIT: How to choose the best file extension for sport activity transfer — Decathlon Digital: https://medium.com/decathlondigital/gpx-tcx-fit-how-to-choose-the-best-file-extension-for-sport-activity-transfer-403487337c04
- MapMyFitness: Importing TCX, GPX, HRM, and FIT Files: https://help.mapmyfitness.com/hc/en-us/articles/36780201550871-Importing-TCX-GPX-HRM-and-FIT-Files
- TrainerRoad forum: TCX vs FIT: https://www.trainerroad.com/forum/t/download-tcx-instead-of-fit-used-to-be-tcx/8094
- TrainingPeaks: Structured Workout sync and Manual Export: https://help.trainingpeaks.com/hc/en-us/articles/115000325647-Structured-Workout-sync-and-Manual-Export
- TrainingPeaks: Import Planned Workouts into TrainingPeaks: https://help.trainingpeaks.com/hc/en-us/articles/32432105650573-Import-Planned-Workouts-into-TrainingPeaks
- intervals.icu forum: типичные форматы тренировок: https://forum.intervals.icu/t/import-workout-fit-file-on-calendar/17647
- Zwift Insider: intervals.icu ↔ Zwift Training API: https://zwiftinsider.com/intervals-integration
- HealthFit: экспорт тренировок Apple Watch в FIT/TCX/GPX: https://theapplewatchtriathlete.com/blog-1/2017/10/6/exporting-your-apple-workout-data-to-fit-files-with-the-healthfit-app
- What's on Zwift: Workout converter: https://whatsonzwift.com/convert/workouts