锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

加速度传感器的计步算法Pedometer

时间:2022-11-05 16:00:00 14加速度传感器采用3轴加速度传感器速度传感器hqzs

加速度传感器的计步算法Pedometer

1.前言
??最近用了计步,查了很多资料。以下是一个简单的计步算法,也可以检测跳跃

2.工具
??实时绘制Android加速度的APP

3.内容

  1. Android介绍加速传感器
    ??Android上加速度传感器的方向如下(当你面对手机屏幕时),这是一个右手坐标系。因此,加速度由三个正交向量组成。例如,当你把手机放在桌子上时,屏幕应该是(0、0、9.6左右)

  2. 使用g-sensor分析数据
    ??打开工具后走路跳跃,然后导出数据,以时间为横轴画折线图
    经过几组实验,我们会发现,当手机以不同的姿态放入口袋进行运动时,xyz三轴的数据是不确定的,但三个矢量和模具是有规律的(事实上,真正的加速度被正交分解),所以我们应该分析它们的模具|V|
    ??如上图所示,每次行走都会产生一个峰谷,跳跃幅度相对较大。因此,判断行走只需要判断峰谷

  3. 数据处理
    ??不妨记住第一个时间单位获得的加速度的三个矢量和模寸 x i x_i xi,为了使数据更平滑,分别使用两次指数
    滤波器(EMA)
    { a i = ( 1 ? p 1 ) a i ? 1 p 1 x i b i = ( 1 ? p 2 ) b i ? 1 p 2 x i a 0 = b 0 = x 0 p 1 > p 2 \left\{ \begin{aligned} a_{i}&=(1-p_1)a_{i-1} p_{1}x_{i}\\ b_{i}&=(1-p_2)b_{i-1} p_{2}x_{i}\\ a_{0}&=b_{0}=x_{0}\\ p_{1}&>p_{2}\\ \end{aligned} \right. ???????????aibia0p1=1p1ai1+p1xi=1p2bi1+p2xi=b0=x0>p2
      其中 a i a_i ai是拟合曲线, b i b_i bi均值,因此 Δ h = a i − b i {\Delta{h}=a_i-b_i} Δh=aibi即波峰波谷的高度差,得到 Δ h {\Delta{h}} Δh后再跟设置好的 k 1 , k 2 , k 3 {k_1,k_2,k_3} k1,k2,k3比较(其中 k 1 > k 2 > k 3 {k_1>k_2>k_3} k1>k2>k3)。判别结果如下,
    { j u m p , Δ h > k 1 w a l k i n g , Δ h > k 2 s t a n d i n g , Δ h < k 3 \left\{ \begin{aligned} &jump,\Delta{h}>k_1\\ &walking,\Delta{h}>k_2\\ &standing,\Delta{h}jump,Δh>k1walking,Δh>k2standing,Δh<k3
      需要注意的是.一旦检测到跳跃或者行走,就得有计时器计时,当经过 Δ t \Delta t Δt后再进行判别,因为人走路和跳跃是需要时间的!!!
      其中 p 1 , p 2 , k 1 , k 2 , k 3 , Δ t {p_{1},p_{2},k_1,k_2,k_3,\Delta t} p1,p2,k1,k2,k3,Δt都是需要我们设置的参数,下面分享一组手调测出来的参数QAQ,不一定最优但能行。。。
    { p 1 = 0.2 p 2 = 0.002 k 1 = 0.25 k 2 = 0.13 k 3 = 0.008 Δ t = 2 s \left\{ \begin{aligned} p_1&=0.2\\ p_2&=0.002\\ k_1&=0.25\\ k_2&=0.13\\ k_3&=0.008\\ \Delta t&=2s \end{aligned} \right. p1p2k1k2k3Δt=0.2=0.002=0.25=0.13=0.008=2s


  上图是带入这些参数得到的曲线,我们可以看到经过 p 1 p_1 p1参数的滤波得到的曲线(红色),已经大致拟合原数据(蓝色),而经过 p 2 p_2 p2参数得到的曲线(绿色)大致为均值,要说一下的是其实绿线的值大致在9.8附近,就是重力加速度,为什么不直接采用9.8的原因是实际会有误差。
  至于为什么会选EMA,简单有效!我们其实可以发现其公式可以用线性插值函数快速实现,虽然没人说,但我觉得在很多时候我们平滑移动物体和相机用到这个插值基于的原理就是这个,在每帧不断迭代才产生了平滑。
a i a_i ai=Mathf.Lerp( a i − 1 a_{i-1} ai1, x i x_i xi, p 1 p_1 p1)= a i − 1 + ( 1 − p 1 ) x i = ( 1 − p 1 ) a i − 1 + p 1 x i a_{i-1}+(1-p_1)x_i=(1-p_1)a_{i-1}+p_1x_i ai1+(1p1)xi=(1p1)ai1+p1xi

3.实现
Unity下的实现

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章