4、加速度传感器实战:加速度计原理、三轴数据解读、计步器核心算法、运动状态检测

加速度传感器,说白了就是手机里那个能感知「你动了没」的小东西。我最早接触它是在做一款运动App的时候,那时候踩了不少坑,今天把这些经验掰开揉碎了讲给你听。

4.1 加速度计的工作原理

加速度计的原理其实不复杂。它内部有一个微小的质量块,连着弹簧和电极。当你把手机加速或倾斜时,质量块会移动,电容值就变了。芯片根据电容变化算出加速度值。

嗯,这里要注意:加速度计测的是「比力」,不是纯粹的重力。它测的是物体受到的合力减去重力。所以静止时,它测到的是重力加速度g,方向向上。

核心概念:加速度计输出的是「加速度矢量」,单位是m/s²或g(1g ≈ 9.8 m/s²)。

我在项目中遇到过一个问题:手机平放桌上,Z轴读数应该是9.8,但实际读出来是9.6。后来发现是传感器校准问题。每个传感器出厂都有偏差,需要做零偏校准。

4.2 三轴数据解读

手机坐标系是固定的:X轴向右,Y轴向上,Z轴指向屏幕外。静止时,三轴读数反映了重力在三个方向的分量。

手机姿态 X轴 Y轴 Z轴
平放屏幕朝上 0 0 +9.8
竖屏直立 0 +9.8 0
横屏左侧朝下 +9.8 0 0
屏幕朝下平放 0 0 -9.8

你想想看,如果手机斜着拿,三轴都有读数。比如45度倾斜,每个轴大约有6.9 m/s²。这个数据可以用来判断手机朝向。

实战技巧:读取原始数据时,记得先做低通滤波。我习惯用一阶RC滤波:filteredValue = alpha * rawValue + (1 - alpha) * lastFilteredValue,alpha取0.1~0.3效果不错。

4.3 计步器核心算法

计步器算法,说白了就是检测「走路时身体上下振动的规律」。我做过好几个版本的计步器,踩过不少坑,这里分享一个靠谱的算法流程。

// 计步器核心算法伪代码
public class StepDetector {
    private float lastAccel = 0;
    private float lastFiltered = 0;
    private float threshold = 2.0f; // 阈值,单位m/s²
    private int stepCount = 0;
    private boolean isPeak = false;
    
    public void onSensorChanged(float[] values) {
        // 1. 计算合加速度
        float magnitude = Math.sqrt(values[0]*values[0] + 
                                    values[1]*values[1] + 
                                    values[2]*values[2]);
        
        // 2. 低通滤波
        float filtered = 0.3f * magnitude + 0.7f * lastFiltered;
        
        // 3. 检测波峰
        if (filtered > lastFiltered && filtered > threshold) {
            if (!isPeak) {
                isPeak = true;
                stepCount++;
            }
        } else if (filtered < lastFiltered) {
            isPeak = false;
        }
        
        lastFiltered = filtered;
        lastAccel = magnitude;
    }
}

这个算法有几个关键点:

  • 合加速度:把三轴数据合成一个值,消除手机朝向的影响
  • 低通滤波:去掉高频噪声,只保留人体运动的低频信号(1~3Hz)
  • 波峰检测:走路时合加速度会周期性出现波峰,检测到波峰就算一步
  • 阈值设置:太灵敏会多计,太迟钝会漏计。我一般设2.0~3.0 m/s²

我曾经踩过的坑:阈值设得太低,结果坐车颠簸也被计步了。后来加了「时间窗口」限制——两次步数间隔不能小于200ms,这样能过滤掉高频抖动。

4.4 运动状态检测

运动状态检测,说白了就是判断用户现在是在走路、跑步、骑车还是静止。我做过一个运动识别模块,核心思路是这样的:

  1. 静止检测:合加速度接近9.8,方差很小(<0.5)
  2. 走路检测:合加速度有规律波动,频率1~2Hz,幅度2~5 m/s²
  3. 跑步检测:合加速度波动更大,频率2~3Hz,幅度5~10 m/s²
  4. 骑车检测:合加速度变化平缓,但方向变化明显

我习惯用滑动窗口来做特征提取。取最近2秒的数据(大约100个采样点),计算:

  • 均值:判断是否静止
  • 方差:判断运动剧烈程度
  • 过零率:判断运动频率
  • 峰值:判断运动幅度

实战经验:跑步和走路的区分,我主要看「峰值间隔」。走路时峰值间隔约500ms,跑步时约300ms。这个特征比单纯看幅度更稳定。

为什么会这样?因为不同人的步幅差异很大,但步频相对固定。走路一般100~120步/分钟,跑步160~180步/分钟。用频率做判断,适应性更好。

4.5 知识体系总览

下面这张图把本章的核心内容串起来了。你看一遍就能明白加速度传感器从原理到应用的完整链路。

加速度传感器实战知识体系 加速度计原理 三轴数据解读 计步器核心算法 运动状态检测 质量块 + 电容检测 比力 vs 重力 手机坐标系 姿态与分量 合加速度 + 滤波 波峰检测 + 阈值

这张图展示了四个核心模块的关联:原理是基础,数据是输入,算法是处理,应用是输出。每个模块都有对应的子知识点,你在实战中需要把它们串起来用。

我的建议:刚开始做加速度传感器开发,别急着写复杂算法。先学会读原始数据,理解三轴含义。然后做简单的滤波和阈值判断。等基础打牢了,再上计步器和运动识别。一步一步来,不容易出bug。

公众号:蓝海资料掘金营,微信deep3321