SOMMAIRE

Introduction

ASPECT MÉCANIQUE

Forces exercées sur le drone
Forme des hélices
Définitions des mouvements selon les axes X,Y,Z
Montée & descente
Stabilité en vol stationnaire
Mouvement de tangage et de roulis
Mouvement de lacet

ASPECT MOTEUR DE JEU

Définition et première approche
Fonctionnalités

ASPECT RÉGULATION

But d'un asservissement
Fonctionnement général d'un asservissement
Type d’asservissement utilisé pour notre projet
Asservissement du drone dans Raydium

ASPECT MODÉLISATION

La modélisation graphique
La modélisation physique

Conclusion



INTRODUCTION

Le projet Polytech est un projet qui se déroule sur les deux années de PeiP (Parcours des Écoles d’Ingénieur Polytech). Le but est de travailler par groupe de trois ou quatre sur un sujet choisi au préalable afin d’apprendre à collaborer en équipe. En effet, savoir mener à bien une étude fait partie intégrante du métier d’ingénieur. Ainsi, le projet Polytech consiste en une première mise en situation de ce savoir-faire indispensable.

Dans notre cas, nous avons choisi le projet proposé par M. Laffont dont l’intitulé est le suivant :
Le Simulateur de drone.

L’objectif de ce projet est de modéliser le fonctionnement d’un drone dans un environnement virtuel à l’aide du logiciel Raydium. Ce travail implique différents aspects car avant de recréer un drone, il faut savoir comment celui fonctionne, c’est-à-dire connaitre les forces nécessaires à ses différents mouvements puis savoir traduire ces actions en language informatique. La modélisation 3D du drone fait également partie des tâches à effectuées.

Ce rapport sera découpé en 4 parties. Dans un premier temps, nous expliciterons concrètement l’aspect mécanique de ce projet, c’est-à-dire que nous étudierons quelles forces sont nécessaires pour qu’un drone décolle, vole, avance, recule, etc. Ensuite, nous nous attarderons sur la présentation d’un outil indispensable : le moteur de jeu. Pour continuer, nous développerons l’aspect régulation du projet, c'est-à-dire l'aspect programmation. Enfin, nous aborderons la modélisation du drone et des forces.


REMERCIEMENTS

Avant toute chose, nous tenons à remercier notre tuteur de projet Monsieur Laffont pour tous les bons conseils qu’il nous a prodigués. Il a contribué en grande partie à tous ce que nous avons réalisé et nous a permis de développer nos connaissances dans le domaine de la simulation informatique mais également dans l’approche du métier d’ingénieur.



ASPECT MÉCANIQUE

Tout d’abord, un drone est un aéronef dont le pilotage n’est pas effectué par un être humain à son bord mais par pilotage automatique ou télécommandé. Plusieurs usages sont possibles, allant de l’utilisation civile et récréative à une utilisation militaire.
De ce fait, il existe plusieurs modèles n’utilisant pas tous les mêmes procédés de vol. En effet, à l’inverse de drones militaire, les drones civils fonctionnent pour la plupart via un système de rotors.
Dans notre projet nous nous sommes donc attelés à modéliser un drone quadrirotor, il a alors fallu que nous nous intéressions dans un premier temps au fonctionnement réel de ces derniers. Ainsi, il a été nécessaire d’étudier plusieurs aspects physique en relation avec le drone afin de réaliser notre modélisation. Tout d’abord, il a été nécessaire de s’intéresser aux forces qui s’appliquent sur le drone du décollage à l’atterrissage. Ensuite, dans l’optique de mettre en mouvement le drone nous avons dûs étudier les différents mouvements réalisable par un drone afin de les transposer lors des simulations.

Forces exercées sur le drone :

Il existe plusieurs forces qui vont s’exercer sur le drone, parmi elles des forces générées par le drone lui même et d’autres extérieure à celui-ci. On compte alors quatre forces majeures interagissant avec le drone :

-la gravité (poids) est la force qui tend à ramener le drone au sol, plus le drone est lourd et plus l’attraction gravitationnelle sera importante.

-la portance correspond à la force de poussée générée par le drone, pour que celui-ci décolle elle doit alors être supérieure à la gravité.

-la traction, correspondant à la force qui fait avancer le drone par inclinaison de ce dernier

-la trainée, qui est la force s’opposant à la traction du fait de la résistance de l’air sur l’avancée du drone, elle agit comme un frottement.

Forme des hélices

Tout comme les avions, les drones utilisent la portance afin de décoller puis voler. En effet, d’après la Troisième Loi de Newton, “Tout corps A exerçant une force sur un corps B subit une force de même intensité, de même direction mais de sens opposée exercée par le corps B.”. Ici désignons l’hélice comme A et l’air comme B. A étant en mouvement (rotation) elle va rencontrer et dévier une masse d’air B. L’hélice, applique donc une force vers le bas sur l’air. En contrepartie l’air va appliquer une force d’intensité égale vers le haut qui va permettre, lorsque la vitesse des hélices sera suffisante, de faire décoller le drone.

Ainsi, la troisième loi de Newton justifie la forme inclinée des hélices du drone puisque cette inclinaison permet d’envoyer plus d’air vers le bas et donc de créer une force de portance plus importante.

Définitions des mouvements selon les axes X,Y,Z :

Intéressons nous maintenant aux différents mouvements du drone il convient alors dans un premier temps de définir les axes par rapport auxquels ils sont effectués.

Le tangage regroupe les mouvements faisant avancer reculer le drone par rotation autour de l'axe Y. Le Roulis lui, comporte les mouvements de déplacement du drone vers la gauche et vers la droite par rotation autour de l'axe X, tandis que le Lacet permet une rotation horizontale sur place autour de l’axe Z.

Ces notions vont nous permettrent de définir les différents mouvements basiques que peut effectuer un drone ainsi que leurs mise en oeuvre.

Ainsi, nous verrons par la suite qu’afin d’effectuer ces différents mouvements il est nécessaire de jouer sur la vitesse de rotation des hélices. Pour ce faire, chaque rotor est relié à un seul moteur ce qui permet à chaque hélice de tourner à des vitesses différentes les unes des autres. De ce fait, cela permet au drone de mieux répondre aux différentes contraintes qu'il subit mais également d'effectuer les divers mouvements autours des axes X,Y et Z.

Intéressons nous maintenant à la réalisation de ces différents mouvements.

Montée & descente :

Premièrement, afin que le drone puissent décoller les hélices doivent créer une force plus importante que celle générée par le poids du drone permettant ainsi son envol. A l’inverse, pour descendre toutes les hélices diminuent de vitesse, le drone descend alors car la force exercée par son poid devient supérieur à sa force d’élévation. Lors de la montée descente, toutes les hélices tournent à la même vitesse permettant d’avoir un unique mouvement selon l’axe Z.

Stabilité en vol stationnaire :

Dans la réalité, afin d’assurer une bonne stabilité les hélices sont placées symétriquement afin de ne pas créer de déséquilibres sur le drone. Ces dernières une fois en vol vont alors tourner à la même vitesse afin que chaque hélice génère la même force pour qu’une fois encore il n’y ait pas de déséquilibres. De plus, la bonne stabilité du drone sera également assurée par une inversion par paire du sens de rotation des hélices.

Ainsi, les hélices M1 et M3 tourneront dans le sens horaire tandis que M2 et M4 tourneront en sens anti-horaire.

Cela a pour effet d’annuler le couple créé par la rotation de chaque hélice. De ce fait, les forces faisant tourner le drone vers la droite sont compensées par celle le faisant tourner vers la gauche. En effet si toutes les hélices tournaient toutes dans le même sens alors le drone tournerait sur lui-même.

Mouvement de tangage et de roulis :

Pour que le drone avance et recul (mouvement de tangage) ou se déplace latéralement (mouvement de roulis) il faut créer une inclinaison du drone par rapport à l’horizontale. Afin de créer cette angle, il est nécessaire de diminuer la puissance des moteurs dans la direction de mouvement souhaitée et d’augmenter en parallèle la puissance des deux moteurs opposés afin de conserver la même altitude.

Une fois l’angle créé le drone avance dans la direction que l’on a choisie, à savoir celle où les rotors ont diminués de puissances. En effet, les forces créées par les hélices ne sont alors plus absolument verticales mais possèdent désormais une composante horizontale responsables du mouvement.

Mouvement de lacet :

Le mouvement de lacet simple va permettre au drone d’effectuer une rotation sur place vers la droite ou vers la gauche. Pour ce faire, il faut diminuer la puissance des deux moteurs dont les hélices tournent en sens opposé à la rotation souhaitée. En parallèle, on augmente la puissance des hélices qui elles tournent dans le même sens que la rotation à effectuer. Ainsi, pour effectuer une rotation horaire, il faut diminuer la puissance des rotors tournant dans le sens anti-horaires et augmenter ceux tournant dans le sens horaire et inversement.

Pour ce mouvement de lacet, on utilise le couple créé par la rotation des hélices afin de tourner. Initialement, ce couple est compensé par l’inversion du sens de rotation des hélices deux à deux, les hélices sur la même diagonales tournant dans le même sens. Ainsi, lorsqu’on diminue une paire d’hélices tournant dans le même sens, le couple associé créé par ces dernières diminue également. L’équilibre est rompu et le drone effectue une rotation sur lui même dans le sens de rotation des deux autres hélices ayant conservées leur puissance.

Maintenant que l'aspect mécanique du projet a été présenté, intéressons-nous à l'aspect moteur de jeu.



ASPECT MOTEUR DE JEU

Cette partie a pour objectif de présenter ce qu’est un moteur de jeu. En effet, la réalisation de notre projet aurait été impossible sans l’aide d’un tel outil étant donné nos faibles compétences de départ dans le domaine de la simulation informatique.

Définition et première approche

Un moteur de jeu est un outil informatique principalement utilisé dans le domaine du jeux vidéo. Il s’agit en fait d’un logiciel qui offre aux développeurs les fonctionnalités nécessaires à la création d’une application. De nos jours, l’utilisation d’un moteur de jeu par les studios de développement représente un gain de temps (et d’argent) car cela évite de devoir programmer un jeu de A à Z.
Ainsi, le moteur de jeu est en quelque sorte le « chef d’orchestre » d’une simulation car c’est lui qui gère et met en relation les différents domaines du jeu vidéo tels que la physique, l’audio, les entrées de l’utilisateur, l’éclairage de la scène, les animations etc. En fait, il est important de comprendre qu’un tel dispositif est la plupart du temps constitué d’une multitude de sous-moteurs commandant chacun un aspect du jeu.

Concrètement, l’objectif d’un moteur de jeu est de recréer les caractéristiques du monde réel (la gravité par exemple) dans un environnement virtuel. On en distingue deux types :

- Le moteur 2D qui offre un rendu en deux dimensions par empilement d’images matricielles. Une image matricielle est une image formée à partir d’un tableau dont les cellules représentent un point de l’image.

- Le moteur 3D qui utilise des calculs de projection pour obtenir des images en trois dimensions

Voici une liste des moteurs de jeu les plus répandus : Unreal engine, Open GL, Renderware etc.

Concernant notre projet, le moteur de jeu que nous avons utilisé s’appelle Raydium. Raydium est un moteur de jeu 3D qui permet de gérer la physique ainsi que d’autres aspect d’un jeu vidéo. Le principal avantage de Raydium est que ce moteur de jeu n’exige pas un important niveau de connaissance pour développer une application 3D. Son but est de permettre à des novices de s’entrainer à maitriser les fonctions de bases d’un jeu vidéo. Par exemple, un jeu complet peut tenir sur moins de 800 lignes de codes ce qui traduit bien sa simplicité.

Néanmoins, n’ayant jamais utilisé un tel outil nous avons dû nous renseigner sur les différentes fonctionnalités offertes par ce logiciel pour mener à bien notre projet.

Fonctionnalités

Dans cette sous-partie, nous allons détailler certains aspects gérés par le moteur de jeu. A savoir : les entrées / sorties, les mathématiques utilisées, la physique qui est un point très important de notre projet ainsi que la détection des collisions.

Les entrées et les sorties:
Lorsque l’on joue à un jeu vidéo, le moteur de jeu doit être en mesure d’interpréter ce que demande le joueur. Le fait d’appuyer sur une touche (joystick, clavier ou souris) doit provoquer une action bien spécifique comme une accélération, un décollage ou un tir.

Dans notre cas, le drone apparait au sol puis décolle pour se stabiliser à une certaine hauteur définit au préalable dans le programme. Ensuite, la fait d’appuyer sur la touche F2 le fait avancer. Une fois que l’utilisateur à relâcher le bouton F2 le drone s’arrête. L’idéal aurait été d’imposer une touche pour chaque action : décollage, avancer, s’arrêter, atterrissage.

Les mathématiques:
Dans un jeux vidéo, les mathématiques sont partout. Que ce soit pour la modélisation, l’affichage, le rendu, l’animation ou l’intelligence artificielle, les mathématiques sont indispensables.
Différentes branches sont utilisées : géométrie pour le placement des objets les uns par rapport aux autres, algèbre linéaire pour passer de la 3D à la 2D etc.

Parmi les opérateurs utilisés, on peut citer les matrices et les vecteurs. En général, une matrice de dimension trois sert à stocker l’orientation / position des objets. Chaque item est alors repéré selon son orientation/ position sur trois axes (x, y et z). Les vecteurs quant à eux sont utilisés pour modéliser tout type d’actions telles que des forces.

Il faut savoir qu’un moteur de jeu effectue énormément de calcul par seconde (produit scalaire, vectoriel et matricielle ainsi qu’inversion de matrice). C’est pourquoi les développeurs de jeux vidéo doivent être très attentifs lors de leur travail et être judicieux quant à leur choix d’opérations. En effet, des méthodes couteuses en calcul peuvent entrainer des ralentissements pendant l’exécution du jeux vidéo.

Afin de stabiliser le drone, nous avons mis au point un algorithme de régulation PID qui se base sur le principe de proportionnalité, d’intégration et de dérivabilité. Cet algorithme est détaillé dans la partie Aspect régulation.

La physique:
L’intérêt d’un moteur de jeu réside dans sa capacité à gérer la physique, c’est-à-dire sa façon de calculer comment les objets interagissent entre eux, comment ils bougent, comment ils rebondissent etc. Pour effectuer de tels calculs, distinguons trois sortes de physique :
`
- La physique du point : chaque objet est représenté par un seul et unique point. Ce point possède ses propres caractéristiques telles que sa vitesse, son accélération, son poids etc. Le principal avantage de la physique du point est sa simplicité. Son défaut : on se retrouve très vite limité surtout lorsque l’on cherche à agir sur l’orientation de l’objet en question.
Par exemple, pour simplifier les choses, on pourrait considérer notre drone comme un point dans l’espace. Pour le stabiliser en hauteur cela ne poserait pas de problème, par contre lorsque l’on cherchera à le faire avancer / tourner cela sera plus compliqué et moins réaliste. C’est pourquoi il est préférable de voir notre objet volant comme un système de 5 points : le corps auquel on ajoute les 4 hélices. Dans ce cas on ne parle plus de physique du point mais de physique des solides (ou des systèmes de points).

- La physique des solides : tous les objets sont associés à une forme géométrique simple (cube, sphère, cylindre etc.). Cela permet d’obtenir des résultats beaucoup plus réalistes car on peut également influer sur l’orientation spatiale des objets en question. Sous Raydium, le moteur de physique du solide utilisé est ODE (Open Dynamics Engine). En fait, ODE est une bibliothèque logicielle libre et multiplateforme permettant de simuler l’interaction physique de corps rigides. Elle intègre également plusieurs primitives géométriques ainsi qu’un détecteur de collisions.

- La physique des particules : elle permet de mettre en œuvre le fait que chaque solide est constitué de plein de petits points que l’on pourrait assimiler à des atomes. Tous ces petits points sont reliés entre eux par des liaisons rigides ou non (des ressorts par exemple).

Détection des collisions:
On parle de collision lorsque deux objets se percutent l’un contre l’autre. Dans la réalité, il en résulte une transmission d’énergie et de quantité de mouvement de l’un des corps vers le second. Un bon moteur physique est un moteur physique qui est capable, à l’aide de calculs, de simuler le plus fidèlement possible cet échange (trajectoire, points et date d’impact etc.) Il est possible de distinguer deux modèles de détection des collisions :

- Le modèle statique : le temps est découpé en échantillon et le détecteur de collisions regarde une fois pendant chaque échantillon si les objets se touchent. Ce modèle a des limites car si les deux objets possèdent des vitesses trop grandes, il est possible qu’ils se percutent sans que le détecteur ne s’en rende compte.

- Le modèle dynamique : la détection se fait en continu, d’un échantillon sur l’autre. Dans ce cas, il n’y a aucun risque qu’une collision ne soit pas traitée mais les calculs sont plus nombreux que pour la méthode précédente.

Pour notre projet, cet aspect du moteur de jeu n’est pas très utile puisque notre drone vole dans un environnement sans obstacle.

L'aspect moteur de jeu de notre projet étant introduit, voyons par quelles méthodes nous avons réguler les mouvements du drone.



ASPECT RÉGULATION

But d’un asservissement

Un asservissement permet de réaliser un objectif donné par une consigne. Il est utilisé pour beaucoup de systèmes. Il existe plusieurs types d’asservissement correspondant à différentes utilisations. Le principe commun à chaque asservissement est de mesurer l’écart entre la consigne (valeur ou objectif défini par l’utilisateur) et l’état actuel du dispositif asservi. En fonction de l’écart mesuré on agit sur le dispositif pour se rapprocher au maximum de la consigne et stabiliser le dispositif à la valeur de la consigne valeur. Pour certains asservissements la consigne peut être modifiée durant le fonctionnement du système. Dans ce dernier cas le système réagit en fonction de sa nouvelle consigne.

Un asservissement peut être définit par différentes caractéristiques qui évaluent sa performance :

- La rapidité ou temps de réponse (temps d’établissement du régime stationnaire sur le schéma) de l’asservissement, c’est le temps nécessaire pour que le système atteigne une valeur stable.
- La pression ou erreur statistique c’est la capacité de l’asservissement à s’approcher le plus possible de la consigne donnée, en d’autres termes que l’écart entre la valeur du système et la consigne soit le plus petit possible.
- La stabilité, on dit d’un asservissement qu’il est stable s’il finit par ne plus osciller ou qu’il ne diverge pas, il doit atteindre une valeur finie et constante au cours du temps
- Le dépassement de la consigne, il sert à mesurer de combien la valeur du système a dépassé la consigne au cours de l’asservissement.

Toutes ces caractéristiques permettent d'évaluer les performances d’un asservissement.

Fonctionnement général d’un asservissement

Il faut savoir qu’un système asservi réagit en fonction de la situation actuelle du système utilisé. C’est-à-dire que le capteur du système asservi (altimètre, GPS, thermomètre…) sert à relever les données de la situation actuelle du système. Ensuite un correcteur (ordinateur, automate…) va calculer par rapport aux relevés du capteur et à la consigne attendue les modifications à apporter sur l’actionneur pour changer une ou plusieurs caractéristiques du système.
Par exemple pour atteindre une certaine vitesse en voiture le capteur est le compteur de vitesse et le correcteur est le conducteur. Si il est au-delà de sa consigne il va ralentir et si il est en dessous il va accélérer. C’est un système asservi en fonction de la vitesse.

Type d’asservissement utilisé pour notre projet

Pour asservir notre drone nous nous sommes appuyés sur une régulation du type (PID), Il utilise les actions Proportionnelles, Intégrale et Dérivé. C’est un des asservissements très couramment utilisé par une multitude de systèmes dont les drones.

Dans cette régulation l’action proportionnelle correspond l’écart entre la consigne et l’état actuel du système, c’est l’erreur proportionnelle. Cette composante de la régulation va donc agir proportionnellement à l’erreur. Reprenons l’exemple de la voiture plus la voiture est loin de la limite de vitesse plus il va accélèrer où freiner. Si le conducteur veut atteindre 80 km/h alors qu’il roule à 10km/h il devra accélérer plus fort que s’il roule 75km/h. C’est l’action proportionnelle. Cette action sert à atteindre la consigne.

L’action dérivée permet d’anticiper le mouvement ou l’évolution du système au cours du temps. Pour cela on relève l’erreur actuelle et on la compare à la précédente pour adapter la prochaine correction en conséquence, cette action permet d’amplifier l’action proportionnelle. En prenant l’exemple de la voiture, si le conducteur est loin de la limite de vitesse il va accélérer encore plus fort pour y monter plus vite et une fois qu’il s’en rapproche il va décélère plus tardivement et plus fort. En résumé l’action dérivé sert juste à amplifier l’action proportionnelle. Cette action sert à limiter les oscillations autour de la consigne, à stabiliser le système plus vite.

L’action intégrale permet de corriger une faible erreur une fois le système stabilisé à une valeur. On fait la somme des erreurs sur les temps pour pouvoir la corriger par la suite. Par exemple pour la voiture le conducteur a réussi à stabiliser sa voiture à 78km/h au lieu de 80, il s’aperçoit de la différence de 2 km/h pour compenser il décide donc d’accélérer à peine plus pour atteindre 80km/h. l’action intégrale permet d’avoir une meilleure précision, de se rapprocher au maximum de la consigne.

Asservissement du drone dans raydium

Stabilisation en hauteur

Pour asservir le drone dans Raydium nous avons décidé d’adopter un régulateur PD (proportionnel, dérivé) avec le même principe que la régulation PID mais nous avons laissé la partie intégrale de coté sur les recommandations de notre tuteur pour des raisons de simplicité. En effet nous nous sommes aussi aperçus qu’avec le programme au point, le drone ne se stabilisait pas exactement à la hauteur de la consigne, il y avait un écart très minime ce qui est dû au manque de l’action intégrale.

Dans un premier temps pour mieux comprendre le principe d’un asservissement nous n’avons appliqué qu’une seule force pour faire décoller le drone. Le drone devait monter à une altitude donnée par la consigne et s’y stabiliser de lui-même sans actions extérieures de notre part. Pour ce faire nous avons dans un premier temps essayé seulement avec une action proportionnelle mais le drone oscillait autour de la hauteur de la consigne et ne se stabilisait jamais.

Pour réaliser ce programme nous avons écrit dans le langage C et dans une boucle se nommant « display » se réitérant 60 fois par secondes ce qui permet de recalculer toutes les valeurs tout les soixantièmes de secondes notamment celle pour l’asservissement du drone.

Extrait du programme avec une seule force et seulement l’action proportionnelle :

- La première ligne correspond au relevé de la position dans l’espace de l’élément « drone » via une fonction prédéfinie par raydium.

- La deuxième ligne sert à extraire de « position_drone » seulement la position du drone sur l’axe Z (axe de l’altitude).

- Ensuite nous donnons une valeur à la variable k.

- Puis nous calculons « Eps » (epsilon) l’erreur entre la consigne et l’altitude du drone. Ici « Eps » représente la valeur de l’action proportionnelle.

- La ligne suivante nous ajoutons un coefficient constant k a la valeur epsilon pour la changer et faire des tests avec différentes valeurs, de cette manière nous accentuons ou diminuons l’action proportionnelle d’epsilon. Ici k*Eps représente la force à appliquer sur le drone.

- Enfin nous appliquons la nouvelle valeur de la force sur l’axe Z à l’élément « drone » on veut voir que les composantes sur les axes X et Y sont nulles ce qui est normal car nous voulons juste faire mouvoir le drone en hauteur pour l’instant.

Comme cette méthode n’était pas efficace nous avons décidé de rajouter l’action dérivée dans le calcul de la force :

Nous avons toujours la composante proportionnelle avec Eps que l’on nomme par la suite fp (c’est la variable « force » de l’extrait précédent) pour force proportionnelle. Puis nous avons fd qui représente l’action dérivée, elle est calculée en prenant la différence entre l’ancienne valeur de l’erreur (EpsOld) et celle de l’itération actuelle Eps. Les variables k1 et k2 sont des coefficients s’ajoutant respectivement à fp et fd pour modifier l’influence de ces dernières en changeant la valeur de k1 et k2. La nouvelle force prend désormais en considération l’action proportionnelle et l’action dérivée come on peut le voir sur la dernière ligne. Puis comme dans l’extrait précédant on applique la force a l’élément drone. De cette manière nous avons réussi à stabiliser le drone à l’altitude souhaité.

Mais cette simulation n’est pas en phase avec la réalité car un drone a 4 hélices, il est donc porté par 4 forces dans le modèle de simulation précédent nous n’avons qu’une seule force. C’est pour cette raison que cette simulation n’est pas réaliste. Nous avons donc décidé de créer un objet "Drone" constitué de 5 éléments qui sont le corps du drone et les 4 hélices liées au corps du drone. Puis nous appliquons de la même manière que précédemment une force sur chaque hélice.

Déplacements du drone

Nous avons rencontré un nouveau problème venant de l’application de forces, les forces que nous appliquons jusqu’à présent étaient des forces qui s’appliquaient par rapport aux axes du repères et non par rapport aux axes de l’objet.
C’est-à-dire que même si le drone se penchait, les forces étaient seulement appliquées sur l’axe Z (axe de l’altitude) du repère et n’avaient pas de composante sur un autre axe, ce qui permet au drone d’avancer par exemple (cf partie mécanique du drone). Pour palier à ce problème nous avons dû changer les forces en forces relatives grâce à une fonction de Raydium et aux éléments sur lequel s’appliquent les forces (les hélices en l’occurrence). Désormais les forces sont appliquées relativement aux objets c’est-à-dire par rapport aux axes des objets et non aux axes du repère. Grâce à cette modification les forces ont désormais deux composantes par rapport au repère lorsque le drone s’incline, une toujours portée par l’axe Z et une autre sur l’axe X permettant de le faire avancer.

Pour faire avancer le drone il faut l’incliner, nous avons donc dû asservir l’angle du drone en plus de sa hauteur, en temps normal la consigne de l’angle est de 0°. De la même façon que pour la hauteur, avec une régulation PD nous avons asservi l’angle.

Ici nous relevons les valeurs des angles du drone grâce à la fonction de la première ligne de l’extrait puis nous les convertissons en degrés. « rotx » correspond à la rotation du drone autour de l’axe X il en est de même pour les deux autres. Pour faire avancer le drone sur l’axe X il faut donc arriver à changer « roty ».

On utilise le même procédé pour asservir l’angle que pour la hauteur mais ici « consigne_x » (angle de rotation que doit prendre le drone autour de l’axe Y) représente un angle que le drone doit atteindre pour gérer le déplacement sur l’axe X. Si « consigne_x » prend la valeur 20 alors le drone prendra un angle de 20° autour de l’axe Y et pourra se déplacer sur l’axe X.

Par la suite on ajoute la force « ang_x » aux forces des hélices arrières et on l’enlève aux hélices avants de cette façon le drone augmente et diminue les forces des hélices avants et arrières selon l’angle de la consigne et son angle actuel.

Les hélices 1 et 3 sont les hélices avants et les hélices 2 et 4 sont celles de derrière.

Pour faire avancer le drone l’utilisateur appuie sur le bouton F2 afin de mettre la consigne de l’angle à 20° quand il lâche le bouton on enregistre la position du drone et le drone doit s’y stabiliser. C’est une partie compliquée car le drone acquiert une vitesse pendant que l’utilisateur appuie sur la touche pour le faire avancer. Quand il relâche la touche le drone garde sa vitesse car il a une inertie. Il continue à avancer et ne s’arrête pas. Pour cela il faut donc asservir l’angle du drone en fonction de la position du drone et de la position ou l’utilisateur a relâché la touche d’avancée (qui est initialisé à 0 si le drone n’a pas encore bougé). L’asservissement fonctionne de cette manière : si le drone dépasse cette dernière position alors il s’incline dans l’autre sens pour y revenir mais il risque de revenir trop loin alors il va encore changer d’inclinaison et avancer un peu… jusqu’à ce qu’il se stabilise au point là où l’utilisateur a lâché la touche pour avancer. Et tout ceci est fait en faisant attention à ne pas dépasser une certaine limite d’angle sans quoi le drone basculerait trop et s’écraserait.

Première condition if : si l’utilisateur appuie sur F2 alors la consigne de l’angle est 20° et on récupère la position du drone à ce moment-là

Premier else : on calcule l’angle que doit prendre la consigne d’angle en fonction de la position actuelle du drone et de celle qu’il doit atteindre avec la même méthode que pour l’asservissement de la hauteur ou de l’angle. Ce calcul donne un angle négatif si le drone est allé trop loin et un angle positif s’il revient trop.

Deuxième if et else : on vérifie que le nouvelle angle ne dépasse pas + ou – 20 ° si la nouvelle valeur (« consigne_ang_x ») calculée vérifie cette condition alors la consigne d’angle (ici « consigne » dans l’extrait du programme) prend cette nouvelle valeur calculée. Si la valeur calculée est inférieure à -20° alors on assigne à la consigne d’angle -20° pour que le drone ne dépasse pas cette valeur et ne se crash pas.
Puis on traite le dernier cas, quand la nouvelle valeur calculée est supérieure à 20° on donne à la consigne de l’angle la valeur 20 là encore pour que le drone ne prenne pas trop d’angle et éviter qu'il ne tombe.

Grâce à cet extrait on peut calculer la nouvelle consigne de l‘angle que doit prendre le drone pour aller à une certaine position et s’y stabiliser. La consigne de l’angle est ainsi en permanence recalculée pour gérer les forces des hélices avants et arrières en fonction de la position.

Cette solution fonctionne mais le drone oscille un peu avant de se stabiliser. On pense que ce n’est pas la solution la plus efficace mais c’est la seule que nous avons trouvée.

Pour terminer, attardons-nous sur l'aspect modélisation inhérent à notre projet.



ASPECT MODÉLISATION

Dans cette partie qui va aborder la modélisation du projet, nous commencerons par voir ce en quoi consiste la modélisation. C’est, ici, le fait de représenter numériquement quelque chose.
Nous avons dû représenter le drone selon 2 axes :

- la modélisation graphique

- la modélisation physique

La modélisation graphique

Dans un premier temps, il faut mettre sur pied un prototype afin de bien visualiser l’objet en 3 dimensions. Pour cela l’utilisation d’un logiciel présent dans le package d’installation de Raydium est conseillé, celui-ci se nomme Blender.

Présentation de Blender:

Ce logiciel est fourni dans le package de téléchargement de Raydium. C’est un logiciel développé par la Fondation Blender qui a vu sa première version sortir en 1998. Blender propose de la modélisation en 3 dimensions, de l’animation en 3 dimensions également, du montage vidéo (non linéaire), ainsi que d’autre éléments non utiles pour ce projet. Dans le cadre de ce projet il n’est nécessaire d’utiliser seulement la modélisation 3 D.

Comme cité précédemment Blender a permis de créer un objet personnalisé.

A partir de cette étape il est déjà plus aisé de comprendre et de se projeter au cœur du problème. Etant donné que ce prototype a un intérêt visuel et surtout fonctionnel (non artistique), il n’y a que des formes simples qui sont utilisées. A partir de là certains autres aspects du projet peuvent être traités.

Ensuite, on peut revenir sur la partie visuelle. Pour améliorer cette facette du projet il est nécessaire avant toute chose de préciser que la forme importe peu. En effet, sur un simulateur le poids est réglé manuellement mais il faut tout de même se rapprocher de quelque chose dont les principales caractéristiques géométriques se rapprochent de la réalité. Etant donné, qu’il est demandé de réaliser un simulateur donc par définition le résultat doit être le plus réaliste possible.

Pour le visuel il est donc conseiller de s’intéresser à l’edit mode en plus du mode de base de Blender (object mode). Ce mode permet l’édition des formes et des textures de manière poussée. Grâce à cela, on peut modéliser le sol, des hélices et globalement un drone plus agréable à regarder. Le sol permet de ne pas avoir un damier qui est une texture de base de Blender et ainsi mettre plus en avant les autres éléments du drone. Les hélices ne sont que purement visuelles car comme nous l’aborderons dans la section suivante, les forces sont appliquées au drone même. Normalement, ce sont les 4 hélices entraînées par les moteurs qui permettent au drone de se déplacer, il est donc choisi par défaut de positionner les forces de déplacement aux quatre extrémités (à l’endroit où se situerait les hélices normalement). Ainsi, le drone final est créé. Cela est très important car c’est l’objet principal, donc il est judicieux qu’il soit agréable à regarder.

Drone final

Pour finir la partie sur la modélisation graphique on peut juste dire que cela est surtout esthétique et aide à se projeter dans la modélisation. Mais d’un point de vue du projet c’est une partie qui est moins conséquente que la modélisation physique (partie suivante) car ce n’est pas là où se trouve la partie la plus importante du travail. Cependant, le visuel n’est pas à négliger car dans la perspective d’une commercialisation du projet, la communication et le packaging des produits sont des éléments stratégiques de vente. Dans tous les cas, il est la première impression que le « client » va avoir et va potentiellement impacter son acte d’achat. Par conséquent, c’est un élément essentiel à prendre en compte et à ne pas sous-estimer.

La modélisation physique

La physique est gérée par le logiciel Raydium. Dans cette partie il s’agit de modéliser en langage C les différentes forces auxquelles un drone serait soumis dans la réalité et ainsi permettre au drone simulé de se déplacer à l’identique d’un drone réel.

Principes :

Un drone réel avec quatre hélices s’élève et se déplace grâce à ces dernières (comme indiqué en détails dans la section mécanique du drone). Mais dans le programme de ce simulateur, les hélices ne sont que décoratives et ce sont des forces appliquées au niveau des hélices qui permettent au drone de se mouvoir.

Les particularités d’un simulateur:

Dans la réalité, le drone est soumis à diverses forces qui vont l’empêcher de se mouvoir comme : le poids, la résistance de l’air, la force du vent, etc.

Ces trois éléments sont les trois forces de résistance les plus communes mais dans Raydium, la seule force de résistance que le logiciel autorise à simuler est la gravité (action du poids). Ceci signifie que si on veut utiliser les éléments du programme pour les appliquer dans un environnement réel, il faudra prendre ces forces en comptes. Ici, on touche aux limites d’un simulateur. De plus, cela signifie que si le drone commence à se déplacer latéralement ou à se pencher rien ne l’arrêtera (sauf si on commande une réaction des moteurs à contre sens du mouvement). En effet, en réalité les frottements freineraient le drone ralentissant sa course.
Mais sur Raydium étant donné l’absence de frottements, si on donne une impulsion au drone dans une direction alors il va continuer à glisser dans cette direction. De ce fait, si on donne un angle au drone il va se pencher de plus en plus puis s’emballer.

Les forces :

Pour appliquer une force au drone il est nécessaire d’utiliser la fonction suivante :

raydium_ode_element_addforce_name_3f("drone",0,0,force)

Cette fonction applique une force au drone (l’objet nommé drone) suivant l’axe z (du sol vers le ciel). La force est à déterminer en fonction du poids. La gravité étant gérée par Raydium, il faut donner une force supérieure au poids du drone. Pour cela il faut utiliser le poids dans la fonction dédiée à l’apparition du drone :

raydium_ode_object_box_add("drone",a,1,1,1,poids,RAYDIUM_ODE_STANDARD,0,"drone.tri")

Il est tout de même plus simple de procéder de façon empirique, car mettre une force bien supérieure au poids permettrait au drone de monter plus rapidement. Or, une force légèrement supérieure au poids ferait monter le drone plus lentement. Mais si l’on souhaite prendre comme point de départ la force suffisante, on utilise la formule du poids :

F (forces) = m (poids du drone) *g (constante gravitationnel)

Pour plus de facilité, on peut utiliser à la place du poids la fonction :

RAYDIUM_ODE_AUTODETECT

Celle-ci permet de mettre un poids déterminé automatiquement par le logiciel, c’est-à-dire un poids cohérent qui encourage la recherche de la force précédemment évoquée de façon empirique.
Au début, on applique une force centrale au drone (barycentre). Mais par la suite on simulera les moteurs par quatre forces.

Atteindre une hauteur :

Comme déjà évoqué précédemment il n’y a pas de forces qui vont restreindre le mouvement, il est donc nécessaire d’appliquer une consigne de hauteur à laquelle on souhaite arrêter le drone. Voir la partie sur l’asservissement des moteurs.

Quatre Forces :

Pour des raisons de réalisme, il est nécessaire de séparer la force appliquée au drone car dans la réalité un drone est propulsé par ses moteurs (au nombre de quatre généralement). Donc on va appliquer les forces aux quatre extrémités du drone grâce à la fonction :

raydium_ode_element_addrelforce_name_3f("helice",0,0,force)

Le paramètre "helice" correspond à la position/objet de l’hélice parmi les 4 disponible : helice1, helice2, helice3 ou helice4.
Les paramètres "0,0,force" sont les forces appliquées sur les 3 axes x, y et z. Sur l’axe vertical (z), la force sera égale à ¼ de la force totale nécessaire pour faire décoller le drone.

Les hélices :

Les hélices n’ont pas d’impact par rapport au poids et n’exercent pas d’interaction avec l’environnement dans le simulateur. En réalité il faut évidemment prendre leur poids en compte et également considérer leur taille… Il faut donc se servir de la fonction suivante :

raydium_ode_joint_attach_hinge("joint",drone,helice,0,0,0,RAYDIUM_ODE_JOINT_AXE_Z)

Le paramètre drone est l’objet qui va se voir ajouter les hélices.
Hélice est le nom de l’objet que l’on souhaite ajouter.
Les paramètres (0,0,0) détermine la position, par rapport au centre du drone, où les hélices vont se trouver sur les axes x, y et z.

RAYDIUM_ODE_JOINT_AXE_Z est l’orientation de l’objet (ici suivant l’axe z).



CONCLUSION

Pour conclure, nous pouvons affirmer que ce projet étalé sur les deux années de PeiP nous a permis de découvrir toute la difficulté de la simulation informatique. En effet, avant de recréer un phénomène physique, il est nécessaire de le comprendre et de le maîtriser parfaitement. Une fois le phénomène compris, il faut parvenir à le retranscrire informatiquement et à le rendre fonctionnel. Toutes ces étapes s’imbriquent les unes dans les autres et sont essentielles à la résolution du problème.

D'un point de vue critique, il est clair que nous n’avons pas atteint tous les objectifs définis au début de l’étude avec notre tuteur. Cependant, nous pensons être allé au bout de ce qu’il nous était techniquement possible de faire à notre niveau.

Plus loin que le simple aspect scolaire, ce projet a été un moyen pour nous d’appréhender certains aspects du métier d’ingénieur. Par exemple, nous avons dû faire des compromis, accepter de ne pas tout maîtriser, adapter notre travail aux circonstances et revoir nos objectifs en cours de route. Ce fut une expérience très formatrice qui nous servira pour nos projets futurs.

IMAGE1.png (103 KB) Thomas FAIVRE, 05/01/2020 04:26 PM

IMAGE2.png (139 KB) Thomas FAIVRE, 05/01/2020 04:29 PM

IMAGE3.png (347 KB) Thomas FAIVRE, 05/01/2020 04:31 PM

IMAGE4.png (93 KB) Thomas FAIVRE, 05/01/2020 04:35 PM

IMAGE5.png (93.8 KB) Thomas FAIVRE, 05/01/2020 04:36 PM

IMAGE6.png (65 KB) Thomas FAIVRE, 05/01/2020 04:38 PM

IMAGE7.png (462 KB) Thomas FAIVRE, 05/01/2020 04:39 PM

IMAGE8.png (170 KB) Thomas FAIVRE, 05/01/2020 04:41 PM

IMAGE9.png (115 KB) Thomas FAIVRE, 05/01/2020 04:52 PM

IMAGE10.png (73.9 KB) Thomas FAIVRE, 05/01/2020 04:56 PM

IMAGE11.png (265 KB) Thomas FAIVRE, 05/01/2020 05:01 PM

IMAGE12.png (296 KB) Thomas FAIVRE, 05/01/2020 05:07 PM

IMAGE13.png (112 KB) Thomas FAIVRE, 05/01/2020 05:09 PM

IMAGE14.png (144 KB) Thomas FAIVRE, 05/01/2020 05:11 PM

IMAGE15.png (148 KB) Thomas FAIVRE, 05/01/2020 05:16 PM

IMAGE16.png (67.9 KB) Thomas FAIVRE, 05/01/2020 05:18 PM

IMAGE17.png (87.7 KB) Thomas FAIVRE, 05/01/2020 05:25 PM

IMAGE18.png (119 KB) Thomas FAIVRE, 05/01/2020 05:27 PM

IMAGE19.png (140 KB) Thomas FAIVRE, 05/01/2020 05:30 PM

IMAGE20.png (427 KB) Thomas FAIVRE, 05/01/2020 05:32 PM

IMAGE21.png (359 KB) Thomas FAIVRE, 05/01/2020 05:49 PM

IMAGE22.png - Drone final (252 KB) Thomas FAIVRE, 05/01/2020 05:50 PM

IMAGE23.png (1.41 MB) Thomas FAIVRE, 05/01/2020 08:42 PM

langfr-220px-Blender_logo_no_text.svg.png (7.22 KB) Guillaume ROUIRE, 05/02/2020 03:43 PM