Go Down

Topic: Problema divisione per zero (float/float) (Read 193 times) previous topic - next topic

alexsgv

Salve a tutto il forum,

stavo riscrivendo il software del mio piccolo line follower e mi sono imbattuto in un problema...

Code: [Select]
  for(int i=0; i<4; i++)
  {
    sensorReading[i] = !digitalRead(sensor[i]);
    if(sensorReading[i]==1) {
      activeSensor+=1;
    }
    totalSensor += sensorReading[i] * (i+1);
  }

  avgSensor = totalSensor/activeSensor;
  activeSensor = 0.0;
  totalSensor = 0.0;


in questo modo calcolo l'errore dato da quattro sensori digitali...le classice fotocellule.
Il problema sorge quando per qualche motivo tutti i sensori sono zero...o perchè esce fuori dalla linea o perchè per le vibrazioni un sensore è troppo lontano dalla linea e non si attiva.
Praticamente mi ritrovo 0/0 e avgSesnsor mi restituisce Nan.
Il regolatore che segue prende la tramontana e spara i pwm a tutta birra.
la cosa strana è che se lo rimetto in carreggiata o se in modalità debug sposto il robottino e lo rimetto sulla linea...il calcolo dell'errore resta sempre su NaN...non capisco come risolvere il problema...
Vi è mai capitato? sapete come risolvere il problema?!

Ciao
Alex

nid69ita

In che senso ?
Anche in matematica N/0 fa infinito e per un calcolatore non ha senso.
Lo devi "intrappolare" con un if (lo devi gestire tu come caso particolare).
my name is IGOR, not AIGOR

alexsgv


In che senso ?
Anche in matematica N/0 fa infinito e per un calcolatore non ha senso.
Lo devi "intrappolare" con un if (lo devi gestire tu come caso particolare).



Si si...infatti mentre aspettavo risposte dagli esperti ho midificato il codice così
Code: [Select]

  for(int i=0; i<4; i++)
  {
    sensorReading[i] = !digitalRead(sensor[i]);
    if(sensorReading[i]==1) {
      activeSensor+=1;
    }
    totalSensor += sensorReading[i] * (i+1);
  }

  if (activeSensor != 0){
    avgSensor = totalSensor/activeSensor; 
  }
  else {
    wrongTrack++;
    if (wrongTrack >= tmpWTrack){
      stato = 4;
    }
  }
  activeSensor = 0.0;
  totalSensor = 0.0;


praticamente se la activeSensor è uguale a zero salto la divisione e ci riprovo il giro dopo.
Se questo accade per x volte camio stato e blocco i motori.

Ora ho solo il problema di trare sto cazzo di PID. (il PID l'ho scritto io...non ho usato la libreria..)
E' veramente complicato trovare il giusto modo per avvicinarsi ai valori corretti...
Anche qui, se c'è qualche guru e mi può dare qualche dritta....  :smiley-red: :smiley-red:

nid69ita

Sorry, sul PID non ti sò aiutare. Pazienta, qualcuno ti aiuterà.
my name is IGOR, not AIGOR

Go Up