如何计算太阳斑的方向/方向和速度?

时间:2014-12-09 16:09:50

标签: java embedded accelerometer physics

我正在试验太阳黑子上的加速度计。 我试图通过从X轴和Y轴测量加速度计的值来计算速度,但它们对我来说似乎是随机的。

获取运动的值和方向/方向并计算其速度的正确方法是什么?

这是我的代码:

while (true) {

        try {
             offset=Math.sqrt(accel.getAccelX()*accel.getAccelX()+accel.getAccelY()*accel.getAccelY());
               if(offset<0.1 && offset>-0.1)
                   offset=0;

            v=(offset+ ((offset-anterior))/2)*0.2; //0.2 is 200millisecs
            anterior=offset;
            Utils.sleep(200);//5 reads per secound
          }}...

更新 例如,我在一个方向上移动太阳黑子,变量v(速度)通过随机顺序(不是顺序)给出从负到7ms的值。如果改变运动的方向,它并没有像我预期的那样给出负值。

例子:(如果我把它移到右边)

v =0.4771031167950723
v =0.4771031167950723
v =-0.15903437226502407
v =-0.15903437226502407
v =0.33841556285063856
v =0.33841556285063856
v =0.7397145777969039

提前致谢。

1 个答案:

答案 0 :(得分:0)

就像@John Story所说,解决这个问题的最佳方法是制作平均值。 太阳斑加速度计非常不稳定,不适合精确的速度预测。

无论如何,这是我能做的最好的代码

double v=0;
    double anterior=0;

    while (true) {
        double time=System.currentTimeMillis()+200;
        double currentTime=System.currentTimeMillis();
        double offset=0;
        int tries=0;
        double maximo=0;
        double minimo=0;
        while(time>currentTime){ //lets run for 0.2seconds :)

            try {
                double temp=-accel.getAccelY(); //front shouln't be negative
                tries++;
                if(temp<0.1201 && temp>-0.1201){
                    tries--; //oops threadshould sample
                }else{
                    if(temp>maximo)
                        maximo=temp;
                    if(temp<minimo)
                        minimo=temp;
                    offset+=temp;
                }   
            }catch (Exception e) {
                System.err.println("Caught " + e + " while collecting/sending sensor samples.");
            }
            Utils.sleep(10); //sleep 10milisecs
            currentTime=System.currentTimeMillis();
        }
        if(tries>2)
            offset=(offset-minimo-maximo)/(tries-2); //remove max value and min value from sample and makes average
        else if(tries>0)
            offset/=2; //you wont take max or min from a two value sample
        try {
            dg.reset();         //clears
            v=anterior+offset*0.2; //vf=vi+at
            dg.writeDouble(Math.abs(v*100)); // sends in cm
            anterior=offset;    //vi=vf
            rCon.send(dg);     //sends radiogram
            Utils.sleep(200); //sleep 0.2s
        }catch (Exception e) {
            System.err.println("Caught " + e + " while sending velocity.");
        }
    }
}