Các công thức Công suất Đạp xe

Nền tảng toán học của các chỉ số trong Bike Analytics

Hướng dẫn triển khai

Trang này cung cấp các công thức có thể sao chép và các phương pháp tính toán từng bước cho tất cả các chỉ số của Bike Analytics. Hãy sử dụng chúng cho các lần triển khai tùy chỉnh, xác minh hoặc để hiểu sâu hơn về việc tập luyện dựa trên công suất.

⚠️ Lưu ý khi triển khai

  • Tất cả các giá trị công suất tính bằng watt (W), thời gian tính bằng giây trừ khi có quy định khác
  • FTP và CP là các ngưỡng đặc thù của từng cá nhân—không có giá trị chung cho tất cả
  • Luôn xác thực dữ liệu đầu vào trong phạm vi hợp lý (thường là 0-2000W)
  • Xử lý các trường hợp ngoại lệ (chia cho không, công suất âm)
  • Dữ liệu công suất yêu cầu khoảng thời gian ghi 1 giây để đảm bảo độ chính xác

Đạp xe Các chỉ số Hiệu suất Cốt lõi

1. Điểm Căng thẳng Tập luyện (TSS)

Công thức:

TSS = (thời_gian_giây × NP × IF) / (FTP × 3600) × 100
trong đó IF = NP / FTP

Ví dụ cụ thể:

Kịch bản: Chuyến đạp 2 giờ, NP = 235W, FTP = 250W

  1. Tính IF: IF = 235 / 250 = 0,94
  2. Thời gian tính bằng giây: 2 giờ × 3600 = 7200 giây
  3. TSS = (7200 × 235 × 0,94) / (250 × 3600) × 100
  4. TSS = 1.590.720 / 900.000 × 100 = 176,7 TSS

Giải mã: Buổi tập nặng (>150 TSS), dự kiến cần 2-3 ngày phục hồi

Triển khai JavaScript:

function calculateTSS(durationSeconds, normalizedPower, ftp) {
  const intensityFactor = normalizedPower / ftp;
  const tss = (durationSeconds * normalizedPower * intensityFactor) / (ftp * 3600) * 100;
  return Math.round(tss);
}

// Ví dụ sử dụng:
const tss = calculateTSS(7200, 235, 250);
// Trả về: 177

2. Công suất Chuẩn hóa (NP)

Thuật toán (Trung bình trượt 30 giây):

1. Tính trung bình trượt công suất 30 giây cho toàn bộ chuyến đạp
2. Lũy thừa 4 từng giá trị trung bình 30 giây đó
3. Tính trung bình cộng của tất cả các giá trị lũy thừa 4 này
4. Khai căn bậc 4 của giá trị trung bình đó
NP = ⁴√(trung bình của [30s_avg^4])

Tại sao lại dùng Lũy thừa 4?

Mối quan hệ bậc bốn (lũy thừa 4) phản ánh sự tiêu tốn sinh lý không tuyến tính của các nỗ lực biến thiên. Một chuyến đạp có các đợt bứt tốc và hồi phục sẽ tiêu tốn nhiều năng lượng hơn so với việc đạp ở mức công suất ổn định với cùng mức trung bình.

Ví dụ:

  • Đạp ổn định: 200W trong 1 giờ → NP = 200W, Trung bình = 200W
  • Đạp biến thiên: Luân phiên 300W/100W → Trung bình = 200W, NP = 225W

Cùng mức công suất trung bình, nhưng chuyến đạp biến thiên có NP cao hơn 12% do tiêu tốn sinh lý từ các đợt bứt tốc

Triển khai JavaScript:

function calculateNormalizedPower(powerData) {
  // powerData là mảng các giá trị công suất từng giây
  
  // Bước 1: Tính trung bình trượt 30 giây
  const rollingAvgs = [];
  for (let i = 29; i < powerData.length; i++) {
    const window = powerData.slice(i - 29, i + 1);
    const avg = window.reduce((sum, p) => sum + p, 0) / 30;
    rollingAvgs.push(avg);
  }

  // Bước 2: Lũy thừa 4
  const powered = rollingAvgs.map(p => Math.pow(p, 4));

  // Bước 3: Trung bình của các lũy thừa 4
  const avgPowered = powered.reduce((sum, p) => sum + p, 0) / powered.length;

  // Bước 4: Khai căn bậc 4
  const np = Math.pow(avgPowered, 0.25);

  return Math.round(np);
}

// Ví dụ sử dụng:
const powerData = [/* mảng công suất từng giây */];
const np = calculateNormalizedPower(powerData);
// Trả về: NP tính bằng watts

3. Hệ số Cường độ (IF)

Công thức:

IF = NP / FTP

Các phạm vi giải mã:

Phạm vi IFMức độ nỗ lựcVí dụ buổi tập
< 0,75Phục hồi / Nhẹ nhàngĐạp phục hồi chủ động, Vùng 1-2
0,75 - 0,85Sức bềnĐạp ổn định thời gian dài, nền tảng hiếu khí
0,85 - 0,95TempoTập luyện Sweet spot, các quãng tập tempo
0,95 - 1,05Ngưỡng (Threshold)Các quãng tập FTP, nỗ lực đua tính giờ
1,05 - 1,15VO₂maxCác quãng tập 5 phút, đua criterium
> 1,15Kỵ khí (Anaerobic)Nước rút ngắn, tấn công, bứt tốc MTB

Ví dụ tính toán:

Kịch bản: NP = 235W, FTP = 250W

IF = 235 / 250 = 0,94

Giải mã: Nỗ lực tempo cao / cận ngưỡng, có thể duy trì trong 2-3 giờ

function calculateIF(normalizedPower, ftp) {
  return (normalizedPower / ftp).toFixed(2);
}

// Ví dụ:
const if_value = calculateIF(235, 250);
// Trả về: 0.94

4. Chỉ số Biến thiên (VI)

Công thức:

VI = NP / Công suất Trung bình

Giải mã theo bộ môn:

Bộ mônVI điển hìnhÝ nghĩa
Đua TT đường trường / Nỗ lực ổn định1,00 - 1,05Công suất rất nhất quán, phân phối lực tối ưu
Đua đường trường (Road)1,05 - 1,10Có một số đợt bứt tốc, nhìn chung là ổn định
Đua Criterium1,10 - 1,20Tăng tốc và tấn công thường xuyên
Mountain Bike XC1,15 - 1,30+Biến thiên rất cao, bứt tốc liên tục

Ví dụ tính toán:

Đua đường trường: NP = 240W, Công suất TB = 230W

VI = 240 / 230 = 1,04 (phân phối lực ổn định)

Đua MTB: NP = 285W, Công suất TB = 235W

VI = 285 / 235 = 1,21 (biến thiên rất lớn, nỗ lực bùng nổ)

function calculateVI(normalizedPower, averagePower) {
  return (normalizedPower / averagePower).toFixed(2);
}

// Ví dụ:
const vi_road = calculateVI(240, 230);  // Trả về: 1.04
const vi_mtb = calculateVI(285, 235);   // Trả về: 1.21

Công suất Tới hạn & W' (Khả năng kỵ khí)

5. Công suất Tới hạn (CP) - Mô hình Tuyến tính

Công thức:

Thời gian = W' / (Công suất - CP)
Sắp xếp lại: Công suất × Thời gian = CP × Thời gian + W'

Tính toán từ nhiều nỗ lực:

Yêu cầu 2-4 nỗ lực tối đa ở các khoảng thời gian khác nhau (ví dụ: 3, 5, 12, 20 phút)

Dữ liệu ví dụ:

Thời gianCông suất (W)Tổng công thực hiện (kJ)
3 phút (180s)400W72 kJ
5 phút (300s)365W109,5 kJ
12 phút (720s)310W223,2 kJ
20 phút (1200s)285W342 kJ

Sử dụng hồi quy tuyến tính (Tổng công = CP × Thời gian + W'):

  • CP = 270W (độ dốc của đường hồi quy)
  • W' = 18,5 kJ (giao điểm trục tung)

Triển khai JavaScript:

function calculateCP_Linear(efforts) {
  // efforts = [{duration: seconds, power: watts}, ...]

  const times = efforts.map(e => e.duration);
  const work = efforts.map(e => e.power * e.duration / 1000); // kJ

  // Hồi quy tuyến tính: work = CP * time + W'
  const n = efforts.length;
  const sumT = times.reduce((a, b) => a + b, 0);
  const sumW = work.reduce((a, b) => a + b, 0);
  const sumTW = times.reduce((sum, t, i) => sum + t * work[i], 0);
  const sumTT = times.reduce((sum, t) => sum + t * t, 0);

  const CP = (n * sumTW - sumT * sumW) / (n * sumTT - sumT * sumT);
  const Wprime = (sumW - CP * sumT) / n;

  return {
    CP: Math.round(CP * 10) / 10,      // watts
    Wprime: Math.round(Wprime * 10) / 10  // kJ
  };
}

// Ví dụ sử dụng:
const efforts = [
  {duration: 180, power: 400},
  {duration: 300, power: 365},
  {duration: 720, power: 310},
  {duration: 1200, power: 285}
];

const result = calculateCP_Linear(efforts);
// Trả về: { CP: 270.0, Wprime: 18.5 }

6. Cân bằng W' (W'bal) - Mô hình Phương trình Vi phân

Công thức:

Tiêu tốn (khi P > CP):
W'exp(t) = ∫(P(t) - CP) dt
Hồi phục (khi P < CP):
W'rec(t) = W' × (1 - e^(-t/τ))
trong đó τ = 546 × e^(-0,01 × ΔCP) + 316
và ΔCP = (CP - P(t))

Ví dụ thực tế:

Thông số người đạp: CP = 270W, W' = 18,5 kJ

Kịch bản 1 - Tấn công mạnh:

  • Người đạp bứt tốc lên 400W trong 30 giây
  • W' tiêu tốn: (400 - 270) × 30 = 3.900 J = 3,9 kJ
  • W'bal còn lại: 18,5 - 3,9 = 14,6 kJ

Kịch bản 2 - Hồi phục:

  • Sau khi tấn công, hạ xuống 200W (thấp hơn CP 70W) trong 2 phút
  • ΔCP = 270 - 200 = 70W
  • τ = 546 × e^(-0,01 × 70) + 316 = 588 giây
  • Hồi phục trong 120s: 18,5 × (1 - e^(-120/588)) = 3,5 kJ được hồi phục
  • W'bal mới: 14,6 + 3,5 = 18,1 kJ

Triển khai JavaScript:

function calculateWbalance(powerData, CP, Wprime) {
  // powerData = mảng các {time: seconds, power: watts}
  let wbal = Wprime * 1000; // Đổi sang joules
  const wbalHistory = [];

  for (let i = 1; i < powerData.length; i++) {
    const dt = powerData[i].time - powerData[i-1].time;
    const power = powerData[i].power;

    if (power > CP) {
      // Tiêu tốn trên mức CP
      const expenditure = (power - CP) * dt;
      wbal -= expenditure;
    } else {
      // Hồi phục dưới mức CP
      const deltaCP = CP - power;
      const tau = 546 * Math.exp(-0.01 * deltaCP) + 316;
      const recovery = (Wprime * 1000 - wbal) * (1 - Math.exp(-dt / tau));
      wbal += recovery;
    }

    // Đảm bảo W'bal không vượt quá mức tối đa hoặc âm
    wbal = Math.max(0, Math.min(wbal, Wprime * 1000));

    wbalHistory.push({
      time: powerData[i].time,
      wbal: wbal / 1000, // kJ
      percent: (wbal / (Wprime * 1000)) * 100
    });
  }

  return wbalHistory;
}

// Ví dụ sử dụng:
const powerData = [
  {time: 0, power: 200},
  {time: 1, power: 210},
  // ... dữ liệu còn lại
];

const wbalHistory = calculateWbalance(powerData, 270, 18.5);
// Trả về mảng các giá trị W'bal theo thời gian

Biểu đồ Quản lý Hiệu suất (PMC) cho xe đạp

7. Tính toán CTL, ATL, TSB

Công thức (Trung bình trượt lũy thừa):

CTL_hôm_nay = CTL_hôm_qua + (TSS_hôm_nay - CTL_hôm_qua) / 42
ATL_hôm_nay = ATL_hôm_qua + (TSS_hôm_nay - ATL_hôm_qua) / 7
TSB_hôm_nay = CTL_hôm_qua - ATL_hôm_qua

Định nghĩa các chỉ số:

  • CTL (Chronic Training Load): Trung bình trượt lũy thừa 42 ngày - đại diện cho Thể lực (Fitness)
  • ATL (Acute Training Load): Trung bình trượt lũy thừa 7 ngày - đại diện cho Sự mệt mỏi (Fatigue)
  • TSB (Training Stress Balance): Phong độ (Form) = Thể lực - Sự mệt mỏi

Ví dụ cụ thể (Khối tập luyện 7 ngày):

NgàyTSSCTLATLTSBTrạng thái
Thứ 210075,080,0-5,0Tập luyện
Thứ 35074,475,7-1,3Phục hồi
Thứ 412075,582,0-6,5Tập nặng
Thứ 5073,770,3+3,4Ngày nghỉ
Thứ 68073,871,7+2,1Vừa phải
Thứ 715075,682,9-7,3Đạp dài
Chủ Nhật4074,876,8-2,0Phục hồi

Giải mã TSB:

Phạm vi TSBTrạng tháiHành động
< -30Rủi ro caoCảnh báo tập quá sức - giảm khối lượng
-30 đến -10Tập luyện tích cựcĐang xây dựng thể lực, theo dõi phục hồi
-10 đến +5Tối ưuVùng tập luyện bình thường
+5 đến +15Sẵn sàng thi đấuPhong độ đỉnh cao - thi đấu vào cuối tuần này
> +25Sụt giảm thể lựcMất thể lực - nên tăng khối lượng tập

Triển khai JavaScript:

function calculatePMC(workouts) {
  // workouts = [{date: "YYYY-MM-DD", tss: number}, ...]
  let ctl = 0, atl = 0;
  const results = [];

  workouts.forEach(workout => {
    // Cập nhật CTL (hằng số thời gian 42 ngày)
    ctl = ctl + (workout.tss - ctl) / 42;

    // Cập nhật ATL (hằng số thời gian 7 ngày)
    atl = atl + (workout.tss - atl) / 7;

    // Tính TSB (CTL hôm qua - ATL hôm nay cho cách tính truyền thống)
    // Để đơn giản ở đây dùng các giá trị hiện tại
    const tsb = ctl - atl;

    results.push({
      date: workout.date,
      tss: workout.tss,
      ctl: Math.round(ctl * 10) / 10,
      atl: Math.round(atl * 10) / 10,
      tsb: Math.round(tsb * 10) / 10,
      status: getTSBStatus(tsb)
    });
  });

  return results;
}

function getTSBStatus(tsb) {
  if (tsb < -30) return "High Risk";
  if (tsb < -10) return "Training Hard";
  if (tsb < 5) return "Optimal";
  if (tsb < 15) return "Race Ready";
  return "Detraining";
}

// Ví dụ:
const workouts = [
  {date: "2025-01-01", tss: 100},
  {date: "2025-01-02", tss: 50},
  {date: "2025-01-03", tss: 120},
  // ... thêm các buổi tập
];

const pmc = calculatePMC(workouts);
// Trả về mảng với các thông số CTL, ATL, TSB cho mỗi ngày

Công suất trên Trọng lượng & Các chỉ số Leo núi

8. Tỷ lệ Công suất trên Trọng lượng

Công thức:

W/kg = Công suất (watts) / Trọng lượng cơ thể (kg)

Các mức chuẩn FTP W/kg:

Cấp độNam (W/kg)Nữ (W/kg)Phân loại
Giải trí2,5 - 3,52,0 - 3,0Đạp xe thể dục
Có tính cạnh tranh3,5 - 4,53,0 - 4,0Hệ phong trào, Cat 3-4
Nâng cao4,5 - 5,54,0 - 5,0Hệ phong trào mạnh, Cat 1-2
Nghiệp dư ưu tú5,5 - 6,05,0 - 5,5Cấp đội tuyển quốc gia
Chuyên nghiệp6,0 - 7,0+5,5 - 6,5+World Tour, Grand Tour GC

Ví dụ tính toán:

Kịch bản: Người đạp có FTP = 275W, nặng 70kg

W/kg = 275 / 70 = 3,93 W/kg

Giải mã: Cấp độ thi đấu tốt, có khả năng đua ở các chặng đồi núi

function calculateWattsPerKg(power, bodyMassKg) {
  return (power / bodyMassKg).toFixed(2);
}

// Ví dụ:
const wpkg = calculateWattsPerKg(275, 70);
// Trả về: 3.93

9. VAM (Velocità Ascensionale Media)

Công thức:

VAM (m/h) = Độ cao leo được (m) / Thời gian (giờ)

Các mức chuẩn VAM:

VAM (m/h)Cấp độVí dụ
600 - 900Giải tríNgười đạp CLB trên các con dốc địa phương
900 - 1200Có tính cạnh tranhNgười nghiệp dư khá trên Alpe d'Huez
1200 - 1500Nghiệp dư ưu túNgười chuyên leo núi cấp quốc gia
1500 - 1800Chuyên nghiệpVĐV hỗ trợ (domestique) World Tour
> 1800Vô địch Grand TourPogačar, Vingegaard ở các con dốc quan trọng

Ví dụ tính toán:

Kịch bản: Leo con dốc Alpe d'Huez

  • Độ cao leo được: 1100 mét
  • Thời gian: 55 phút = 0,917 giờ
  • VAM = 1100 / 0,917 = 1200 m/h

Giải mã: Hiệu suất leo núi mức độ thi đấu tốt

function calculateVAM(elevationGainMeters, timeMinutes) {
  const hours = timeMinutes / 60;
  return Math.round(elevationGainMeters / hours);
}

// Ví dụ:
const vam = calculateVAM(1100, 55);
// Trả về: 1200 m/h

10. Ước tính W/kg từ VAM

Công thức:

W/kg ≈ VAM (m/h) / 100 / (Độ dốc% + 3)

Ví dụ tính toán:

Kịch bản: Leo dốc với độ dốc TB 8%, VAM = 1200 m/h

W/kg = 1200 / 100 / (8 + 3)

W/kg = 12 / 11 = 4,36 W/kg

Đối chiếu: Với người đạp nặng 70kg → công suất duy trì ~305W khi leo dốc

function estimateWkgFromVAM(vam, gradientPercent) {
  return (vam / 100 / (gradientPercent + 3)).toFixed(2);
}

// Ví dụ:
const wkg = estimateWkgFromVAM(1200, 8);
// Trả về: 4.36

Phương trình Công suất Khí động học

11. Yêu cầu Công suất Tổng thể

Công thức đầy đủ:

P_tổng = P_khí_động_học + P_trọng_lực + P_lực_cản_lăn + P_động_năng

Các công thức thành phần:

Lực cản khí động học:
P_aero = CdA × 0,5 × ρ × V³
Trọng lực (khi leo dốc):
P_gravity = m × g × sin(θ) × V
Lực cản lăn:
P_rolling = Crr × m × g × cos(θ) × V
Động năng (khi gia tốc):
P_kinetic = m × a × V

Các hằng số & Biến số:

  • CdA = Hệ số lực cản × diện tích mặt trước (m²)
    • Tay trên hoods (xe road): 0,35-0,40 m²
    • Tay dưới drops: 0,32-0,37 m²
    • Tư thế TT: 0,20-0,25 m²
  • ρ = Mật độ không khí (1,225 kg/m³ ở mực nước biển, 15°C)
  • V = Vận tốc (m/s)
  • m = Tổng khối lượng (người + xe, kg)
  • g = Gia tốc trọng trường (9,81 m/s²)
  • θ = Góc dốc (đổi từ độ hoặc radian)
  • Crr = Hệ số lực cản lăn (~0,004 cho lốp road tốt)
  • a = Gia tốc (m/s²)

Ví dụ cụ thể (Đua TT đường bằng):

Kịch bản:

  • Vận tốc: 40 km/h = 11,11 m/s
  • CdA: 0,22 m² (tư thế TT tốt)
  • Tổng khối lượng: 75kg (người) + 8kg (xe) = 83kg
  • Đường bằng (độ dốc = 0°)
  • Tốc độ ổn định (gia tốc = 0)

Tính toán:

  1. P_aero = 0,22 × 0,5 × 1,225 × 11,11³ = 185W
  2. P_gravity = 0W (đường bằng)
  3. P_rolling = 0,004 × 83 × 9,81 × 11,11 = 36W
  4. P_kinetic = 0W (tốc độ ổn định)
  5. P_tổng = 185 + 0 + 36 + 0 = 221W

Giải mã: Cần duy trì 221W để giữ tốc độ 40 km/h ở tư thế TT trên đường bằng

Triển khai JavaScript:

function calculatePowerRequired(params) {
  const {
    velocityKph,
    CdA = 0.32,              // m²
    rho = 1.225,             // kg/m³
    mass = 83,               // kg (người + xe)
    gradientPercent = 0,     // %
    Crr = 0.004,             // lực cản lăn
    accelerationMps2 = 0     // m/s²
  } = params;

  // Đổi vận tốc sang m/s
  const V = velocityKph / 3.6;

  // Đổi độ dốc sang góc
  const theta = Math.atan(gradientPercent / 100);

  // Tính từng thành phần
  const P_aero = CdA * 0.5 * rho * Math.pow(V, 3);
  const P_gravity = mass * 9.81 * Math.sin(theta) * V;
  const P_rolling = Crr * mass * 9.81 * Math.cos(theta) * V;
  const P_kinetic = mass * accelerationMps2 * V;

  return {
    total: Math.round(P_aero + P_gravity + P_rolling + P_kinetic),
    aero: Math.round(P_aero),
    gravity: Math.round(P_gravity),
    rolling: Math.round(P_rolling),
    kinetic: Math.round(P_kinetic)
  };
}

// Ví dụ: Đua TT ở 40 km/h
const power_tt = calculatePowerRequired({
  velocityKph: 40,
  CdA: 0.22,
  mass: 83,
  gradientPercent: 0
});
// Trả về: { total: 221, aero: 185, gravity: 0, rolling: 36, kinetic: 0 }

// Ví dụ: Leo dốc 8% ở tốc độ 15 km/h
const power_climb = calculatePowerRequired({
  velocityKph: 15,
  CdA: 0.38,
  mass: 75,
  gradientPercent: 8
});
// Trả về: { total: 265, aero: 27, gravity: 244, rolling: 11, kinetic: 0 }

Các hàm hỗ trợ

Các tiện ích chuyển đổi đơn vị

Triển khai JavaScript:

// Chuyển đổi thời gian
function hoursToSeconds(hours) {
  return hours * 3600;
}

function minutesToSeconds(minutes) {
  return minutes * 60;
}

function secondsToHours(seconds) {
  return seconds / 3600;
}

function formatDuration(seconds) {
  const hours = Math.floor(seconds / 3600);
  const minutes = Math.floor((seconds % 3600) / 60);
  const secs = Math.round(seconds % 60);
  return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
}

// Chuyển đổi tốc độ
function kphToMps(kph) {
  return kph / 3.6;
}

function mpsToKph(mps) {
  return mps * 3.6;
}

// Chuyển đổi năng lượng
function joulesToKJ(joules) {
  return joules / 1000;
}

function kJToJoules(kJ) {
  return kJ * 1000;
}

function wattsToKJ(watts, durationSeconds) {
  return (watts * durationSeconds) / 1000;
}

// Ví dụ:
formatDuration(7265);        // Trả về: "2:01:05"
kphToMps(40);                // Trả về: 11.11 m/s
wattsToKJ(250, 3600);        // Trả về: 900 kJ (1 giờ tại 250W)

Tài nguyên triển khai

Tất cả các công thức trên trang này đều đã sẵn sàng để đưa vào sản xuất và được xác thực dựa trên các tài liệu khoa học cũng như dữ liệu thực tế từ thiết bị đo công suất. Hãy sử dụng chúng cho các công cụ phân tích tùy chỉnh, xác minh hoặc để hiểu sâu hơn về tính toán trong tập luyện dựa trên công suất.

💡 Các quy tắc tốt nhất (Best Practices)

  • Xác thực đầu vào: Kiểm tra các phạm vi công suất hợp lý (0-2000W), thời gian dương
  • Xử lý ngoại lệ: Lỗi chia cho không, dữ liệu null/undefined, thiếu FTP
  • Làm tròn phù hợp: CTL/ATL/TSB lấy 1 chữ số thập phân, TSS lấy số nguyên, W/kg lấy 2 chữ số thập phân
  • Lưu trữ với độ chính xác cao: Giữ nguyên các chữ số thập phân trong cơ sở dữ liệu, chỉ làm tròn khi hiển thị
  • Múi giờ: Xử lý nhất quán giữa giờ UTC và giờ địa phương khi phân tích dữ liệu nhiều ngày
  • Hiệu chuẩn thiết bị: Nhắc nhở người dùng thực hiện zero-offset trước khi đạp
  • Xác thực FTP: Cảnh báo các giá trị FTP bất thường (>500W hoặc <100W đối với người lớn)
  • Kiểm tra kỹ lưỡng: Sử dụng các tệp tin đạp xe đã biết kết quả đúng để xác minh các phép tính