Phase -1: 项目启动与数据探索
状态: ✅ 已完成 完成时间: 2025-12-26 之前 目标: 理解数据集结构,评估可行性,制定验证计划
🎯 项目背景
为什么要做这个项目?
问题: 高尔夫教练系统(如 Sportsbox AI)只能告诉用户"你做错了",但无法解释"为什么错了"。
原因: 现有系统只使用:
- 📹 Vision (3D 骨架追踪)
- 📱 IMU (加速度/角速度)
缺失: 肌肉激活数据 (EMG)
我们的方案: Movement Chain AI = Vision + IMU + EMG
- 能检测因果关系: "你挥杆无力是因为核心肌肉未激活"
- 能检测运动链倒置: "你的手臂比核心先发力,违反了动力链原理"
📊 数据集选择
为什么选择 Jump Data?
在没有硬件的情况下,我们需要找到:
- ✅ 包含 Vision + IMU + EMG 三模态数据
- ✅ 公开可下载
- ✅ 数据质量高,有标注
- ✅ 动作简单,容易验证
最终选择: Comprehensive Kinetic-EMG Dataset
包含:
- 33 个 Marker 点 (128 Hz)
- 29 维 IMU 特征 (240 Hz)
- 9 个 EMG 通道 (2048 Hz)
- 13 个动作类型: 跳跃、行走、跑步、深蹲等
🔍 初期探索阶段
Step 1: 数据可访问性验证
问题: 能否下载并加载数据?
bash
# 下载数据集
wget https://springernature.figshare.com/.../Subj04.zip
unzip Subj04.zip结果: ✅ 数据集大小 ~500 MB,包含 13 个 .mat 文件
Step 2: 数据结构探索
问题: .mat 文件内部结构是什么?
创建了 scripts/explore_mat_structure.py:
python
import scipy.io
mat_data = scipy.io.loadmat('Subj04_jump.mat')
# 发现: Datastr[0,0]['field'][0,0]['data']发现:
- MATLAB 嵌套结构非常深
- 需要递归访问:
Datastr[0,0]['IMU'][0,0]['IMUData'] - 每个模态有独立的采样率字段
详见: Phase 1: 数据加载层验证
Step 3: 数据完整性检查
问题: 数据是否完整?有缺失吗?
python
# 检查 Marker 数据
marker_data = datastr['Marker'][0,0]['MarkerData'] # (33, 3, N)
nan_count = np.isnan(marker_data).sum()
print(f"NaN markers: {nan_count / marker_data.size * 100:.1f}%")结果:
- Marker: ~5-10% NaN (遮挡导致)
- IMU: 0% NaN
- EMG: 0% NaN
处理方案: 使用 np.nanmean() 和插值处理缺失值
Step 4: 时间同步验证
问题: 三个模态的时间是否对齐?
方法: 检测同一事件 (Impact/着陆) 在三个模态中的时间戳
python
# IMU: 加速度峰值
imu_impact_time = detect_impact_from_imu(imu_data, imu_rate)
# EMG: 肌肉激活峰值
emg_impact_time = detect_impact_from_emg(emg_data, emg_rate)
# Marker: 质心最低点
marker_impact_time = detect_impact_from_marker(marker_data, marker_rate)
# 计算时间差
time_diff = abs(imu_impact_time - marker_impact_time)结果: 92.3% 的试次时间差 <50ms,数据集时间同步良好
详见: Phase 3: 时间同步验证
🎓 关键发现
1. 数据集高质量
优点:
- ✅ 三模态数据完整,采样率高
- ✅ 时间同步精度高 (<50ms)
- ✅ 包含多种动作类型,可验证通用性
- ✅ 有标注信息 (虽然我们没有使用)
缺点:
- ⚠️ 只有一个受试者 (Subj04)
- ⚠️ 动作类型不包括高尔夫挥杆 (但原理通用)
2. 运动链理论可验证
通过 EMG 数据,我们可以检测:
- 肌肉激活顺序: Lower → Core → Upper
- 激活时间差: 正常应为 50-200ms
- 倒置运动链: 如果 Upper 先于 Core 激活
Phase 0 验证: 在最差案例 (Subj04_lunge) 中,成功检测到运动链倒置
详见: Phase 0: 证明核心价值
3. 可扩展性强
虽然验证使用的是跳跃数据,但架构设计支持:
- 高尔夫挥杆
- 棒球投球
- 网球发球
- 任何需要动力链分析的运动
原因: 动力链理论是通用的生物力学原理
📋 制定验证计划
基于初期探索,我们制定了 6 个阶段的验证计划:
| 阶段 | 目标 | 关键问题 |
|---|---|---|
| Phase 0 | 证明核心价值 | EMG 能否检测运动链倒置? |
| Phase 1 | 数据加载 | 能否正确加载三模态数据? |
| Phase 2 | 特征提取 | 能否提取 12 个关键指标? |
| Phase 3 | 时间同步 | 三模态数据是否对齐? |
| Phase 4 | 可视化 | 能否同步展示三模态? |
| Phase 5 | 规则引擎 | 规则逻辑是否正确? |
验证原则:
- 由简到繁: 先验证核心价值,再完善细节
- 快速失败: 如果核心假设错误,尽早发现
- 文档优先: 每个阶段都有完整文档
- 可复现: 所有代码可独立运行
🛠️ 技术栈选择
数据处理
- Python 3.11: 主力语言
- NumPy: 数组操作
- SciPy:
.mat文件加载,信号处理 - Matplotlib: 静态可视化
可视化
- Rerun.io: 多模态时间序列可视化
- 为什么不用 matplotlib? 需要同步播放三模态
- 为什么不用 Plotly? 3D 骨架动画性能不好
文档
- VitePress: 静态文档网站
- Markdown 友好
- 支持代码高亮
- 可嵌入图表
📦 交付物
| 文件 | 描述 |
|---|---|
scripts/explore_mat_structure.py | 数据结构探索脚本 |
scripts/load_kinetic_emg_dataset.py | 核心数据加载器 |
data/comprehensive-kinetic-emg/ | 数据集存储位置 (gitignored) |
🚀 后续工作
Phase -1 完成后,我们进入:
- Phase 0: 证明 EMG 能检测运动链倒置 (核心价值验证)
- Phase 1-5: 完整数据管线验证
查看 整体验证计划 了解详细路线图。
Phase -1 完成 ✅
下一步: Phase 0: 证明核心价值