有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何计算太阳黑子的方向和速度?

我正在我的太阳黑子上试验加速计。 我试图通过测量加速度计的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) 个答案

  1. # 1 楼答案

    就像@johnstory所说的,处理这个问题的最好方法是平均。 太阳黑子加速度计非常不稳定,不适合进行精确的速度预测

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

    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.");
            }
        }
    }