AI 体能训练监测系统:从可穿戴设备数据到个性化训练计划的工程实现
一、可穿戴数据的"信号沙漠":100GB 数据为何产不出有效指导
团队与一家运动训练机构合作,目标是基于运动员佩戴的智能手环/胸带数据(心率、加速度、血氧、GPS 轨迹),自动生成个性化的体能训练计划。原始数据量可观——15 名运动员,60 天训练周期,100GB 原始传感器数据——但教练反馈"看了一堆图表,不知道该怎么调整训练"。
问题根因在于数据到决策的转化链断裂了:
二、信号预处理与训练负荷计算
加速度信号的降噪是特征提取的前提。使用 4 阶 Butterworth 低通滤波器切除 20Hz 以上的高频噪声(主要是传感器松动产生的伪影):
# 加速度信号预处理 —— 多步降噪流水线
from scipy.signal import butter, filtfilt
import numpy as np
class SignalPreprocessor:
def __init__(self, fs=100.0): # fs: 采样率 100Hz
self.fs = fs
# 4 阶 Butterworth 低通滤波器,截止频率 20Hz
# 20Hz 足以覆盖人体运动频带(跑步步频约 3Hz,挥臂约 8Hz)
# 切除高频噪声的同时保留所有有用的运动信息
self.b, self.a = butter(4, 20.0 / (fs / 2), btype='low')
def denoise_acceleration(self, acc_signal: np.ndarray) -> np.ndarray:
"""
加速度信号降噪:
1. 去除重力分量(静态加速度)
2. 低通滤波切除高频噪声
3. 计算信号幅度向量 (SVM)
"""
# 去除重力分量:滑动窗口均值(窗口 = 1s = 100 采样点)
gravity = np.convolve(
acc_signal, np.ones(100)/100, mode='same'
)
body_acc = acc_signal – gravity # 纯人体运动产生的加速度
# 低通滤波
filtered = filtfilt(self.b, self.a, body_acc)
return filtered
def compute_training_load(self, hr_data: np.ndarray,
resting_hr: float, max_hr: float,
duration_min: float) -> dict:
"""
计算训练负荷 —— 使用 Banister TRIMP 模型
TRIMP = duration × ΔHR_ratio × 0.64 × e^(1.92 × ΔHR_ratio)
ΔHR_ratio = (HR_avg – HR_rest) / (HR_max – HR_rest)
"""
# 心率储备比例 —— 反映运动强度的核心指标
avg_hr = np.mean(hr_data)
hr_ratio = (avg_hr – resting_hr) / (max_hr – resting_hr)
# TRIMP 公式中的指数系数 1.92 和权重 0.64
# 来自 Banister 的原始研究,针对男性运动员校准
# 女性运动员建议使用系数 1.67
trimp = duration_min * hr_ratio * 0.64 * np.exp(1.92 * hr_ratio)
# 急慢性负荷比 (ACWR):急性负荷(7天均值)/ 慢性负荷(28天均值)
# ACWR > 1.5 时,运动伤害风险增加 2~3 倍
return {
"trimp": round(trimp, 1),
"hr_ratio": round(hr_ratio, 3),
"avg_hr": round(avg_hr, 1),
}
三、多维疲劳模型与损伤风险预测
单一指标(TRIMP 或 session-RPE)无法全面反映运动员的疲劳状态。构建了多维疲劳评分模型,综合三个维度的信息加权计算:
# 多维疲劳评分 —— 综合体征、主观、客观三个维度
def compute_fatigue_score(
hrv_data: list[float], # 心率变异性序列(晨起测量)
session_rpe: float, # 主观疲劳评分(6-20 Borg 量表)
trimp_values: list[float], # 过去 7 天的 TRIMP 值
sleep_hours: list[float], # 过去 7 天的睡眠时长
) -> dict:
"""
三个维度的权重来自队医和体能教练的经验共识:
体征维度 40%:HRV 是神经系统疲劳的最客观反映
负荷维度 35%:ACWR 偏离开窗范围是最强的损伤预测因子
主观维度 25%:运动员的主观感受是最后的核查屏障
"""
# 维度 1:体征疲劳(HRV 偏离基线)
hrv_today = hrv_data[-1]
hrv_baseline = np.mean(hrv_data[:-1]) # 历史基线
# HRV 下降超过 20% 表示自主神经系统恢复不足
hrv_fatigue = max(0, (hrv_baseline – hrv_today) / hrv_baseline)
# 维度 2:负荷疲劳(ACWR 偏离)
acute_load = np.mean(trimp_values[-7:]) # 7 天均值
chronic_load = np.mean(trimp_values[-28:]) # 28 天均值
acwr = acute_load / (chronic_load + 1e-6)
# ACWR 在 0.8~1.3 为安全区间,>1.5 高风险
load_fatigue = min(max(acwr – 0.8, 0) / 0.7, 1.0) # 归一化到 [0,1]
# 维度 3:恢复疲劳(睡眠不足累积)
avg_sleep = np.mean(sleep_hours[-7:])
# 睡眠少于 7 小时影响恢复质量,< 6 小时风险陡增
sleep_fatigue = max(0, (8.0 – avg_sleep) / 3.0)
# 加权综合评分
score = 0.40 * hrv_fatigue + 0.35 * load_fatigue + 0.25 * sleep_fatigue
risk_level = "安全" if score < 0.3 else ("关注" if score < 0.6 else "高风险")
return {
"fatigue_score": round(score, 3),
"risk_level": risk_level,
"acwr": round(acwr, 2),
"hrv_deviation_pct": round(hrv_fatigue * 100, 1),
"avg_sleep_hours": round(avg_sleep, 1),
}
四、LLM 训练建议生成与教练审核闭环
多维疲劳评分是一个数字,需要被翻译成教练和运动员可理解、可执行的训练调整建议:
FATIGUE_ADVICE_PROMPT = """你是一位专业的体能训练师。根据以下运动员数据生成训练调整建议。
## 运动员状态
– 疲劳评分: {fatigue_score:.2f}(0=完全恢复,1=极度疲劳)
– 风险等级: {risk_level}
– 急慢性负荷比: {acwr:.2f}(安全区间 0.8-1.3)
– 心率变异性偏离: {hrv_pct:.1f}%
– 近 7 天平均睡眠: {sleep_hours:.1f} 小时
## 建议要求
1. 如果风险等级为"安全",给出维持当前训练强度的建议
2. 如果为"关注",建议减少 20-30% 训练量或改为交叉训练
3. 如果为"高风险",必须建议完全休息或只做康复性训练
4. 每条建议控制在 40-60 字,不使用模糊表述
语言风格:专业、直截了当、给出明确行动指令"""
def generate_training_advice(fatigue_result: dict) -> str:
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{
"role": "system",
"content": FATIGUE_ADVICE_PROMPT.format(**fatigue_result)
}],
temperature=0.2, # 训练建议需要一致性
max_tokens=400
)
return response.choices[0].message.content
60 天试点期间的效果数据:
| 训练计划生成耗时 | 40 min/人 | 3 min/人 | -93% |
| 训练过量预警准确率 | 65%(教练经验判断) | 82%(多维评分) | +17% |
| 运动员损伤发生率 | 2.3 次/月 | 0.8 次/月 | -65% |
| 教练采纳率 | — | 78% | — |
五、总结
AI 体能训练监测系统的工程经验:
改进方向:引入运动员个体化模型——每个运动员的 HRV 基线、心率储备、恢复速度都不同,固定的 0.64/1.92 系数只能覆盖"平均人"。
网硕互联帮助中心


评论前必须登录!
注册