Qu'est-ce qu'un combattant a en commun avec un conteneur de stockage de liquide et une machine Goldberg? Il semblerait seulement que l'avion et le canon puissent faire partie d'un mécanisme inutile, mais envoûtant, mais non. Le modèle de baril de voltige combine toutes ces choses et plus encore.

L'exécution du canon n'aide pas l'avion civil à amener ses passagers à destination ou le chasseur au combat, mais il nécessite, s'il est correctement exécuté, d'utiliser toutes les commandes de l'avion: ailerons, gouverne de profondeur et gouvernail.
Cette publication décrit le processus de rotation d'un avion à 360 degrés autour de son axe longitudinal sans réduction du point de vue d'une science telle que la dynamique de vol, et décrit comment vous pouvez faire en sorte que votre avion fasse correctement un baril.
Présentation
Après avoir terminé la phase active du prochain projet, une question s'est posée avec mon collègue dans les activités sans pilote, que faire jusqu'à ce que les nouveaux projets occupent tout mon temps libre. En réponse à la question posée au vide, nous avons reçu une réponse très précise: «
faites un tonneau ». Et la vérité: le canon est une machine Goldberg en aviation, à la fois complexe, pratiquement (en combat aérien) une figure acrobatique inutile qui apporte un plaisir exclusivement esthétique. Alors pourquoi ne pas apprendre au modèle d'avion à fabriquer un baril en mode automatique, même
Google le fait.
Avant de commencer l'implémentation pratique, nous avons décidé d'étudier ce processus à l'aide de modèles informatiques, et voici ce qui en est ressorti.
Un peu de théorie
Tout d'abord, expliquons un peu pourquoi les avions volent et comment la position de l'avion est décrite par rapport au champ gravitationnel. L'avion tient la portance dans l'air, appelons-le Y, qui est créé sur l'aile, mais voici le problème, cette force n'apparaît que lorsque l'aile est soufflée par un flux d'air entrant, vous devez donc disperser l'avion. Vous pouvez, bien sûr, «fuir la falaise», dépenser une partie de l'énergie potentielle du champ gravitationnel de la Terre pour accélérer et même geler pendant un instant, mais la traînée aérodynamique se produit inextricablement avec la force de levage, appelons cette force X, qui ralentira l'avion, et la force de levage tombera, et avec elle nous. Nous tomberons sous l'influence de la gravité G. Pour contrer la force de traînée, tous les avions normaux ont un moteur, cela crée une force de poussée P, qui peut être utilisée pour surmonter la force de traînée. Le modèle cinématique le plus simple d'un avion décrit son mouvement comme un déplacement d'un point matériel dans le champ gravitationnel de la Terre. En vol horizontal à vitesse constante, la gravité est équilibrée par la portance de l'aile Y = G, et la traînée par la poussée du moteur X = P.
Si vous regardez un point matériel sous un microscope, il se transformera en corps matériel. C’est pour le mieux: on distingue le fuselage, l’aile, la queue de l’avion, qui se compose d’un stabilisateur horizontal et d’une quille verticale. Les ailerons sont situés sur les consoles des ailes gauche et droite, la gouverne de profondeur sur la queue horizontale et le gouvernail sur la verticale. Si vous tournez fort avec tout cela, l'appareil commencera à manœuvrer et la tâche de fabriquer un baril sera réduite à la loi de changer la position des commandes pour atteindre la trajectoire nécessaire de l'appareil dans l'espace et par rapport à ses propres axes.
Description des systèmes de coordonnées utilisés pour décrire le mouvement des aéronefs.Dans la tradition russe / soviétique, le système de coordonnées (SK), rigidement lié à l'avion, est introduit comme suit. L'axe des x est dirigé longitudinalement dans le plan de symétrie de l'avion, de la queue au nez. L'axe y est introduit perpendiculairement à cet axe. Ces deux axes sont complétés par le triple droit des vecteurs par l'axe z. Il s'avère que l'axe z passera le long de l'aile droite.
Le mouvement d'un appareil dans l'espace ne peut pas être décrit uniquement à l'aide d'un système de coordonnées connecté à un avion, car nous nous intéressons à la position de l'appareil par rapport à la Terre. Pour ce faire, un système de coordonnées appelé "système de coordonnées terrestre local" est introduit. L'axe X de ce système est dans le plan horizontal et est dirigé vers le nord géographique. L'axe Y est dirigé verticalement vers le haut. L'axe Z les complète au triple droit des vecteurs. L'emplacement du système de coordonnées associé par rapport au système terrestre local est déterminé par les angles de roulis, de tangage et de lacet. L'angle entre l'axe longitudinal de l'avion (dans notre cas, l'axe x du SK connecté) et le plan horizontal XZ est appelé angle de tangage, il change lorsque l'ascenseur dévie. L'angle entre l'axe z du SK associé et l'axe Z du SC terrestre local, tourné de manière à ce que l'angle de lacet soit nul, est appelé angle de talon, il change avec les ailerons déviant. L'angle entre l'axe X de la SK locale de la Terre et la projection de l'axe x de la SK connectée sur le plan horizontal XZ est appelé angle de lacet, compté dans le sens antihoraire à partir de l'axe X de la SK locale de la Terre. Une telle formalisation devrait nous suffire pour décrire le mouvement de l'aéronef lors de l'exécution du canon, et laissez-nous, nous n'utilisons pas les désignations des lettres des axes plus loin, il est toujours utile de répéter les bases.

Boîte à outils
Pour simuler le mouvement de l'appareil, nous utilisons les outils
fournis par le programme de modélisation de la dynamique des aéronefs avec
JSBSim open source. Nous ferons confiance Ă
gnuplot pour afficher les graphiques et les manœuvres de visualisation des avions
FlightGear . Comme modèle dynamique de base, prenez le
chasseur nord-américain P-51 Mustang : sa maniabilité suffira à porter le canon. Pour la visualisation, nous utiliserons un avion de sport moins agressif
Yak-53 .
Description du processus de configuration et de sortie du programme.Tous les fichiers nécessaires à l'exécution des scripts se trouvent dans le
référentiel Github. Pour répéter les étapes de cet article, nous devons installer
JSBSim ,
FlightGear et
gnuplot . Toutes les actions seront données pour le système d'exploitation Windows. Basé sur les instructions
d'ici . Téléchargez et installez la dernière version de
FlightGear sur
www.flightgear.org et
gnuplot sur
www.gnuplot.info . Nous collectons
JSBSim conformément aux
instructions . Après cela, nous recherchons deux catalogues nécessaires pour nous.
Répertoires racine
JSBSim \ et
FlightGear \ . Le répertoire
FlightGear \ data \ Aircraft contient des dossiers avec des modèles d'avion: vous devez y copier le modèle, qui sera utilisé pour la visualisation. J'utilise le modèle
Yak-53 que j'ai trouvé sur Internet. D'autres modèles peuvent être trouvés
ici . Le
répertoire FlightGear \ bin contient le fichier exécutable principal du simulateur
fgfs . Pour visualiser la dynamique, nous utiliserons la ligne de lancement
fgfs --native-fdm=socket,in,60,,5500,tcp --fdm=external --timeofday=noon --aircraft=Yak-53 --disable-sound --disable-real-weather-fetch --disable-clouds3d --disable-clouds
Sur cette ligne, les premiers paramètres indiquent la source externe de données sur la dynamique de l'avion au démarrage du simulateur. Le paramètre
avion définit le modèle souhaité du véhicule. D'autres paramètres sont facultatifs, leurs valeurs peuvent être trouvées
ici . Raccourcis clavier utiles:
«V» - changer la vue du modèle
Shift + Esc - redémarrez FlightGear avec l'enregistrement des paramètres de ligne de commande
Ctrl + "R" - commencez à enregistrer un vol pour répéter ce qui s'est passé.
C'est tout ce dont nous avons besoin dans le simulateur
FlightGear . Revenons au programme de modélisation dynamique
JSBSim . Le
répertoire JSBSim \ aircraft contient des modèles d'avion dynamiques. Le
répertoire JSBSim \ engine contient des modèles dynamiques de moteurs et de vis. Les modèles d'avion dynamiques sont stockés dans des répertoires séparés dans des fichiers de
nom de formulaire
* .xml . À la fin de chaque fichier, il y a une section responsable du type de données de sortie lors de la modélisation. Si nous voulons que la sortie soit sous une forme adaptée à la visualisation dans
FlightGear , elle devrait ressembler Ă ceci:
<output name="localhost" type="FLIGHTGEAR" port="5500" rate="60"/>
Si nous voulons enregistrer des données dans un fichier, alors comme ceci:
<output name="p51d.csv" rate="60" type="CSV"> <property> velocities/vc-kts </property> <property> aero/alphadot-deg_sec </property> <property> aero/betadot-deg_sec </property> <property> fcs/throttle-cmd-norm </property> <simulation> OFF </simulation> <atmosphere> OFF </atmosphere> <massprops> OFF </massprops> <aerosurfaces> ON </aerosurfaces> <rates> ON </rates> <velocities> ON </velocities> <forces> OFF </forces> <moments> OFF </moments> <position> ON </position> <coefficients> OFF </coefficients> <ground_reactions> OFF </ground_reactions> <fcs> ON </fcs> <propulsion> OFF </propulsion> </output>
Il est pratique de
démarrer le processus de simulation en utilisant le fichier batch situé dans le dossier racine de
JSBSim \ avec la ligne
JSBtest.bat *_
avec contenu
Ce fichier supprime les résultats de simulation précédents, exécute le script situé dans
\ JSBSim \ aircraft \ p51d \ scripts \ , puis commence à dessiner les données reçues à l'aide de gnuplot. Le paramètre en
temps réel doit être spécifié lorsque vous souhaitez recevoir des données de
JSBSim en temps réel, par exemple, lors du rendu dans
FlightGear .
Regardons le contenu du fichier de script:
<?xml version="1.0" encoding="utf-8"?> <runscript> <use aircraft="p51d" initialize="scripts/airborne"/> <run start="0" end="5" dt="0.0166666"> <event name="Trims"> <condition> sim-time-sec ge 0.0 </condition> <set name="simulation/do_simple_trim" value="1"/> </event> <event> <condition> sim-time-sec ge 0.5 </condition> <set name="fcs/aileron-cmd-norm" value="1"/> </event> <event> <condition> sim-time-sec ge 2.95 </condition> <set name="fcs/aileron-cmd-norm" value="0"/> </event> </run> </runscript>
Pour le lancement correct, la troisième ligne indique le modèle de l'avion à modéliser, et le chemin vers le fichier d'initialisation avec le contenu
<?xml version="1.0" encoding="utf-8"?> <initialize name="airborne"> <running> -1 </running> <altitude unit="FT"> 325.0 </altitude> <vc unit="KTS"> 210.0 </vc> <latitude unit="DEG"> 42.3769 </latitude> <longitude unit="DEG"> -70.9993 </longitude> </initialize>
Il ne reste plus qu'à considérer le contenu du fichier pour le traçage via
gnuplot :
set autoscale
Ce fichier génère et affiche une image sur l'écran de trois graphiques: angle de roulis, tangage et hauteur en fonction du temps. Les données de construction sont extraites du fichier
* script_name.csv . En cours de route, les unités impériales sont converties en unités métriques habituelles. Vous pouvez modifier le fichier pour une sortie au
format PostScript ,
PNG ou
PDF en décommentant les lignes correspondantes.
Voici, en général, l'ensemble du processus de préparation d'outils pour l'auto-modélisation et l'affichage des mouvements des avions.
Modélisation et résultats
Si nous imaginons un avion «sphérique», ou plutôt idéal, dans lequel les axes du système de coordonnées associé coïncident avec les axes principaux de l'ellipsoïde d'inertie et les commandes créent des moments chacun par rapport à un seul des axes, nous pouvons qualitativement comprendre comment l'appareil se déplacera lorsque la commande déviera. Disons qu'un avion vole en vol horizontal; en déviant les ailerons dans des directions opposées, nous modifions l'amplitude de la force de levage sur les consoles d'ailes, ce qui entraîne l'apparition d'un moment de force par rapport à l'axe x, et l'appareil commencera à tourner autour de cet axe. Pour compléter le canon, c'est exactement ce dont nous avons besoin. Nous composons un script dans lequel les ailerons sont rejetés autant que possible dans un délai de 2,45 secondes, puis revenons à leur position d'origine:
Le contenu du script. <?xml version="1.0" encoding="utf-8"?> <runscript> <use aircraft="p51d" initialize="scripts/airborne"/> <run start="0" end="5" dt="0.0166666"> <event name="Trims"> <condition> sim-time-sec ge 0.0 </condition> <set name="simulation/do_simple_trim" value="1"/> </event> <event> <condition> sim-time-sec ge 0.5 </condition> <set name="fcs/aileron-cmd-norm" value="1"/> </event> <event> <condition> sim-time-sec ge 2.95 </condition> <set name="fcs/aileron-cmd-norm" value="0"/> </event> </run> </runscript>

Les résultats de la simulation sont présentés dans le graphique:

On peut voir que l'avion a tourné à 360 degrés le long du rouleau, cependant, a fait cette manœuvre avec une diminution de 40 mètres et a incliné son nez de 14 degrés - ceci est un exemple de canon complètement inapte.
En effet, si vous vous souvenez que l'avion de loin est un point matériel, alors pendant la rotation la projection de la force de levage sur le sens de la gravité diminue et l'avion commence à décliner, mais nous n'en avons pas besoin du tout, car nous voulons faire un beau baril sans goutte. Pour cela, avant de commencer à rejeter les ailerons, vous devez créer une réserve de vitesse verticale. Nous prenons la barre sur nous-mêmes - l'ascenseur est dévié - un moment de force survient par rapport à l'axe z. Le nez de l'avion se lève et nous commençons à prendre de la hauteur - à ce moment, il est temps de commencer la rotation. Nous ajoutons au script la déviation de la gouverne de profondeur de 40% pendant 0,4 seconde avant le début de la déviation des ailerons et la remettons en position neutre. 0,2 secondes avant la fin de la rotation, nous prenons le gouvernail complètement vers nous pour éliminer l'abaissement du nez de l'avion:
Le contenu du script. <?xml version="1.0" encoding="utf-8"?> <runscript> <use aircraft="p51d" initialize="scripts/airborne"/> <run start="0" end="5" dt="0.0166666"> <event name="Trims"> <condition> sim-time-sec ge 0.0 </condition> <set name="simulation/do_simple_trim" value="1"/> </event> <event> <condition> sim-time-sec ge 0.1 </condition> <set name="fcs/elevator-cmd-norm" value="-0.4"/> </event> <event> <condition> sim-time-sec ge 0.5 </condition> <set name="fcs/aileron-cmd-norm" value="1"/> <set name="fcs/elevator-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 2.75 </condition> <set name="fcs/elevator-cmd-norm" value="-1"/> </event> <event> <condition> sim-time-sec ge 2.95 </condition> <set name="fcs/aileron-cmd-norm" value="0"/> <set name="fcs/elevator-cmd-norm" value="0"/> </event> </run> </runscript>

Nous regardons ce qui s'est passé:

Le voici - un canon très décent et rapide. Si nous remettions l'ascenseur en position neutre un peu plus tard, l'appareil gagnerait une petite hauteur et, une fois les ailerons déviés, entrerait dans un demi-tour. La combinaison de la «direction vers vous» et de la «déviation des ailerons» conduit au fait que la force de levage de l'aile lorsque l'appareil est incliné commence à agir normalement par rapport à la trajectoire actuelle de l'appareil et la plie d'autant plus, plus l'ascenseur est dévié. Vous pouvez l'essayer vous-même et voir par vous-même.
Le canon précédent a été réalisé sans réduction, l'angle de tangage à la sortie du canon ne différait pas beaucoup de l'original. Cependant, la hauteur lors de l'exécution a changé de 12 mètres. Nous allons essayer d'appliquer plus activement les contrôles pour minimiser le lancer en hauteur lors de l'exécution de la figure. Afin de ne pas tordre les commandes de l'avion de toute façon, regardons
Wikipédia et voyons comment il nous est recommandé de fabriquer un baril. L'idée principale de faire un baril idéal est que vous devez garder l'axe longitudinal du plan dans un plan horizontal. Pour cela, l'ascenseur et le gouvernail sont utilisés alternativement. Au début du canon, comme d'habitude, nous utilisons l'ascenseur pour gagner en vitesse verticale. Nous rejetons les ailerons - nous commençons la rotation. Lorsque l'avion tourne autour de l'axe longitudinal, l'élévateur et le gouvernail changent de place. En atteignant un angle de roulis d'environ 90 degrés, la déviation du gouvernail entraînera une élévation ou une baisse du nez de l'avion dans un plan vertical. À cet égard, nous rejetons le gouvernail afin d'empêcher le nez de tomber. De plus, lorsque l'angle de gîte atteint 180 degrés, vous devez dévier le gouvernail de vous-même afin de maintenir le nez de l'avion dans un vol inversé dans un plan horizontal. Avec un tour supplémentaire, nous répétons la déviation du gouvernail avec le signe opposé à un angle de talon proche de 90 degrés et terminons le canon avec une légère déviation du gouvernail «vers vous». Toutes ces étapes sont exprimées dans le script ci-dessous:
Le contenu du script. <?xml version="1.0" encoding="utf-8"?> <runscript> <use aircraft="p51d" initialize="scripts/airborne"/> <run start="0" end="10" dt="0.0166666"> <event name="Trims"> <condition> sim-time-sec ge 0.0 </condition> <set name="simulation/do_simple_trim" value="1"/> </event> <event> <condition> sim-time-sec ge 0.0 </condition> <set name="fcs/elevator-cmd-norm" value="-0.05"/> </event> <event> <condition> sim-time-sec ge 0.5 </condition> <set name="fcs/aileron-cmd-norm" value="1"/> </event> <event> <condition> sim-time-sec ge 0.6 </condition> <set name="fcs/elevator-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 1.4 </condition> <set name="fcs/rudder-cmd-norm" value="0.7"/> </event> <event> <condition> sim-time-sec ge 1.6 </condition> <set name="fcs/rudder-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 1.65 </condition> <set name="fcs/elevator-cmd-norm" value="0.5"/> </event> <event> <condition> sim-time-sec ge 2.35 </condition> <set name="fcs/elevator-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 2.6 </condition> <set name="fcs/rudder-cmd-norm" value="-1.0"/> </event> <event> <condition> sim-time-sec ge 2.8 </condition> <set name="fcs/rudder-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 2.75 </condition> <set name="fcs/elevator-cmd-norm" value="-0.4"/> </event> <event> <condition> sim-time-sec ge 2.95 </condition> <set name="fcs/aileron-cmd-norm" value="0"/> </event> <event> <condition> sim-time-sec ge 3.0 </condition> <set name="fcs/elevator-cmd-norm" value="0"/> </event> </run> </runscript>

Nous commençons et voyons ce qui s'est passé:

Sur le rouleau, l'appareil a tourné à 180 degrés, tandis que la portée totale du changement de hauteur était d'environ 2,5 m - c'est cinq fois moins que dans le cas précédent. Nous pouvons dire que nous avons obtenu un baril presque parfait.
Au lieu d'une conclusion
Nous avons donc examiné certains principes de la voltige en baril et nous sommes assurés que, en agissant sagement, nous pouvons effectuer un baril de bonne qualité sur le simulateur. Ce serait bien d'aller à la pratique, et ici avec l'aide de laquelle nous prévoyons de le faire - le modèle d'avion + stm32f103 + mpu9250. Tous ces articles sont facilement accessibles et bon marché, donc tout le monde peut essayer de le faire eux-mêmes. Les résultats des essais, erreurs et instructions de répétition font l'objet des publications suivantes.