لقد شعرت بالحيرة من منشور ادعى: من الممكن قياس FTP الخاص بك في دقيقة واحدة في راكب الدراجة النارية. وكشفت Googling أن Baronbiosys.com طورت تطبيق Xert-App يزعم هذا:
تستخدم الطريقة تقنيات متطورة والتعرف على الأنماط لتحديد FTP. بينما في الماضي ، كنت بحاجة إلى الاختبار باستخدام بروتوكول FTP لمدة 20 دقيقة على سبيل المثال ، أو فحص البيانات التي تبلغ قيمتها عدة أشهر للحصول على قيمة FTP واقعية ، تمكنك هذه الطريقة من تحديد FTP في ذلك اليوم أو حتى في تلك اللحظة. CF Baronbiosys
بعد تثبيت تطبيق Xert على Garmin (830) ، واجهت ، حتى تم إنفاق وقت التجربة المجاني ، أنه يقوم بتقديرات FTP بشكل جيد. استعرضها Dcrainmaker وهي إيجابية تمامًا بشأن أدائها ودقتها واختتمت:
في حين أن هذه هي حقيقة أنني أتلقى ملاحظات FTP في الوقت الفعلي فهي فريدة من نوعها. يمكنني الخروج لركوب والبدء في رؤية هذه القيم صياغة أثناء بذل جهود شاقة. لا ساعات انتظار ، أو حتى بعد دقائق. لست على دراية بأي منصة أو تطبيق آخر يقوم بذلك. CF Dcrainmaker
قررت تطوير رمز C ++ لتطبيق التدريب الداخلي الذي يعمل على لوحة Arduino NRF52840 Express والتي تقترب قدر الإمكان من وظائف تطبيق Xert (ل Carmin Connect). أصبح جزءًا لا يتجزأ من مشروع أكبر: تدفق الهواء. فيما يلي تفسير للعلم والرياضيات وراء أساسياته.
كان من الواضح بالنسبة لي أن تطبيق Xert يعتمد على استنفاد ما يسمى بسعة العمل اللاهوائية ( AWC ) أو سعة الاحتياطي الوظيفي ( FRC ). للحفاظ على الأمر بسيطًا ، افترض أن راكب الدراجة لديه قدر معين من هذا قدرة العمل المحدودة (محمية للطاقة) مخزنة داخليًا في بداية الركوب. هذه الكمية من الطاقة معروفة من حيث المصطلحات الرياضية باسم W ' (نطق W prime ) ، وهي الطاقة وبالتالي تقاس في joules. أثناء ركوبك بكثافة منخفضة ، يظل W ' في مستواه الكامل نظرًا لعدم إنفاقه ، وأنت قادر على الاستمرار في الركوب بهذه الشدة لفترة طويلة. ولكن إذا دفعت بقوة أكبر ، فستبدأ في استخدام هذه الطاقة. يُعرف الحد الأقصى الذي ستبدأ فيه في إنفاق احتياطي الطاقة هذا باسم الطاقة الحرجة ( CP ). إذا قمت بالضغط على الدواسات أصعب من CP ، فسوف تنخفض W ' . بمجرد أن تصبح الطاقة المنتجة (WATTS) أقل من CP ، سوف "تجدد" ، وسيزداد احتياطي الطاقة مرة أخرى. عندما تركب لفترة طويلة بما يكفي من CP ، ستتعامل مع مستوى 100 ٪ مرة أخرى. ومع ذلك ، عندما تعمل بجد وطويلة بما يكفي فوق CP ، سيتم استنفاد W ' تمامًا وسيتم استنفادك في اللحظة (المعروف أيضًا باسم T T Lim )! يتم التعبير عن الاختلافات في W ' كتوازن "W " في خوارزمية الدكتور Skiba (2). معلمة أخرى من الخوارزمية هي tau التي تحدد السرعة التي يتم بها تجديد w ' عندما تكون الطاقة أقل من CP .
يتم تعريف CP على أنها أعلى كثافة تمرين يمكن الحفاظ عليها لفترات طويلة من الزمن ، عادةً لمدة 45 إلى 60 دقيقة. تعتبر قوة العتبة الوظيفية ( FTP ) أكثر شهرة في ركوب الدراجات الترفيهية وتم تعريفها على أنها أعلى متوسط إخراج طاقة يمكن الحفاظ عليها لمدة 60 دقيقة (1). بالنظر إلى التشابه الكبير في التعريف ، فإننا نفترض ركوب الدراجات غير النخبة عدم وجود فرق كبير بين قيم CP و FTP !
الخوارزميات التي كان لا بد من تنفيذها هي خوارزمية الدكتور سكيبا الأصلية (2) وتحسين (تقريب) لخوارزمية سكيبا المتكاملة بقلم ديف ووترورث (3). تم نشر Aart Goossens Code (في Python) والمعلومات التوضيحية عن Github (4) التي ساعدت كثيرًا على فهم وتنفيذ الخوارزميات المختلفة في إعداد Arduino. يتم إعادة صياغة المعلومات التالية من عمله الأصلي ، لإعطاء القارئ بعض البصيرة في الخلفية الرياضية للخوارزميات ، انظر عمله على: Aart goosens @ github
خوارزمية Skiba المتكاملة هي الخوارزمية الأكثر شهرة لحساب توازن W ' وتم التحقق من صحتها علمياً (5). معادلات الخوارزمية هي: 
عندما يكون W ' BAL (t) يساوي W' BAL في الوقت t ، W ' هو كمية الطاقة المتاحة فوق CP (القوة الحرجة) ، t الوقت الذي يتم فيه حساب W' BAL ، u تكرار الملخص ، w ' exp (u) كمية الطاقة فوق CP التي يتم استخدامها في الوقت u ( تم إنفاقها) ، e e euler و " w " يتم تحديد الأرقام 546 و -0.01 و 316 بشكل تجريبي في المقالة الأصلية لـ Skiba ولا تتغير بين الأفراد. D CP هو الفرق بين CP ومتوسط قوة الفواصل الزمنية التي كانت الطاقة أقل من CP . D CP يمكن حسابها ديناميكيًا (المتوسط حتى الوقت t ) أو يتم حسابها مرة واحدة للتمرين بأكمله واستخدامه كقيمة ثابتة. يوصي Skiba باستخدام قيمة ثابتة لـ D CP . P (t) هي القوة المنتجة في الوقت t .
ساعد عالم الرياضيات ديف ووترورث (3) المطور الأساسي لـ Golden Cheetah ، Mark Liversedge ، على تطوير تحسين خوارزمية Skiba (6). تقارب عملية إعادة الصياغة خوارزمية Skiba بحيث يمكن أن تختلف النتائج قليلاً في الحالات القصوى فقط ، خاصةً عندما تكون ( TAU ) صغيرة جدًا مقارنة بوقت العينة. يتم إعادة كتابة الجزء المتكامل لـ W ' BAL من معادلات Skiba بواسطة Waterworth إلى: 
حيث S (t) هو مبلغ قيد التشغيل في الوقت t بعد البداية ، تتوافق الرموز الأخرى مع المعادلات السابقة. يتم حساب Tau (ʈ W ' ) و W' exp (t) مع المعادلات الأصلية التي قدمتها Skiba. خوارزمية Skiba المتكاملة مكلفة للغاية ، حتى على أجهزة الكمبيوتر السريعة حيث يجب تكرار الجمع في كل مرة مرة أخرى. الميزة الكبيرة لتحسين Waterworth هي أنه يمكن حساب التوازن الآن في الوقت الفعلي: أثناء الركوب وليس فقط بعد ذلك! بالإضافة إلى ذلك ، يكون من المفيد للغاية عندما يريد المرء تحديد القوة الحرجة أثناء التنقل أثناء التدريبات HIIT أو التدريبات الشاقة عندما يصبح التوازن السلبي وتم استنفاده!

من الناحية الرياضية ، يتم وصف علاقة مدة الطاقة كدالة زائدية. تمثل النقاط الأربع المختلفة في المنحنى نقاطًا في الوقت ( T LIM ) عند الوصول إلى الحد الأقصى المقابل للطاقة المستدامة فوق CP ويحدث الإرهاق. عند النظر في التسامح في التمرين ، يُعرف بتعيب السلطة باسم CP (WATTS). يُعرف ثابت الانحناء باسم W ' (أي ، W prime ) ، ويتم قياسه بوحدات العمل المنجزة (joules). لاحظ أن المناطق الرمادية الأربعة ، التي تمثل W ' ، مختلفة في الشكل ولكنها متساوية في الحجم. يمكن تحويل علاقة مدة الطاقة الزائدية هذه إلى علاقة خطية إذا تم تخطيط العمل المنجز مع الزمن ، بحيث يساوي ميل الخط CP والاعتراض يساوي W ' . يجب التأكيد على أن علاقة مدة القوة تصف تحمل التمرين ولكنها لا تفسر ذلك. ومع ذلك ، فإن الاستجابات الفسيولوجية لممارسة التمارين التي يتم إجراؤها أدناه وفوق CP قد توفر رؤى مهمة في عملية التعب. تم تعريف CP في الأصل على أنه ناتج الطاقة الخارجي الذي يمكن أن يستمر "إلى أجل غير مسمى" أو لفترة طويلة جدًا دون التعب. ومع ذلك ، ينبغي اعتبار هذا التعريف نظريًا ، حيث لا يمكن إجراء أي تمرين إلى أجل غير مسمى. من المفهوم الآن أن CP يفصل مخرجات الطاقة التي يكون تحمل التمرين محدودًا بشكل متوقع (قوة التمرين> CP ). يتم تعريف الوقت الفعلي للتسامح ( T LIM ) للتمرين الذي تم إجراؤه أعلاه CP ، وبالتالي يتم التنبؤ به عن كثب ، بالمعادلة:
t lim = w ′/(p-cp)
تبرز هذه المعادلة أن وقت التعصب فوق CP هو وظيفة قرب ناتج الطاقة ( P ) التي يتم الحفاظ عليها إلى CP وحجم W ' . عندما يكون P أعلى إلى حد كبير CP ، سيتم استخدام المبلغ الثابت من العمل الذي تمثله المعلمة W ' بسرعة وسيكون T Lim قصيرًا. إذا كان P أقرب إلى CP ، فسيتم استخدام "W ' " بشكل أكثر ببطء وستكون T Lim أطول. الاعتبار الحاسم هنا هو أن W ' يفترض أن يكون ثابتًا لجميع P فوق CP . لذلك ، يعني هذا النموذج " المعلمة " أو طاقة مدة الطاقة أن أداء التمرين المطلق يعتمد ببساطة على قيمة CP (في Watts) وقيمة W ' (في joules). يمكن أن تختلف كل من المعلمات CP و W ' اختلافًا كبيرًا بين الأفراد كدالة للصحة/المرض والعمر واللياقة والتدريب.
// ------------ W' Balance calculation -------------------
// Global variables related to Cycling Power and W-Prime
uint16_t TAWC_Mode = 1 ; // Track Anaerobic Capacity Depletion Mode == TRUE -> APPLY and SHOW
uint16_t CP60 = 160 ; // Your (estimate of) Critical Power, more or less the same as FTP
uint16_t eCP = CP60; // Algorithmic estimate of Critical Power during intense workout
uint16_t w_prime_usr = 7500 ; // Your (estimate of) W-prime or a base value
uint16_t ew_prime_mod = w_prime_usr; // First order estimate of W-prime modified during intense workout
uint16_t ew_prime_test = w_prime_usr; // 20-min-test algorithmic estimate (20 minute @ 5% above eCP) of W-prime for a given eCP!
long int w_prime_balance = 0 ; // Can be negative !!!
bool IsShowWprimeValuesDominant = false ; // Boolean that determines to show W Prime data on Oled or not
// ------------------------------------------------------- // ------------------------ W'Balance Functions -----------------------------------
uint16_t CalculateAveragePowerBelowCP ( uint16_t iPower, uint16_t iCP);
void CalculateAveragePowerAboveCP ( uint16_t iPower, uint16_t &iavPwr, unsigned long &iCpACp);
double tau_w_prime_balance ( uint16_t iPower, uint16_t iCP);
void w_prime_balance_waterworth ( uint16_t iPower, uint16_t iCP, uint16_t iw_prime);
void ConstrainW_PrimeValue ( uint16_t &iCP, uint16_t &iw_prime);
uint16_t GetCPfromTwoParameterAlgorithm ( uint16_t iav_Power, unsigned long iT_lim, uint16_t iw_prime);
uint16_t GetWPrimefromTwoParameterAlgorithm ( uint16_t iav_Power, double iT_lim, uint16_t iCP);
// ------------------------ W'Balance Functions ------------------------------------ uint16_t CalculateAveragePowerBelowCP ( uint16_t iPower, uint16_t iCP){
// calculate avg_power_below_cp real time using a running sum and counter
static unsigned long int CountPowerBelowCP = 0 ;
static unsigned long int SumPowerBelowCP = 0 ;
if (iPower < iCP) {
SumPowerBelowCP += ( unsigned long int )iPower;
CountPowerBelowCP++;
}
return uint16_t (SumPowerBelowCP/CountPowerBelowCP); // average power below CP
} // end calculate avg_power_below_cp
void CalculateAveragePowerAboveCP ( uint16_t iPower, uint16_t &iavPwr, unsigned long int &iCpACp){
// calculate avg_power_above_cp real time using a running sum and counter
// returning the values by C++ reference!
static unsigned long int SumPowerAboveCP = 0 ;
SumPowerAboveCP += ( unsigned long int )iPower;
iCpACp++;
iavPwr = uint16_t (SumPowerAboveCP/iCpACp); // average power above CP
} // end calculate avg_power_above_cp
double tau_w_prime_balance ( uint16_t iPower, uint16_t iCP){
uint16_t avg_power_below_cp = CalculateAveragePowerBelowCP (iPower, iCP);
double delta_cp = double (iCP - avg_power_below_cp);
return ( double ( 546.00 ) * exp (- 0.01 * delta_cp) + double ( 316.00 ));
} // end Tau W Prime Balance
void w_prime_balance_waterworth ( uint16_t iPower, uint16_t iCP, uint16_t iw_prime) {
// Most power meters measure power, torque a.o. in a high frequency (20-60 Hz) but
// transmit (BLE) datasets to a monitoring device in much lower frequency: 1-4 times per second.
int power_above_cp = 0 ; // Power > CP
static double T_lim = 0 ; // Time (duration) while Power is above CP, the summed value of every sample time value P > CP
double w_prime_expended = 0.0 ; // Expended energy in Joules
double ExpTerm1 = 0.0 , ExpTerm2 = 0.0 ;
static double TimeSpent = 0.0 ; // Total Time spent in the workout, the summed value of every sample time value
static double running_sum = 0.0 ;
static unsigned long int CountPowerAboveCP = 0 ; // Count the Power readings above CP
static uint16_t avPower = 0 ; // Average power above CP
const long int NextLevelStep = 1000 ; // Stepsize of the next level of w-prime modification --> 1000 Joules step
static long int NextUpdateLevel = 0 ; // The next level at which to update eCP, e_w_prime_mod and ew_prime_test
// Quarq Dfour Zero Spider power meter sends between 2 and 1.2 power readings per second, dependent of POWER level !!!
// We assume that the sample frequency (number of samples per second) is VARIABLE !!!
// Determine the individual sample time in seconds, it may/will vary during the workout !!!
static unsigned long PrevReadingTime = 0 ;
double SampleTime = double ( millis ()-PrevReadingTime)/ 1000 ; // Time or duration since the previous sample, convert from millis to seconds
PrevReadingTime = millis (); // Update for the next sample
double tau = tau_w_prime_balance (iPower, iCP); // Determine the value for tau
TimeSpent += SampleTime ; // The summed value of all sample time values during the workout
power_above_cp = (iPower - iCP);
# ifdef DEBUGAIR
Serial. printf ( " Time:%6.1f ST: %4.2f tau: %f " , TimeSpent, SampleTime , tau);
# endif
// w_prime is energy and measured in Joules = Watt*second
// Determine the expended energy above CP since the previous measurement (--> i.e. during sample time)
w_prime_expended = double ( max ( 0 , power_above_cp))*SampleTime; // Determine (Watts_above_CP) * (its duration in seconds) = expended energy in Joules!
// Calculate some terms of the equation
ExpTerm1 = exp (TimeSpent/tau); // Exponential term1
ExpTerm2 = exp (-TimeSpent/tau); // Exponential term2
# ifdef DEBUGAIR
Serial. printf ( " W prime expended: %3.0f exp-term1: %f exp-term2: %f " , w_prime_expended , ExpTerm1, ExpTerm2);
# endif
running_sum = running_sum + (w_prime_expended*ExpTerm1); // Determine the running sum
# ifdef DEBUGAIR
Serial. printf ( " Running Sum: %f " , running_sum);
# endif
w_prime_balance = ( long int )( ( double )iw_prime - (running_sum*ExpTerm2) ) ; // Determine w prime balance and cast from double to int
# ifdef DEBUGAIR
Serial. printf ( " w_prime_balance: %d " , w_prime_balance);
# endif
// --------------- extra --------------------------------------------------------------------------------------
// Workout starts at a certain W'= ##,### Joules and CP = ### watts, set by the user; the algorithm increases CP and W' stepwise
// to more realistic values every time when W'balance is depleted to a certain level; -> 2-Parameter Algorithm updates CP and W'
if (power_above_cp > 0 ) {
CalculateAveragePowerAboveCP (iPower, avPower, CountPowerAboveCP); // Average power above CP is to be calculated for future use
T_lim += SampleTime ; // Time to exhaustion: the accurate sum of every second spent above CP, calculated for future use
}
# ifdef DEBUGAIR
Serial. printf ( " [%d] n " , CountPowerAboveCP);
# endif
// When working above CP, the moment comes that we need to update eCP and ew_prime !!
if ( (w_prime_balance < NextUpdateLevel) && (w_prime_expended > 0 ) ) { // W' balance is further depleted --> test for an update moment
NextUpdateLevel -= NextLevelStep; // Move down another level of depletion, update eCP, ew_prime_mod and ew_prime_test
eCP = GetCPfromTwoParameterAlgorithm (avPower, T_lim, iw_prime); // Estimate a new eCP value
ew_prime_mod = w_prime_usr - NextUpdateLevel; // Adjust ew_prime_modified to the next level of depletion to be checked
ew_prime_test = GetWPrimefromTwoParameterAlgorithm ( uint16_t (eCP* 1.045 ), double ( 1200 ), eCP); // 20-Min-test estimate for W-Prime
# ifdef DEBUGAIR
Serial. printf ( " Update of eCP - ew_prime %5d - avPower: %3d - T-lim:%6.1f --> eCP: %3d " , ew_prime_mod, avPower, T_lim, eCP);
Serial. printf ( " --> Test estimate of W-Prime: %d n " , ew_prime_test );
# endif
}
// -----------------extra -------------------------------------------------------------------------------
} // end
// Check and Set starting value of w_prime to realistic numbers!!
void ConstrainW_PrimeValue ( uint16_t &iCP, uint16_t &iw_prime) {
if (iCP < 100 ) { iCP = 100 ; } // Update to lowest level that we allow for
// First determine the "minimal" value for W_Prime according to a 20-min-test estimate, given the iCP value!
uint16_t w_prime_estimate = GetWPrimefromTwoParameterAlgorithm ( uint16_t (iCP* 1.045 ), double ( 1200 ), iCP);
if (iw_prime < w_prime_estimate) { iw_prime = w_prime_estimate; } // Update iw_prime to a realistic level
return ;
} // end
uint16_t GetCPfromTwoParameterAlgorithm ( uint16_t iav_Power, double iT_lim, uint16_t iw_prime) {
uint16_t WprimeDivTlim = uint16_t ( double (iw_prime)/iT_lim ); // type cast for correct calculations
if (iav_Power > WprimeDivTlim){ // test for out of scope
return (iav_Power - WprimeDivTlim); // Solve 2-parameter algorithm to estimate CP
} else {
return eCP; // Something went wrong do'nt allow an update of CP
}
} // end
uint16_t GetWPrimefromTwoParameterAlgorithm ( uint16_t iav_Power, double iT_lim, uint16_t iCP) {
if (iav_Power > iCP){ // test for out of scope
return (iav_Power-iCP)*(( uint16_t )iT_lim); // Solve 2-parameter algorithm to estimate new W-Prime
} else {
return w_prime_usr; // Something went wrong don't allow an update of w_prime
}
} // end
تم دمج الكود في مشروع أكبر يسمى Airflow . يعد إعداد أو تغيير CP القاعدي و W Prime جزءًا لا يتجزأ من تطبيق Airflow Companion! يقوم جهاز تدفق الهواء الذكي بإيقاف سرعة تدفق الهواء المطلوبة لمراوح (مروحة) التبريد للحصول على توازن حراري مستقر خلال جميع مراحل تمرين ركوب الدراجات الداخلي ، والاحماء ، وفترات الشدة ، والشفاء المتقطع ، وعلى التباطؤ. ليس للدراج أي تدخل في الطريق ويمكنه التركيز بشكل كامل على متطلبات تمرين مدرب المحطة ، ويواجه دائمًا الجوية المثالية التي ستبرده بشكل مناسب. بالإضافة إلى ذلك ، يحصل راكبي الدراجات على رؤية (كمكافأة) في تطوير قوته الحرجة عندما تكون شدة التدريب مكثفة وطويلة بما فيه الكفاية! تعد وحدة المعالجة المركزية Arduino NRF52480 Express قوية للغاية بحيث يمكن تحقيق حساب في الوقت الفعلي لـ CP و W Prime إلى جانب جميع الحسابات لتحديد مصطلحات توازن الحرارة ووضع المعجبين على قدرة النفخ المناسبة.
يقوم الدراج (الخصائص: CP = 140 واط و W Prime = 7.2 kJ ) بعمل تمرين مكثف مع المدة والشدة كما هو موضح في الشكل. يتم استنفاد W Prime عدة مرات خلال كتلة الفاصل الأول. سيتم تقدير القيم الجديدة لـ CP و W Prime بواسطة الخوارزمية أثناء وقت التمرين فقط عند الاقتضاء. قم بتشغيل الفيديو لمشاهدة استنفاد 100 ٪ من W prime والقيم المقدرة كما تم حسابها في الوقت الفعلي وعرضها على شاشة OLED ... لاحظ كيف يتقلص الشريط الأفقي عندما تكون الطاقة أعلى من CP في 175 و 195 واط. يتناسب الشريط مع توازن W ، وبالإضافة إلى ذلك ، يظهر "ترك في الخزان" كنسبة مئوية! يتم عرض القراءات في تسلسل متسرع ولا تتوافق مع المدة الزمنية للتمرين! 