如何用Python对Myo臂环3轴加速度计数据积分求速度与位置
问题解答
前置预处理提醒
首先你当前采集的加速度数据包含重力分量(从示例数据可以看到z轴数值接近1g),积分前需要先通过高通滤波或者姿态解算消除重力影响,否则积分结果会有持续的偏移误差。
问题1:初始速度获取
你的使用场景为短时间手写动作采集,可直接通过静止判定获取初始速度:
- 采集数据时通常在正式书写前会有100200ms的静止准备阶段,可通过陀螺仪数据判定静止状态:当连续多个采样点的三轴陀螺仪模值低于预设阈值(可根据你的设备噪声水平设置,一般取0.050.1rad/s),即可判定为静止
- 静止状态下的初始速度直接设为
0即可,完全满足手写识别特征的精度要求,不需要额外复杂计算
问题2:scipy.quad的使用误区及替代方案
scipy.integrate.quad是针对已知表达式的连续函数的积分工具,不适用于你手上的离散采样加速度序列:
- 不需要拟合积分函数,也不需要遍历每个加速度点当f(x)调用quad,这种方法不仅效率低,精度也没有优势
- 离散序列积分直接使用
scipy.integrate.cumtrapz(梯形累积积分)即可,输入你的加速度序列和采样间隔dt(根据你的设备采样率计算,比如Myo默认采样率50Hz的话dt=0.02s),一行代码就能得到速度序列 - 你提到的直接遍历加速度乘以采样间隔累加属于欧拉积分,短时间(5~7秒)下误差极小,也完全可以使用
问题3:dblquad的处理方案
和quad同理,scipy.integrate.dblquad是连续函数的二重积分工具,完全不适用于离散数据场景:
- 要得到位置序列,只需要两步离散积分:先对加速度积分得到速度序列,再对速度序列做一次离散积分即可,两次调用
cumtrapz就可以实现,不需要处理dblquad的多参数逻辑
直接累加方案的适用性
完全可以满足你的需求:
- 你不需要惯性导航场景的绝对位置精度,只需要不同手写字母的特征具备区分度,直接累加的误差在5~7秒的短时间内几乎不会影响特征的区分度
- 后续可以通过平均速度做归一化处理,消除不同用户的书写速度差异,更适合ML模型训练
内容的提问来源于stack exchange,提问作者Lukas S
相关产品推荐
相关产品推荐

