我是靠谱客的博主 疯狂狗,最近开发中收集的这篇文章主要介绍惯性室内导航入门到精通(2)-移动平均法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

移动平均概述

接上章获得了三轴的加速度值,但人行走时的随意性和传感器的精度,导致加速度值并不准确从而不能直接拿来使用。所以在开始对数据进行处理。可采用简单移动平均法(SMA)来进行数据平滑。

简单原理

1,获取K组数据,相加除以K,得到平滑的数据
2,下次获取数据时,剔除第一个数据并将获取的数据加入
3,再将数据相加处理K,得到平滑数据,以此循环。

代码实现

创建quene类

对安卓不熟悉,安卓的queue好像是抽象类,不会用,索性自己自定义类实现队列。
5个元素的数组,头指针删除,尾指针插入。

public class queue {
    private float[] data ;// 队列
    private int front;// 队列头,允许删除
    private int rear;// 队列尾,允许插入
    private int LENGTH=5;
    private int full=0;
    private int t=0;

    public queue() {
        data = new float[LENGTH];
        front = rear = 0;
    }

    // 入队
    public void offer(float date) {
        if (rear<LENGTH)
        {
            data[rear++] = date;
        }
        else
        {
            rear=0;
        }

        if (t++>=5)
            full=1;
    }
    // 出队
    public float poll() {

        if (front<LENGTH)
        {
            float value = data[front];// 保留队列的front端的元素的值

            front++;
            return value;

        }
        else
        {
            front=0;
            float value = data[front];
            return  value;
        }

    }

    public boolean full()
    {
          if (full==1)
              return  true;
          else
              return false;
    }
}

创建sma类

public class sma {

    private queue queue_x;
    private queue queue_y;
    private queue queue_z;
    private float max_x;
    private float max_y;
    private float max_z;
    private  int LENGTH=5;

    sma()
    {
        queue_x=new queue();
        queue_y=new queue();
        queue_z=new queue();
    }


    public boolean ifture()//判断是否大于5
    {
         if (queue_x.full()&&queue_y.full()&&queue_z.full())
         {
             return  true;
         }
         else
         {
             return  false;
         }
    }

    public  void  sma_init(float x,float y,float z)
    {
        max_x+=x;
        max_y+=y;
        max_z+=z;
        queue_z.offer(z);
        queue_x.offer(x);
        queue_y.offer(y);
    }

    public void sma_run(float x ,float y,float z)//满足==5执行
    {
        max_x-= queue_x.poll();
        queue_x.offer(x);
        max_x+= x;

        max_y-=queue_y.poll();
        queue_y.offer(y);
        max_y+=y;

        max_z-=queue_z.poll();
        queue_z.offer(z);
        max_z+= z;

    }

    public float getx() {
        return max_x/LENGTH;
    }

    public float gety() {
        return max_y/LENGTH;
    }

    public float getz() {
        return max_z/LENGTH;
    }
}

sma的使用

       if (sma1.ifture())
        {
            sma1.sma_run(x,y,z);
            int x_=(int) sma1.getx();
            int y_=(int) sma1.gety();
            int z_=(int) sma1.getz();
            textView.setText("x:   "+x_+"y:    "+y_+"z:    "+z_+"n");
          }
      else
        {
            sma1.sma_init(x,y,z);
        }

最后

以上就是疯狂狗为你收集整理的惯性室内导航入门到精通(2)-移动平均法的全部内容,希望文章能够帮你解决惯性室内导航入门到精通(2)-移动平均法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部