Guider un quadrirotor vers une cible

9

Je travaille sur un quadrirotor. Je connais sa position - , où j'aimerais aller - la position cible b , et à partir de là je calcule un vecteur c - un vecteur unitaire qui m'amènera à ma cible:abc

c = b - a
c = normalize(c)

Puisqu'un quadrotor peut se déplacer dans n'importe quelle direction sans rotation, ce que j'ai essayé de faire est

  1. faire pivoter par l'angle de lacet du robotc
  2. le diviser en ses composants x,y
  3. passez-les au robot sous forme d'angles de roulis et de tangage.

Le problème est que si le lacet est de 0 ° ± 5, cela fonctionne, mais si le lacet est proche de +90 ou -90, il échoue et se dirige dans de mauvaises directions. Ma question est-ce que je manque quelque chose d'évident ici?

Hamza
la source
1
Comment calculez-vous l'angle de lacet? De plus, quel contrôleur utilisez-vous et comment envoyez-vous les données?
DaemonMaker
Question intéressante @Hamza, bienvenue en robotique .
Mark Booth
@Hamza, quelle langue et quel système utilisez-vous? Je travaille également sur un quadcopter avec Atmega328 et le langage de programmation Ada. Si vous avez un blog sur le projet, veuillez le partager.
Vous avez raison @MarkBooth, j'avais deux onglets ouverts et j'avais l'intention de marquer l'autre post comme doublon. J'ai marqué celui-ci par erreur et n'ai vu aucun moyen de le défaire. Étant donné qu'il faut plus d'un vote pour le fermer, je me suis dit que ce ne serait pas un problème. Je ne savais pas cependant qu'il avait publié un commentaire en mon nom.
DaemonMaker
Pas de problème @DaemonMaker ces choses se produisent. Fermer, car les votes en double publient désormais automatiquement des commentaires, ce qui, à mon avis, est utile car il invite les gens à examiner l'autre question avant de voter eux-mêmes.
Mark Booth

Réponses:

6

En réimplémentant votre solution, j'obtiens ceci:

Angle entre les vecteurs

Tout d'abord, vous voulez l'angle entre les points A et B - pas spécifiquement le vecteur unitaire. Angle entre 2 points

θ=math.atan2(BxAx,ByAy)

Angle de lacet du véhicule

ψθ

Heading vs Yaw

y

Rose des Vents

x

Graphique polaire

Le chevauchement de 90 degrés entre ces mesures, combiné à l'ajout (au lieu de soustraire) le lacet du véhicule du lacet souhaité, peut être la raison pour laquelle les choses fonctionnaient lorsque votre cible était à ± 5 ° et se comportait mal à ± 90 °.

Conversion en composantes X et Y

(θψ)xy

Contrôle PID

Vous pouvez être mieux servi en utilisant des boucles de contrôle PID pour le roulis et le tangage du véhicule. Autrement dit, une fois que vous avez corrigé votre code et que vous êtes en mesure d'atteindre votre cible, je suppose que vous commencerez à le dépasser à la place - oscillant d'avant en arrière. Un PID correctement réglé empêchera cela de se produire tout en vous permettant d'approcher rapidement la cible.

xy

Ian
la source
C'est une modification là-bas, plus de 90% et change totalement la réponse (du PID à ATAN2). Mais vos compétences de formule graphique flashy sont bêtes!
Spiked3
Je recommande toujours le PID (il est là en bas), je viens de parcourir la première partie de la question pour m'assurer que mes hypothèses étaient correctes. Les formules graphiques font partie du formatage Latex, ce qui mérite d'être vérifié.
Ian
"le cap de la boussole commence à partir de l'axe y positif et augmente dans le sens horaire, tandis que le lacet commence à partir de l'axe x positif et augmente dans le sens antihoraire" référence? "conversion de la composante x de (θ − ψ) en roll et de la composante y en pitch" Je ne comprends pas du tout - plus d'explications s'il vous plaît (il me manque quelque chose).
Spiked3
La question initiale mentionnait "le passage [des composantes x et y] au robot en tant qu'angles de roulis et de tangage", ce qui pour moi indique que le quadcopter se déplace d'un côté à l'autre en changeant l'angle de roulis, et en avant et en arrière en changeant l'angle de tangage. J'ajouterai un peu de clarté.
Ian
soigné. Je ne l'ai jamais vu ainsi. J'ai vu et fais moi-même juste retourner cos / sin pour obtenir les mêmes résultats. Je vais devoir réfléchir un peu plus sur le roulis / pitch. Oui, cela provoquerait un mouvement, mais je ne sais pas comment cela a quelque chose à voir avec où vous êtes et où vous allez, à part la vitesse à laquelle vous y arrivez. Merci.
Spiked3
5

Je suppose que vous parlez d'un vecteur 3D ici. Pouvez-vous simplement généraliser normalize()comme ça? Est-ce si courant (je ne l'ai jamais vu alors si c'est le cas, alors nouvelles pour moi). Sinon, des problèmes évidents d'enveloppe de boussole s'appliquent à chacun des composants X et Y. Pourquoi ne pas les appeler roulis et / ou tangage et / ou lacet? (mélanger la nomenclature 3D et 2D confond la question).

Ma normalisation 2D ressemble à ceci;

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);
}

S'il s'agit bien d'un quad, je suppose que vos composants X et Y sont vraiment YAW, Altitude ((X, Y) & Z). Vous devrez gérer le YAW(X, Y)2D, et simplement baisser ou gagner de l'altitude pour Z (et encore une fois, c'est pourquoi je soupçonne que normaliser est plus que ce que vous avez).

Spiked3
la source