Go Down

Topic: Calcolare angolo assoluto da velocità angolare (Read 2 times) previous topic - next topic

astrobeed


ottengo valori totalmente sbagliati che non centrano niente con l'angolo... Come potrei fare?


Hai calibrato l'accelerometro ?
La formula che usi è totalmente sbagliata, l'angolo altro non è che il seno, o il coseno a seconda del verso, dell'accelerazione previa sua normalizzazione in un valore che varia tra 0 e 1 (0 = 0G = 0°, 1 = 1G = 90°)



uwefed

E poi i computer non calcolano gli angoli in gradi ma in radianti (360Gradi sono 2Pi).
Ciao Uwe

Dario Gogliandolo



ottengo valori totalmente sbagliati che non centrano niente con l'angolo... Come potrei fare?


Hai calibrato l'accelerometro ?
La formula che usi è totalmente sbagliata, l'angolo altro non è che il seno, o il coseno a seconda del verso, dell'accelerazione previa sua normalizzazione in un valore che varia tra 0 e 1 (0 = 0G = 0°, 1 = 1G = 90°)



Si, l'accelerometro è calibrato.
Io vedo che il valore minimo che mi può restituire è -8191 che equivale a -90° e il valore massimo è 8191 che equivale a 90°. Come faccio a far rientrare questi valori in un range compreso fra -1 e 1?
io ho provato facendo cosi:
Code: [Select]

float beccheggio()
{
  float angVal=0;
  if (axis[Y]>0)
  {
    angVal=mapFloat(axis[Y], 0,8191, 0, 1);
  }
  else
  {
    angVal=mapFloat(axis[Y], -8191,0, -1, 0);
  }
 
  //float angVal = mapFloat(axis[Y], -8191,8191, -1, 1);//((float)axis[Y]/8191.0*bma180.getGSense())/2; //mapFloat(axis[Y], -8191,8191, -90, 90);

   return (angVal);


}

float mapFloat(int x, int in_min, int in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

ma effettivamente utilizzando questo codice quando il valore avis[Y] è superiore a 6800 circa il valore di angVal super l'1 e questo mi sembra molto strano perché quando richiamo la funzione mapFloat come massimo imposto 1 tanto è vero che facendo gli stessi calcoli con carta e penna tutto quadra perfettamente...
Non capisco come mai questi comportamenti cosi strani...
Video demonstration of my Dashboard OBDII -> http://goo.gl/m8Pqp

qsecofr

a me va... non supera mai i limiti impostati...

Code: [Select]
float mapFloat(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  int i ;
 
  for (i = -8191; i < 8191; i++){
      float angVal = mapFloat(i, -8191,8191, -1, 1);
      lcd.clear();
      lcd.print("i:" );
      lcd.print (i);
      lcd.print ("  ->");
            lcd.print (angVal);
      delay(10);
  }
}



pero non capisco nel tuo programma che fine ha poi fatto l'arcoseno...

astrobeed


Io vedo che il valore minimo che mi può restituire è -8191 che equivale a -90° e il valore massimo è 8191 che equivale a 90°.


Io vedo che continui a non capire, ma come puoi pensare di convertire direttamente l'accelerazione in gradi ?
Ti ho detto chiaramente che l'accelerazione rappresenta il seno, o coseno, dell'angolo non che è l'angolo.


Go Up