Guiando un Quadrotor hacia un objetivo

9

Estoy trabajando en un quadrotor. Sé su posición, , a dónde me gustaría ir, la posición de destino b , y a partir de eso calculo un vector c , un vector unitario que me llevará a mi objetivo:abc

c = b - a
c = normalize(c)

Como un quadrotor puede moverse en cualquier dirección sin rotación, lo que he intentado hacer es

  1. gire por el ángulo de guiñada de los robotsc
  2. dividirlo en sus componentes x,y
  3. páselos al robot como ángulos de balanceo y cabeceo.

El problema es que si la guiñada es 0 ° ± 5, entonces esto funciona, pero si la guiñada está cerca de +90 o -90 falla y se dirige hacia direcciones equivocadas. Mi pregunta es ¿me estoy perdiendo algo obvio aquí?

Hamza
fuente
1
¿Cómo estás calculando el ángulo de guiñada? Además, ¿qué controlador está utilizando y cómo envía los datos?
DaemonMaker
Pregunta interesante @Hamza, bienvenido a Robotics .
Mark Booth
@Hamza, ¿qué idioma y sistema estás usando? También estoy trabajando en un quadcopter con Atmega328 y lenguaje de programación Ada. Si tienes un blog sobre el proyecto, compártelo.
Tienes razón @MarkBooth, tenía dos pestañas abiertas y tenía la intención de marcar la otra publicación como un duplicado. Marqué este por error y no vi forma de deshacerlo. Dado que se necesita más de un voto para cerrarlo, pensé que esto no sería un problema. Sin embargo, no me di cuenta de que publicó un comentario en mi nombre.
DaemonMaker
No hay problema @DaemonMaker estas cosas suceden. Cerrar como votos duplicados ahora publica automáticamente los comentarios, lo que creo que es una característica útil, ya que incita a las personas a revisar la otra pregunta antes de emitir un voto cerrado ellos mismos.
Mark Booth

Respuestas:

6

Al volver a implementar su solución, obtengo esto:

Ángulo entre vectores

Primero, quieres el ángulo entre los puntos UNA ysi , no específicamente el vector unitario. Ángulo entre 2 puntos

θ=metrounath.unatunanorte2(siX-UNAX,siy-UNAy)

Ángulo de guiñada del vehículo

ψθ

Encabezado vs Yaw

y

Rosa de los vientos

X

Gráfico polar

La superposición de 90 grados entre estas mediciones, combinada con la suma (en lugar de restar) la guiñada del vehículo de la guiñada deseada, puede ser la razón por la cual las cosas funcionaron cuando su objetivo estaba dentro de ± 5 ° y se comportó mal a ± 90 °.

Conversión a Componente X e Y

(θ-ψ)Xy componentes , pasándolos al robot como los ángulos de balanceo y cabeceo. Con las correcciones anteriores, debería obtener el resultado deseado en este punto. Sin embargo, mapear directamente estos componentes a los ángulos de inclinación puede ser problemático ya que solo está considerando la diferencia de posición y no la velocidad (realmente, el impulso) del vehículo.

Control PID

Puede ser mejor servido usando bucles de control PID para el balanceo y el cabeceo del vehículo. Es decir, una vez que arregle su código y pueda alcanzar su objetivo, supongo que comenzará a sobrepasarlo, oscilando de un lado a otro. Un PID sintonizado correctamente evitará que eso suceda mientras le permite acercarse rápidamente al objetivo.

Xy

Ian
fuente
Eso es algo de edición allí, más del 90% y cambia totalmente la respuesta (de PID a ATAN2). ¡Pero tus llamativas habilidades de fórmula gráfica son bestias!
Clavado3
Todavía recomiendo el PID (está allí en la parte inferior), solo trabajé en la parte inicial de la pregunta para asegurarme de que mis suposiciones eran correctas. Las fórmulas gráficas son parte del formato Latex, que vale la pena revisar.
Ian
"¿el rumbo de la brújula comienza desde el eje y positivo y aumenta en el sentido de las agujas del reloj, mientras que el guiñada comienza desde el eje x positivo y aumenta en el sentido contrario a las agujas del reloj"? "convertir el componente x de (θ − ψ) para rodar y el componente y para lanzar" No entiendo nada - más explicaciones por favor (me falta algo).
Clavado3
La pregunta original mencionaba "pasar [los componentes x e y] al robot como ángulos de balanceo y cabeceo", lo que para mí indica que el quadcopter se mueve de lado a lado al cambiar el ángulo de balanceo, y hacia adelante y hacia atrás al cambiar el ángulo de cabeceo. Agregaré algo de claridad.
Ian
ordenado. Nunca lo he visto así. He visto, y lo hago yo mismo, solo volteo cos / sin para obtener los mismos resultados. Tendré que pensar un poco más en el lanzamiento / lanzamiento. Sí, eso provocaría movimiento, pero no estoy seguro de cómo eso tiene algo que ver con dónde está y hacia dónde va, aparte de la velocidad a la que llega allí. Gracias.
Clavado3
5

Asumiré que estás hablando de un vector 3D aquí. ¿Puedes generalizar normalize()así? ¿Es tan común (nunca lo he visto, así que si es así, entonces noticias para mí). De lo contrario, los problemas obvios de ajuste de la brújula se aplican a cada uno de los componentes X e Y. ¿Por qué no llamarlos rodar y / o lanzar y / o guiñar? (mezclar nomenclatura 3D y 2D confunde la pregunta).

Mi normalización 2D se parece a esto;

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

Si de hecho es un quad, supongo que sus componentes X e Y son realmente YAW, Altitud ((X, Y) y Z). Tendrá que manejar el YAW(X, Y)en 2D, y simplemente dejar caer o ganar altitud para Z (y de nuevo por eso sospecho que normalizar es más de lo que tiene).

Claveteado3
fuente