MPU605; Cuadricoptero

Estoy montando un cuadricoptero en arduino y tengo un MPU6050, necesito ayuda me veo en un tunel sin salida.
Se leer los valores, se que tengo que hacer un filtro KALMAN (duda: para los 3 ejes o solo X e Y) y despues el PID que es donde me pierdo se para que sirve pero ni se hacerle ni encuentro un codigo mas o menos apto y nose como atacar a las ESC despues.

Mis motores son de 1200Kv y las ESC hasta 25A nose si necesitais mas datos. Tengo un pequeño video

El codigo KALMAN que e probado:
https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter/tree/master/IMU6DOF/MPU6050

Si almenos me podeis ayudar con algo en plan mira con los valores del kalman haces tal en el PID y despues lo que sea aunque sea poca cosa :disappointed_relieved:

gracias de antemano

PD: Espero no haber incumplido ninguna norma en el post jeje

Hola, como estai?

me pareció interesante tu post por 3 cosas:

  • Estoy trabajando en algo parecido y puedo usufructuar de lo que has avanzado en el MPU 6050 (jejeje)
  • Respecto de los filtros si nos vamos a topar con un problema similar, nos podemos ayudar... nota: un filtro de Kalman me parece un poco sofisticado (sin tener mayores antecedentes de lo que sale Gyroscopio) para filtro de datos.
  • Finalmente en los PID ahí si que soy bueno y te puedo ayudar. De hecho te agregue lo mas desarrollado que tengo que es un PI y funciona bastante decente. La D la verdad que me dio lata y no la implementé ya que probé lo que quería.

Antes de empezar con el PID, te quiero hacer un comentario:

  • Si es para una variable, es muy fácil. matriz ce 1x1
  • Si es para 3 variables, se puede tratar como 3 variables independientes (con sus riesgos) ya que igualas a 0 la interacción que pueda tener la una sobre la otras, que resulta matriz de 3x3 no diagonal.

Para ayudarte algo más:

  • Tienes conocimientos de básicos de calculo, Electrónica, control automático o algo así???? para adecuar el lenguaje.

Que es un controlador (regulador) PID ? es un controlador que trabaja en lazo cerrado luego el Error (E) (diferencia entre la referencia (R) y la salida (Y). Lo que genera una Actuacion (U) que puede ser un servo para arriba/abajo, más potencia al motor lo que sea.

Luego tienes:
E = R - Y
U = PID* E (es algo más que una multiplicación, pero te lo explico luego)
Y = TuDron * U

en palabras:
Voy a suponer que controlamos la altura de tu Dron, con la potencia de los motores, asumiendo que medimos de alguna manera y actuamos de alguna manera.

  • El error sera la diferencia entre la altura que seteaste y la altura medida. (supongamos que esta bajo la referencia)
  • este error se mete al bloque PID y se obtiene una actuación U (que en este caso será ponerle más potencia a los motores)
  • finalmente esta U cambio de potencia, actuará sobre tu Dron y subirá agrandando la Y y achicando el error.

Si se pasa funciona al revés.

Ahora el PID (proporcional, integrador y derivador)
su forma es:

U = Kp * E + (Kp/Ti) INT( E) + Kp*Td DER(v) //INT = integral DEV(derivada)

Para los que somos flojos
U = Kp * E + Ki INT( E) + Kd DER(v) (es mas fácil para el ajuste y te ahorras código si quieres que un modo no esté)

Como estos es digital hay que maestrear y el ideal es hacerlos a frecuencia fija (me imagino que lo estas haciendo) yo uso una librería que saque del foro MSTimer2 creo que se llama

En términos gruesos pero suficientes para un PI:

  • la Integral es INT(E)(n) = INT(E)(n-1) + E(n) * deltaT (o sea un acumulador)

para la D es un poco más complicado por los ruidos y me imagino que aquí entra el filtro famoso.

  • la derivada DEV(E)(n) = (E(n) - E(n-1))/deltaT

Si te fijas el ruido es te deja la escoba (si eres chileno) un Quilombo (si eres argentino) o un lio.

Como viste el PID tiene 3 modos:

  • P proporcional: el U es proporcional al error, luego necesita del error para hacer algo. Es importante ya que es el que actúa "primero" en teoría con Kp infinito error 0. Pero eso es teoría.

  • I Integrador: Es el que te permite tener error 0 y puede funcionar solo como Ki sin modo P, la gracia es que cuando el error es 0 este ha acumulado error y mantiene actuación (U) con E = 0.

  • D derivador: actúa con la tendencia del error. Luego ayuda a apurar cuando nos desviamos y a suavizar cuando llegamos cerca del Error 0. (es prescindible muchas veces).

ya... eso sería por ahora. Si te interesa te puedo seguir explicando, por que el PID tiene varios detallitos:

  • Estabilidad, que tiene que ver con que tan histérico son los parámetros, y el modelo de la planta (dron) si lo hay
  • Saturación (windup o enrrollamiento) que tiene que ver cuando la actuación (U) llega a su máximo y el integrador sigue acumulando error.
  • los retardos (no creo que aplique mucho en este caso)
  • Y el ajuste.

Saludos José Miguel
PD: si tienes algo de como preguntarle al MPU te lo agradecería y me ahorrarías algunas horas de investigación.

Test_PI_Com_04.rar (4.54 KB)

Jota1973:
Hola, como estai?

me pareció interesante tu post por 3 cosas:

  • Estoy trabajando en algo parecido y puedo usufructuar de lo que has avanzado en el MPU 6050 (jejeje)
  • Respecto de los filtros si nos vamos a topar con un problema similar, nos podemos ayudar... nota: un filtro de Kalman me parece un poco sofisticado (sin tener mayores antecedentes de lo que sale Gyroscopio) para filtro de datos.
  • Finalmente en los PID ahí si que soy bueno y te puedo ayudar. De hecho te agregue lo mas desarrollado que tengo que es un PI y funciona bastante decente. La D la verdad que me dio lata y no la implementé ya que probé lo que quería.

Antes de empezar con el PID, te quiero hacer un comentario:

  • Si es para una variable, es muy fácil. matriz ce 1x1
  • Si es para 3 variables, se puede tratar como 3 variables independientes (con sus riesgos) ya que igualas a 0 la interacción que pueda tener la una sobre la otras, que resulta matriz de 3x3 no diagonal.

Para ayudarte algo más:

  • Tienes conocimientos de básicos de calculo, Electrónica, control automático o algo así???? para adecuar el lenguaje.

Que es un controlador (regulador) PID ? es un controlador que trabaja en lazo cerrado luego el Error (E) (diferencia entre la referencia (R) y la salida (Y). Lo que genera una Actuacion (U) que puede ser un servo para arriba/abajo, más potencia al motor lo que sea.

Luego tienes:
E = R - Y
U = PID* E (es algo más que una multiplicación, pero te lo explico luego)
Y = TuDron * U

en palabras:
Voy a suponer que controlamos la altura de tu Dron, con la potencia de los motores, asumiendo que medimos de alguna manera y actuamos de alguna manera.

  • El error sera la diferencia entre la altura que seteaste y la altura medida. (supongamos que esta bajo la referencia)
  • este error se mete al bloque PID y se obtiene una actuación U (que en este caso será ponerle más potencia a los motores)
  • finalmente esta U cambio de potencia, actuará sobre tu Dron y subirá agrandando la Y y achicando el error.

Si se pasa funciona al revés.

Ahora el PID (proporcional, integrador y derivador)
su forma es:

U = Kp * E + (Kp/Ti) INT( E) + Kp*Td DER(v) //INT = integral DEV(derivada)

Para los que somos flojos
U = Kp * E + Ki INT( E) + Kd DER(v) (es mas fácil para el ajuste y te ahorras código si quieres que un modo no esté)

Como estos es digital hay que maestrear y el ideal es hacerlos a frecuencia fija (me imagino que lo estas haciendo) yo uso una librería que saque del foro MSTimer2 creo que se llama

En términos gruesos pero suficientes para un PI:

  • la Integral es INT(E)(n) = INT(E)(n-1) + E(n) * deltaT (o sea un acumulador)

para la D es un poco más complicado por los ruidos y me imagino que aquí entra el filtro famoso.

  • la derivada DEV(E)(n) = (E(n) - E(n-1))/deltaT

Si te fijas el ruido es te deja la escoba (si eres chileno) un Quilombo (si eres argentino) o un lio.

Como viste el PID tiene 3 modos:

  • P proporcional: el U es proporcional al error, luego necesita del error para hacer algo. Es importante ya que es el que actúa "primero" en teoría con Kp infinito error 0. Pero eso es teoría.

  • I Integrador: Es el que te permite tener error 0 y puede funcionar solo como Ki sin modo P, la gracia es que cuando el error es 0 este ha acumulado error y mantiene actuación (U) con E = 0.

  • D derivador: actúa con la tendencia del error. Luego ayuda a apurar cuando nos desviamos y a suavizar cuando llegamos cerca del Error 0. (es prescindible muchas veces).

ya... eso sería por ahora. Si te interesa te puedo seguir explicando, por que el PID tiene varios detallitos:

  • Estabilidad, que tiene que ver con que tan histérico son los parámetros, y el modelo de la planta (dron) si lo hay
  • Saturación (windup o enrrollamiento) que tiene que ver cuando la actuación (U) llega a su máximo y el integrador sigue acumulando error.
  • los retardos (no creo que aplique mucho en este caso)
  • Y el ajuste.

Saludos José Miguel
PD: si tienes algo de como preguntarle al MPU te lo agradecería y me ahorrarías algunas horas de investigación.

Oye jota también quiero hacer algo parecido con PID con sensores ultrasonicos...el Input seria la distancia medida del sensor...pero pongo ya la distancia medida? osea..Entrada=DistanceCmsensor...Esque en todos los
ejemplos que he visto sobre el pid la entrada la ponen asi : Entrada=analogoRead(Pin));? esque tengo la duda de si por ejemplo el sensor en analogico me arroja un valor de 900 a 15 Cm de distancia(Es un ejemplo y no se si se puede hacer asi) o nadamas poniendole asi: entrada=DistanceCmMedidos
Ref=30cm??

Mira en el subforo Hardware o proyectos que alguien esta con el mismo tema MPU6050 si mal recuerdo