Elevate: ν”ΌνŠΈλ‹ˆμŠ€ νŠΈλ Œλ“œ "ν˜•νƒœ"λŠ” μ–΄μ œμ˜ "ν”ΌνŠΈλ‹ˆμŠ€"와 "ν”Όλ‘œ"λ₯Ό κΈ°λ°˜μœΌλ‘œν•΄μ•Όν•©λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 04μ›” 23일  Β·  18μ½”λ©˜νŠΈ  Β·  좜처: thomaschampagne/elevate

ν™˜κ²½ μ„€λͺ…

  • ν”ŒλŸ¬κ·ΈμΈ 버전 : 6.1.2 μ•ˆμ •
  • Chrome / Opera / Chromium 버전 : Chrome
  • OS 버전 : Mac OS

문제 μ„€λͺ… :

ν˜„μž¬ Form은 같은 λ‚ μ˜ Fitness와 Fatigue의 차이둜 κ³„μ‚°λ˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ–΄μ œμ˜ ν”ΌνŠΈλ‹ˆμŠ€ 및 ν”Όλ‘œλ₯Ό κΈ°λ°˜μœΌλ‘œν•˜λŠ” 것이 더 λ‚˜μ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  이것은 λ…ΌμŸμ˜ 여지가 μžˆμŠ΅λ‹ˆλ‹€. λ‹€μŒ 두 가지 사항 만 μ œμ•ˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
a) ν›ˆλ ¨ ν”Όλ‘œκ°€ λ‹€μŒλ‚  더 많이 λŠκ»΄μ§€λ―€λ‘œ μ£Όκ΄€μ μœΌλ‘œ 더 μ •ν™•ν•˜λ‹€κ³  λŠλ‚λ‹ˆλ‹€.
b) TrainingPeaks κ·Έ μΌλœλ‹€ ( μ—¬κΈ°μ—μ„œ , "폼"λΆ€)

bug major

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@aprokop 이 심측 뢄석에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! λͺ…ν™•ν•˜κ³  λͺ¨ν˜Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

λͺ¨λ“  18 λŒ“κΈ€

μ •μ˜μ— λ”°λ₯Έ ν˜•μ‹μ€ (TrainingPeaks)μž…λ‹ˆλ‹€.
ν›ˆλ ¨ 슀트레슀 κ· ν˜• (TSB) λ˜λŠ” 양식은 ν›ˆλ ¨ 슀트레슀의 κ· ν˜•μ„ λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

양식 (TSB) = μ–΄μ œ ν”ΌνŠΈλ‹ˆμŠ€ (CTL)-μ–΄μ œ ν”Όλ‘œ (ATL)

https://help.trainingpeaks.com/hc/en-us/articles/204071764-Form-TSB-

@aprokop 예, μ‚¬μš© 된 μˆ˜ν•™ λͺ¨λΈμ„ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€. μˆ˜μ‹μ΄ λ„μš°λ―Έμ— μžˆμŠ΅λ‹ˆλ‹€.

@thomaschampagne κ·€ν•˜μ˜ μ˜κ²¬μ„ μ΄ν•΄ν•˜μ§€

@aprokop 예. ν”ΌνŠΈλ‹ˆμŠ€ λͺ¨λΈ 높이기 = ν›ˆλ ¨ 피크 λͺ¨λΈ

image

@thomaschampagne κ·Έλ ‡κ²Œ μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. TrainingPeaks λͺ¨λΈμ€

Form(day+1) = Fitness(day) - Fatigue(day)

λ‹€λ₯Έ 두 곡식이 μ •ν™•ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...

λ‚΄ TrainingPeaks 곑선을 보면 큰 λ…Έλ ₯이 같은 λ‚ μ—λŠ” 체λ ₯κ³Ό ν”Όλ‘œ, λ‹€μŒ λ‚ μ—λŠ” ν˜•νƒœμ— μƒλ‹Ήν•œ 영ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€.

screen shot 2018-10-16 at 9 33 13 am

λ‚΄ μš”μ μ΄κΈ°λ„ν•©λ‹ˆλ‹€.

@thomaschampagne κ·Έλ ‡κ²Œ μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. TrainingPeaks λͺ¨λΈμ€

ν˜•νƒœ (일 +1) = 체λ ₯ (일)-ν”Όλ‘œ (일)

μ•Œκ² μŠ΅λ‹ˆλ‹€. μ΄ν•΄ν•˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. 티켓을 λ‹€μ‹œ μ—΄μ—ˆμŠ΅λ‹ˆλ‹€. 발꡴ ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€. FYI μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service.ts#L243

PR을 λ§Œλ“œλŠ” 것이 λ‹Ήμ‹ μ—κ²Œ κ°€λŠ₯ν•œ μΌμž…λ‹ˆκΉŒ, μ•„λ‹ˆλ©΄ μ œκ°€ 직접 μ²˜λ¦¬ν•©λ‹ˆκΉŒ?

이 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ—… ν•œ 적은 μ—†μ§€λ§Œ μΆ©λΆ„νžˆ 쉽닀고 μƒκ°ν•œλ‹€λ©΄ μ‹œλ„ν•΄ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄ μ£Όμš” κ΄€μ‹¬μ‚¬λŠ” 영ν–₯μ„λ°›λŠ” μ½”λ“œμ˜ λ²”μœ„μ™€ μž¬κ΅¬μ„±μ΄ ν•„μš”ν•œμ§€ μ—¬λΆ€μž…λ‹ˆλ‹€.

@aprokop λ²”μœ„λŠ” https://github.com/thomaschampagne/elevate/blob/990b5d0fc11113b2c4d120e6aec9f0ba3dc0e844/plugin/app/src/app/fitness-trend/shared/services/fitness.service.ts#L226

ν•˜μ§€λ§Œ κ±±μ •ν•˜μ§€ λ§ˆμ„Έμš”. λ³€κ²½ 사항을 ν…ŒμŠ€νŠΈν•˜κ³  κ²€μ¦ν•˜λ €λ©΄ 도움이 ν•„μš”ν•©λ‹ˆλ‹€.

@aprokop μ•„λž˜μ— λŒ€ν•΄ 100 % ν™•μ‹ ν•˜μ‹­λ‹ˆκΉŒ?

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...
Fatigue(day+1) = Fatigue(day) + (StressScore(day+1)-Fatigue(day)) x ...

ꢌμž₯ μ‚¬ν•­μœΌλ‘œ μ½”λ“œλ₯Ό μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€ (컀밋 https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572bλ₯Ό 톡해). κΈ°μ‘΄ μ½”λ“œμ˜ κ΅¬ν˜„μ„ λ‹¨μˆœν™”ν•˜κΈ° μœ„ν•΄ λ‹€μŒκ³Ό 같은 μˆ˜μ‹μ„ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x ...
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x ...
Form(day) = Fitness(day-1) - Fatigue(day-1)

νŠΈμœ— λ‹΄μ•„ κ°€κΈ°

  • λ˜ν•œ μ•„λž˜ λΉŒλ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κ³  TrainingPeaks와 λΉ„κ΅ν•˜μ—¬ νšŒκ·€μ—†μ΄ λͺ¨λ“  것이 정상인지 확인할 수 μžˆμŠ΅λ‹ˆκΉŒ? (λΉŒλ“œλŠ” 컀밋 https://github.com/thomaschampagne/elevate/commit/ec73ee0c5a6d3c78662c41b94a4e090c70a1572b ofcλ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€)

ν…ŒμŠ€νŠΈ λΉŒλ“œ : v6.6.0_stable_ec73ee0_2018-10-17-16-05.zip

λ‹Ήμ‹ μ˜ 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :)

μ•ˆλ…•ν•˜μ„Έμš”.

μ•„λž˜μ— λŒ€ν•΄ 100 % ν™•μ‹ ν•˜μ‹­λ‹ˆκΉŒ?

예, μ•„λ‹ˆμ˜€. 예, 같은 λ‚ μ˜ λ…Έλ ₯이 같은 λ‚ μ˜ ν”ΌνŠΈλ‹ˆμŠ€ / ν”Όλ‘œμ— 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμœΌλ―€λ‘œ TrainingPeaks와 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” μ μ—μ„œ 잘λͺ»λœ κ²ƒμž…λ‹ˆλ‹€. λ°˜λ“œμ‹œ StressScore (day)λ₯Ό StressScore (day + 1)둜 λ³€κ²½ν•΄μ•Όν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 그것이 μ •ν™•ν•œ 곡식인지 ν™•μ‹€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ·Έ 곡식은

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...

μ˜λ―Έκ°€μžˆμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€ (그러면 Fitness (day + 1)에 λŒ€ν•΄ ν•΄κ²°ν•΄μ•Όν•©λ‹ˆλ‹€). ν•˜μ§€λ§Œ κ·ΈλŒ€λ‘œ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

컀밋은 μ œμ•ˆ 된 곡식을 μ˜¬λ°”λ₯΄κ²Œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. prevCtl 및 친ꡬ의 μ—…λ°μ΄νŠΈλ₯Ό if (isPreStartDay) μ ˆμ—μ„œ 제거 ν•  수 μžˆμ§€λ§Œ μ΄λŠ” μ‚¬μ†Œν•œ κ²ƒμž…λ‹ˆλ‹€.

집에 λ„μ°©ν•˜λ©΄ 저녁에 ν…ŒμŠ€νŠΈ ν•΄ λ³Όκ²Œμš”.

μ‹œλ„ν•΄ λ³΄μ•˜κ³  μ˜ˆμƒλŒ€λ‘œ μž‘λ™ν•©λ‹ˆλ‹€. 체λ ₯κ³Ό ν”Όλ‘œκ°€ 같은 λ‚ κΉŒμ§€κ°€λŠ” λ™μ•ˆ ν˜•νƒœλŠ”, λ‹€μŒ λ‚  λ–¨μ–΄μ‘Œλ‹€. κ·Έλž˜μ„œ μ§€κΈˆμ€ λ‹€ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
screenshot_20181017_202434

@aprokop ν…ŒμŠ€νŠΈμ™€ 검토에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! λ”°λΌμ„œ 두 가지 곡식이 μžˆμŠ΅λ‹ˆλ‹€.

Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ...
-- or --
Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day)) x ...

ν•˜μ§€λ§Œ 첫 번째 λ¬Έμ œκ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. Fitness(day+1) 도 ν‘œν˜„μ‹μ˜ 일뢀인 경우 Fitness(day+1) 을 κ³„μ‚°ν•˜λŠ” 것이 μ΄μƒν•©λ‹ˆλ‹€ ... 이것이 μš°λ¦¬κ°€ μ°Ύκ³ μžν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

그리고 ν‘œν˜„μ„ ν’€λ©΄

Fitness(day+1) = (Fitness(day) - k * StressScore(day+1)) /(1 - k)  where k = exp(-1/42)

... 말이 돼?!

TrainingPeaksμ—μ„œ 맀일 CSV 데이터λ₯Ό λ‚΄λ³΄λ‚΄λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ TrainingPeaks κ·Έλž˜ν”„ 슀크린 μƒ·μ—μ„œ 더 λ§Žμ€ 정보λ₯Ό μ–»μœΌμ‹œκ² μŠ΅λ‹ˆκΉŒ?

TrainingPeaks κ·Έλž˜ν”„ 슀크린 μƒ·μ—μ„œ 빨간색 점이 λ…Έλ ₯의 λ‚ μž…λ‹ˆκΉŒ? μš΄λ™ν•˜λŠ” λ‚  체λ ₯κ³Ό ν”Όλ‘œ 곑선이 μ˜¬λΌκ°„λ‹€λŠ” 것을 ν™•μΈν•©λ‹ˆκΉŒ?

λ‹Ήμ‹ μ˜ 도움을 μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€ :)

@thomaschampagne Fitness(day+1) = Fitness(day) + (StressScore(day+1)-Fitness(day+1)) x ... 이 μ΄μƒν•˜λ‹€λŠ” 데 λ™μ˜ν•©λ‹ˆλ‹€. 100 % ν™•μ‹€ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ–ΈκΈ‰ν–ˆμŠ΅λ‹ˆλ‹€.

TrainingPeaksμ—μ„œ 맀일 CSV 데이터λ₯Ό λ‚΄λ³΄λ‚΄λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ? μ•„λ‹ˆλ©΄ TrainingPeaks κ·Έλž˜ν”„ 슀크린 μƒ·μ—μ„œ 더 λ§Žμ€ 정보λ₯Ό μ–»μœΌμ‹œκ² μŠ΅λ‹ˆκΉŒ?

이것은 정말 쒋은 μƒκ°μž…λ‹ˆλ‹€. λ‚˜λŠ” 그것이 κ°€λŠ₯ν•˜λ‹€κ³  믿으며 과거에 κ·Έλ ‡κ²Œν–ˆμŠ΅λ‹ˆλ‹€. 졜근 데이터λ₯Ό κ°€μ Έ μ˜€κ² μŠ΅λ‹ˆλ‹€.

TrainingPeaks κ·Έλž˜ν”„ 슀크린 μƒ·μ—μ„œ 빨간색 점이 λ…Έλ ₯의 λ‚ μž…λ‹ˆκΉŒ? μš΄λ™ν•˜λŠ” λ‚  체λ ₯κ³Ό ν”Όλ‘œ 곑선이 μ˜¬λΌκ°„λ‹€λŠ” 것을 ν™•μΈν•©λ‹ˆκΉŒ?

예, 빨간색 점은 맀일 TSS 값이고 νŒŒλž€μƒ‰ 점은 κ°•λ„μž…λ‹ˆλ‹€.

μš΄λ™ν•˜λŠ” λ‚  체λ ₯κ³Ό ν”Όλ‘œ 곑선이 μ˜¬λΌκ°„λ‹€λŠ” 것을 ν™•μΈν•©λ‹ˆκΉŒ?

예.

μ’‹μŠ΅λ‹ˆλ‹€. μš΄λ™μ€ 내보낼 수 μžˆμ§€λ§Œ 곑선 값은 내보낼 수 μ—†μŠ΅λ‹ˆλ‹€. μ’‹μ•„. ν…ŒμŠ€νŠΈ ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

졜근의 μ–΄λ €μš΄ κ²½μ£Ό ( - μ€‘μš”ν•˜μ§€ μ•Šμ€ λ°μ΄ν„°λ‘œ ν‘œμ‹œ)λ₯Ό μ‚΄νŽ΄ λ³΄κ² μŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λŠ” κ·Έλž˜ν”„μ—μ„œ κ°€μ Έμ™€μ•Όν•˜κ³  TrainingPeaks에 μ˜ν•΄ κ°€μž₯ κ°€κΉŒμš΄ μ •μˆ˜λ‘œ λ°˜μ˜¬λ¦Όλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

| | κ²½κΈ° μ „ | 레이슀 데이 | κ²½κΈ° ν›„ |
|-|-|-|-|
| TSS | -| 395 | -|
| ν”Όλ‘œ | 54 | 102 | -|
| ν”ΌνŠΈλ‹ˆμŠ€ | 61 | 69 | -|
| 양식 | -| 8 | -33 |

κ·Έλž˜μ„œ:

  1. ν”Όλ‘œ (일)-ν”ΌνŠΈλ‹ˆμŠ€ (일) = 69-102 = 33 = 양식 (일 +1)μ΄λ―€λ‘œ 양식에 λŒ€ν•œ μ˜¬λ°”λ₯Έ 곡식이 μžˆμŠ΅λ‹ˆλ‹€.
  2. Fatigue (day-1) + (TSS-Fatigue (day-1)) x ... = 54 + (395-54) x (1-e ** (-1/7)) = 99, μ•½ 102?
  3. (ν”Όλ‘œ (일 -1) + TSS (1-k)) / (2-k) = (54 + 395 (1-k)) / (2-k) = 94, κ·ΈλŸ¬λ‹ˆ λ²—μ–΄λ‚©λ‹ˆλ‹€. (k = exp (-1/7)). 이전 μ£Όμ„μ˜ 계산 이 잘λͺ»λ˜μ—ˆμœΌλ―€λ‘œ μ—¬κΈ°μ—μ„œ μˆ˜μ‹ 계산을 μˆ˜μ •ν–ˆμŠ΅λ‹ˆλ‹€.
  4. Fitness (day-1) + (TSS-Fitness (day-1) x ... = 61 + (395-61) x (1-e ** (-1/42) = 69, λ§žμŠ΅λ‹ˆλ‹€.
  5. (Fitness (day-1) + TSS (1-K)) / (2-K) = (61 + 395 (1-K)) / (2-K) = 69, κ·Έλž˜μ„œ 거의 λ§žμŠ΅λ‹ˆλ‹€ (μ—¬κΈ°, K = exp (-1/42)).

μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό 같은 것이 μ΅œμ„ μ˜ μ„ νƒμž…λ‹ˆλ‹€.

Form(day) = Fitness(day-1) - Fatigue(day-1)
Fitness(day) = Fitness(day-1) + (StressScore(day)-Fitness(day-1)) x (1-exp(-1/42))
Fatigue(day) = Fatigue(day-1) + (StressScore(day)-Fatigue(day-1)) x (1-exp(-1/7))

μΆ”μ‹  : 2μ—μ„œ μ™œ μš°λ¦¬λŠ” 102κ°€ μ•„λ‹ˆλΌ 99λ₯Ό μ–»μŠ΅λ‹ˆλ‹€.

GoldenCheetah μ‚΄νŽ΄λ³΄κΈ° :

double lte = (double)exp(-1.0/ltsDays_);
double ste = (double)exp(-1.0/stsDays_);
 ...
// LTS
if (day) lastLTS = lts_[day-1];
lts_[day] = (stress_[day] * (1.0 - lte)) + (lastLTS * lte);

// STS
if (day) lastSTS = sts_[day-1];
sts_[day] = (stress_[day] * (1.0 - ste)) + (lastSTS * ste);

이것도 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ μ €λŠ” μš°λ¦¬κ°€ μ’‹λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

@aprokop 이 심측 뢄석에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€! λͺ…ν™•ν•˜κ³  λͺ¨ν˜Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰