2014-12-09 4 views
0

태양 흑점에서 가속도계를 실험하고 있습니다. 축 X와 Y에서 가속도계의 값을 측정하여 속도를 계산하려고하지만 종류가 무작위로 보입니다.Sun Spot의 방향/방향과 속도는 어떻게 계산합니까?

움직임의 값과 방향/방향을 얻고 속도를 계산하는 올바른 방법은 무엇입니까? 예를 들어, 나는 방향과 변수 V (속도) 내게 줄에 태양 흑점 이동

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 
      }}... 

UPDATE (임의의 순서로 7MS까지 부정적인에서하지 값 :

내 코드입니다 sequencial). 운동의 방향을 바꾸면 내가 예상 한 것처럼 부정적 가치를 갖지 못합니다.

예 : (내 오른쪽으로 이동하면) 미리

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

감사합니다.

+0

을 만들 수있다? 당신은 문제가 무엇인지 우리에게 정말로 말하지 않고 있습니다. –

+0

죄송합니다. 질문을 업데이트했습니다. –

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