Imaginez un "drone" et un point cible sur un avion 2D. Il y a huit paramètres:
P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque
(nous dirons simplement que la cible est immobile)
Le travail du drone consiste à atteindre la cible le plus rapidement possible, en respectant le couple et la poussée maximum. Il n'y a que deux façons d'appliquer le couple, car ce n'est que dans un plan 2D. La poussée est limitée à une seule direction par rapport à l'orientation de l'engin et ne peut pas être dirigée sans faire tourner le drone. Négligez toute résistance, vous pouvez simplement prétendre qu'elle flotte dans l'espace extra-atmosphérique 2D. Supposons que le drone vérifie une équation à un intervalle de temps t
(peut-être quelque chose comme toutes les 0,01 secondes), branche les paramètres et ajuste son couple et sa poussée en conséquence. Quelles devraient être les équations de poussée et de couple?
Réponses:
À la lumière du contexte de votre question, http://nodewar.com/ , il existe quelques considérations spécifiques pour votre solution:
Ces méthodes sont ce que j'ai décidé de travailler pour atteindre l'accélération souhaitée.
Accélération, pas vitesse
Parce que vous avez déjà une vitesse donnée et que votre cible se déplace, vous n'avez pas besoin de poussée vers un point. Vous avez besoin de poussée pour changer votre vitesse à ce qu'elle devrait être. Cela signifie que votre vaisseau ne doit pas pointer vers où il va, mais dans la direction dans laquelle il devrait accélérer.
Direction vers le bon cap
Vous avez un vecteur d'accélération, vous voulez maintenant l'appliquer. Déterminez jusqu'où vous devez tourner. J'ai probablement utilisé plus d'étapes que nécessaire ici, mais les coordonnées de rotation me confondent, et je pense que la valeur de rotation du navire non plafonnée est de toute façon un bug dans l'API.
Une formule simple. Il n'y a aucun mal à tourner tout le temps, alors ne vous embêtez pas à appliquer des valeurs de couple partielles. Si vous avez besoin d'une petite correction de la vitesse angulaire, vous pouvez de toute façon effectuer cette détermination plusieurs fois par seconde.
Une formule moins simple. Il arrivera un moment où vous ne voudrez plus continuer à tourner, car vous voudrez éventuellement vous arrêter. Heureusement, ce plafond de vitesse angulaire signifie que vous pouvez rapidement ralentir de la vitesse angulaire maximale à zéro. Il vous suffit de calculer quand le faire.
Après avoir modifié le code ci-dessus pour l'adapter à vos besoins, votre vaisseau devrait rapidement et précisément pivoter dans l'angle que vous lui avez donné pour cibler.
Vitesse de battage
Alors, quand pousser? Encore une fois, le changement rapide de la cible et d'autres facteurs créent une grande difficulté à résoudre une solution exacte. N'essayez pas.
Pour les cas où vous avez besoin d'une poussée partielle, vous pouvez à nouveau compter sur le fait que vous pouvez choisir entre 0 et 1 poussée plusieurs fois par seconde. Cela vous donne une poussée partielle efficace sans faire varier la valeur réelle.
Bonne chance!
la source
Une question similaire, avec quelques bonnes réponses, y compris le nom apparent de tout ce sujet, "motion planning":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics
En tant que programmeur, j'aime l'aspect pratique de la suggestion de user470365. Cependant, je vais essayer une approche plus rigoureuse. Ma suggestion ici calcule un plan complet au début, mais je suppose que vous pourriez réévaluer aussi souvent que vous le souhaitez si les paramètres changent.
Le plan
Détails
Je suggère des méthodes itératives pour trouver d et t :
En supposant qu'il n'y ait pas de poussée, parcourez la future trajectoire du drone à l'aide d'une boucle et d'un petit pas de temps:
Nous avons maintenant trouvé d et t .
Tournant
Quand je dis "tourner à d ", je veux dire vraiment, "faire une séquence de couples de telle sorte que nous tournons à d le plus rapidement possible tout en ramenant la vitesse angulaire à zéro". Il y a probablement une équation pour cela impliquant la direction actuelle, la vitesse angulaire actuelle et l'accélération angulaire maximale, mais elle est compliquée par le comportement d'angle des angles.
la source