Skip to content

能提前知道挥杆对不对吗?

核心问题

传统的挥杆分析都是事后诸葛亮 —— 挥完杆才告诉你哪里错了。

我们想做的是:在挥杆过程中就发现问题,立刻提醒。

这就像导航软件在你转错弯之前就喊"前方右转",而不是开过了才说"您已偏离路线"。


原理:身体的"多米诺骨牌"

好的挥杆有一个规律:力量像波浪一样,从身体中心向四肢传递

正确顺序:髋部 → 躯干 → 肩膀 → 手臂 → 球杆
         (先)                        (后)

这叫做 运动链 (Kinetic Chain)。

如果顺序反了(手先动),就像用手臂甩球,力量小还容易受伤。

我们的想法:在三个关键位置贴传感器,检测"谁先动"。如果检测到手先动了,立刻震动提醒。


本次验证目标

这次实验是单元测试:分别验证每个传感器是否能正常工作。

还不是完整的挥杆测试(那需要三个传感器同时工作)。

测试设备

  • 传感器:高精度运动传感器(包含加速度计和陀螺仪)
  • 采样频率:每秒 100 次(人眨眼的时间内已记录 30 组数据)

测试位置

位置作用
手部检测手臂启动
下背检测髋部旋转
上背 (T1 椎骨)检测肩部旋转

采集到的数据

数据规模

位置文件数总样本数录制时长
手部106,71667.2 秒
下背43,64836.5 秒
上背 (T1)1010,152101.5 秒

总计:24 个文件,20,516 个样本,205.2 秒数据。

数据总览

数据总览

原始传感器信号

下图是手部传感器在 5 秒内记录的原始数据:

原始传感器数据

  • 上半部分:加速度计输出(X/Y/Z 三轴)
  • 下半部分:陀螺仪输出(X/Y/Z 三轴)

可以看到信号变化明显,说明传感器成功捕捉到了手部运动。

运动强度检测

我们计算了每个时刻的"运动强度"(三轴加速度的合成值),并检测运动开始的时刻:

运动强度

  • 红色虚线:算法检测到的"运动开始"时刻
  • 手部数据在约 2.9 秒时检测到明显运动

验证结果

✅ 传感器能用

三个位置都成功捕捉到了清晰的运动信号。

✅ 算法能跑

编写的检测程序 (early_foresee_prototype.py) 实现了:

  1. 运动检测 —— 判断"什么时候开始动了"
  2. 顺序比较 —— 比较不同位置的启动时间

检测结果示例

Hand (手部):
  运动开始时刻: 2882ms
  峰值强度: 47,169

程序输出:
  ⚠️ 检测到运动信号
  ✅ 算法成功识别运动开始点

下一步挑战:时间同步

目前的数据是分三次独立采集的:

位置录制日期录制时间
手部1月12日17:15
下背1月13日23:28
上背1月13日23:58

这就像三个人赛跑,如果不是同时听到发令枪,就无法比较谁快谁慢。

结论:我们验证了"传感器能用"和"算法能算",但需要同步数据才能判断真实的发力顺序。


下一步计划

优先级任务说明
P0同步采集让三个传感器"对表",同时记录同一次挥杆
P1扩大样本采集 50+ 次挥杆,包含好的和坏的
P2智能模型训练算法自动判断挥杆质量

结论

验证项结果
传感器能检测运动吗?✅ 能,信号清晰
程序能比较顺序吗?✅ 能,逻辑正确
能实现提前预警吗?⏳ 需要同步数据验证

一句话总结:思路可行,等同步数据。


附录:技术细节

点击展开(供技术团队参考)

代码位置

/Users/xingyunx/workplace/golf/jan-23/
├── early_foresee_prototype.py  # 检测程序
├── generate_visualizations.py  # 图表生成
└── extracted/                   # 传感器数据
    ├── imu_20260112_*.csv      # 手部 (10 files)
    ├── imu_20260113_232*.csv   # 下背 (4 files)
    └── imu_20260113_235*.csv   # 上背 (10 files)

数据格式

csv
timestamp,AcX,AcY,AcZ,GyX,GyY,GyZ,Tmp
2026-01-13 23:28:22.232,604,16584,712,-734,2010,306,1355
  • AcX/Y/Z:三轴加速度(原始 ADC 值)
  • GyX/Y/Z:三轴角速度(原始 ADC 值)
  • Tmp:温度

运动检测算法

python
def detect_motion_onset(magnitudes, threshold=1.5):
    """
    检测运动开始时刻
    1. 用前 20 个样本计算基线(静止状态)
    2. 找到第一个超过 基线×1.5 的时刻
    """
    baseline = mean(magnitudes[:20])
    threshold = baseline * 1.5
    for i, mag in enumerate(magnitudes):
        if mag > threshold:
            return i  # 返回样本索引
    return -1