¿Los cálculos del ángulo de giro no son precisos?

2

Estoy usando este Gyro LISY300AL: DataSheet

Pero no puedo obtener datos precisos ...

Aquí está mi cálculo:  

    sensitivity = 0.716454545;
    gyroAdc = analogRead(0);
    if(abs(gyroAdc - gyroZero) <= Threshold)
      gyroAdc = gyroZero;
    gyroRate = (gyroAdc-gyroZero)/sensitivity;
    gyroRotation=gyroRotation+gyroRate*dtime1/1000;
    gyroAngle = abs((gyroRotation - 360 * ceil(gyroRotation / 360))); // Round up between 0-360
    dtime = millis() - stime; // millis() is the milliseconds since my controller started
    stime = millis();

No obtengo un ángulo preciso, muevo mi objeto 90 grados pero el giroscopio se desplaza demasiado, por lo que muestra otra cosa ...

Tal vez estoy haciendo algo mal? ¿O simplemente debería agregar un acelerómetro para hacerlo más preciso?

    
pregunta Danpe

2 respuestas

1

No miré su hoja de datos, pero los giroscopios baratos (no 10s de miles de $) obtienen inherentemente una señal proporcional a la tasa de giro. Para obtener el ángulo, este debe ser integrado. Cualquier error en la señal de velocidad se acumula con el tiempo. Los giroscopios MEMS baratos tienen deriva y precisión, por lo que el ángulo no tiene ningún significado después de unos segundos.

Los giroscopios mecánicos reales funcionan según un principio totalmente diferente que mantiene el eje apuntando en la misma dirección. Por lo tanto, estos proporcionan salidas de ángulo verdaderas, no tasa de cambio de ángulo, por lo que son más útiles para la navegación inercial.

Los acelerómetros pueden proporcionarle una magnitud de ángulo absoluta con respecto a la gravedad si sabe que el objeto no está acelerando de otro modo. Sin embargo, eso es sólo un ángulo con respecto a abajo. No te ayudarán a determinar el ángulo de giro hacia los lados, por ejemplo.

    
respondido por el Olin Lathrop
0

Para evitar esta deriva en mi giro, agregué las declaraciones de if para filtrar la deriva. Algo como esto:

if(abs(degrees(gyroRate[XAXIS]))>0.5) 
    rollAngle += degrees(gyroRate[XAXIS])*timeDiff/1000.00; 
if(abs(degrees(gyroRate[YAXIS]))>0.5) 
    pitchAngle += degrees(gyroRate[YAXIS])*timeDiff/1000.00; 
if(abs(degrees(gyroRate[ZAXIS]))>0.5) 
    yawAngle += degrees(gyroRate[ZAXIS])*timeDiff/1000.00;

Entonces, cuando la velocidad del giro es menor que +/- 0.5 (la desviación habitual de los giroscopios) no actualizará el ángulo.

    
respondido por el XOZIP

Lea otras preguntas en las etiquetas