Conversión de valores de giroscopio en bruto (L3GD20H) en ángulos

0

Según mi entendimiento, con el fin de convertir los valores brutos del giroscopio en ángulos. Primero debo multiplicar los valores sin procesar de cada eje con el nivel de sensibilidad.

Ejemplo:

// Convertir Gyro en bruto a grados por segundo

rate_gyr_x = (float) gyrRaw [0] * G_GAIN;

rate_gyr_y = (float) gyrRaw [1] * G_GAIN;

rate_gyr_z = (float) gyrRaw [2] * G_GAIN fuente: enlace

Y para calcular el ángulo, necesito multiplicar la velocidad con el período de bucle.

Ejemplo:

gyroXangle + = rate_gyr_x * DT;

gyroYangle + = rate_gyr_y * DT;

gyroZangle + = rate_gyr_z * DT;

fuente: enlace

Pero no entiendo por qué los valores de ángulo se agregan con valores anteriores.

En mi problema, intento escribir un código para equilibrar un péndulo invertido. Tengo un temporizador que interrumpirá el programa principal una vez cada 30 ms. Y una vez en cada 30 ms, ejecutaré una función para leer valores de giro y comparar el valor de lectura con referencia. En función de la diferencia, se ajustará la velocidad y la dirección del motor. Para obtener el ángulo de referencia y el ángulo de nueva lectura, he multiplicado los valores brutos del giroscopio con el nivel de Sensibilidad y multiplicado ese resultado con 0.03s (como mi período de bucle es de 30 ms) para obtener el valor del ángulo. Pero en el enlace de referencia que he proporcionado anteriormente, el autor ha agregado los ángulos. (Integrado en el tiempo). Solo multiplicando la velocidad (grados / seg) con el período de bucle se obtendrá el Ángulo, pero entonces ¿por qué tenemos que resumirlo? ¿hora? ¿Cómo puede usar este ángulo resumido para comparar con el ángulo de referencia? ¿Me estoy perdiendo de algo? por favor hágamelo saber.

    
pregunta priti

2 respuestas

1
  

Pero no entiendo por qué los valores de ángulo se agregan con valores anteriores.

Se agregan a los valores anteriores porque no son ángulos , sino que son velocidades angulares. El "giro" es, en términos propios, denominado sensor de velocidad angular: no puede medir ángulos absolutos, sino que mide la velocidad angular del sensor (qué tan rápido gira). Los valores sin procesar están en unidades específicas del sensor y se deben convertir a grados o radianes por segundo multiplicando con un valor de ganancia (G_GAIN, que determina a cuántos grados / radianes corresponde un "recuento" bruto) y el intervalo de muestreo (DT ) para que los datos sean útiles. En su código, esto se logra con:

inrate_gyr_x = (float) gyrRaw [0] * G_GAIN;
gyroXangle + = rate_gyr_x * DT ;

Así como es posible estimar la distancia recorrida en un automóvil dada la velocidad y el tiempo viajado, es posible estimar el ángulo actual del sensor midiendo la velocidad angular a lo largo del tiempo y sumando los resultados. Esta operación se denomina integración en matemáticas y es exactamente lo que hace el código con:

inrate_gyr_x = (float) gyrRaw [0] * G_GAIN;
gyroXangle + = rate_gyr_x * DT;

El código es como ahora está incompleto ya que no tiene en cuenta la deriva del giro. El sensor no es perfecto, y probablemente devolverá una velocidad angular distinta de cero incluso cuando está completamente estacionario. Esto debe contrarrestarse agregando un término de compensación a la velocidad angular medida antes de la integración, o el ángulo estimado se alejará del valor correcto incluso sin movimiento.

Además, la ganancia del sensor probablemente no sea exactamente la misma en el eje diferente debido al proceso de fabricación, etc. Si la ganancia es incorrecta, se puede registrar una rotación de 360 ° como, por ejemplo, 349 ° o 368 °. Para corregir esto, debe tener ganancias separadas para cada uno de los ejes, de modo que pueda ajustarlos de forma independiente.

Todo esto se tomaría en cuenta con el siguiente código:

rate_gyr_x = (float) gyrRaw[0] * G_GAIN_X;  
rate_gyr_y = (float) gyrRaw[1] * G_GAIN_Y;  
rate_gyr_z = (float) gyrRaw[2] * G_GAIN_Z;  
gyroXangle += rate_gyr_x * DT - est_drift_x;  
gyroYangle += rate_gyr_y * DT - est_drift_y;  
gyroZangle += rate_gyr_z * DT - est_drift_z;  
    
respondido por el jms
1

Tenga en cuenta que si bien velocidad angular está claramente definida, llevar estos valores a una representación de ángulo de Euler (alguna combinación de 3 ángulos) puede ser problemático debido al bloqueo del cardán problema.

En lugar de trabajar con ángulos, es beneficioso trabajar con cuaterniones . Si es así, hay una relación notable entre el vector de velocidad $$ \ mathbf {\ omega} = (\ omega_x, \ omega_y, \ omega_z), \ quad \ text {en rad / sec} $$ y el derivado de cuaternión: $$ \ frac {d \ mathbf {q}} {dt} = \ frac {1} {2} \ mathbf {\ omega} \ cdot \ mathbf {q}, $$ donde se debe tener en cuenta que el producto anterior es la regla de multiplicación de cuaternión

Busque quaternions en wikipedia: enlace

Para su problema, representaría la rotación de sus objetos utilizando los cuaterniones de 4 valores y actualizaría el cuaternión de acuerdo con (ignorando la deriva): $$ \ mathbf {m}: = \ text {quat_mul} (\ mathbf {\ omega}, \ mathbf {q}); \\ t: = \ text {time_now} (); \\ \ Delta t: = t - t_ \ text {last}; \\ t_ \ text {last}: = t; \\ q_x: = q_x + 0.5 \ times \ Delta t \ times m_x; \\ q_y: = q_y + 0.5 \ times \ Delta t \ times m_y; \\ q_z: = q_z + 0.5 \ times \ Delta t \ times m_z; \\ q_w: = q_w + 0.5 \ times \ Delta t \ times m_w; \\ (\ theta_x, \ theta_y, \ theta_z): = \ text {quat_to_angles} (\ mathbf {q}); $$

    
respondido por el Pål-Kristian Engstad

Lea otras preguntas en las etiquetas