Forces Permanentes / Asservissement

Les forces permanentes sont les forces qui seront appliquées à l'hélicostat de manière permanente. Dans la simulation, elles sont au nombre de 3 : la gravité, autrement dit nous allons appliquer une force à tous les objets de la simulation, pour qu'ils soient attirés vers le sol, la poussée d'Archimède, qui permet au ballon de l'hélicostat de rester vers le haut : il ne pourra alors jamais se retrouver sous le support, et enfin l'accélération, qui, lorsque l'hélicostat se déplacera, aura une fonction importante, car elle permettra de stabiliser le ballon, et d'éviter des déplacements incorrects ou étranges par rapport à la réalité.
Toutes ces forces sont gérées par une seule et même fonction : la fonction step(). Elle gère la partie physique de la simulation, et est appelée plusieurs fois par seconde. Pour cela, on utilise, dans le main, raydium_ode_StepCallback, qui va permettre cette boucle sur la fonction step().

a) La gravité

Dans la réalité, la gravité terrestre est différente en fonction de la zone où l'on se trouve. En effet, si l'on se trouve plus ou moins près du noyau terrestre, la force gravitationnelle est plus ou moins grande.
De ce fait, dans Raydium, il a fallu intégrer cette dimension de gravité. Et avant toute chose, pour notre simulation, nous avons dû modifier la gravité du moteur physique.
En effet, au départ, sa gravité était de 1 m/s². Autrement dit, en prenant pour base : une unité égale à 1 m/s², nous avions un vecteur (0,0,-1) (nous nous trouvions donc attiré vers le sol).
En changeant la gravité, nous avons donc eu à modifier la force en z : avec la fonction raydium_ode_gravity_3f(), on peut facilement s'en charger : avec ce vecteur : (0,0,- M_GRAVITE), M_GRAVITE étant une constante définie dans hélicostat.h.
Cette constante a été choisie lors de la conception de l'application. En effet, comme dit précédemment, la force gravitationnelle n'est pas la même en fonction de l'endroit où l'on se trouve. Il a donc fallu choisir une force de gravité intéressante, et nous avons finalement décidé de prendre la valeur lorsqu'elle s'applique à Clermont-Ferrand : 9.80665 m/s².

b) La poussée d'Archimède

Il s'agit d'une nouvelle force permanente, s'appliquant, cette fois, seulement lorsque l'hélicostat est créé dans la simulation, car la poussée d'Archimède ne s'applique qu'au ballon.
Cette force existe pour permettre la stabilisation de la machine : on l'applique sur le ballon de l'hélicostat, dont le déplacement va alors être beaucoup plus fidèle à la réalité, étant donné qu'il sera désormais impossible pour l'engin de se retourner, ou de faire un looping sur lui-même, par exemple.
Le calcul est fait grâce à la formule officielle :
(4 * M_PI * r³))/3) * rhoAir * M_GRAVITE , M_PI étant définie comme égale à pi (dans helicostat.h : 3.14159265358979323846), rhoAir étant égale à 1,2 kg/m³
Cependant, la fonction étant appelée plusieurs fois par seconde, elle s'accumule et la force se démultiplie. De ce fait, pour éviter que la force poussant le ballon vers le haut ne soit trop grande, et ne dépasse la valeur de la gravité, ce qui aurait pour effet de faire décoller l'hélicostat, alors qu'il devrait rester à terre, on divise cette force par le nombre de fois où elle est appliquée, par seconde, avec la fonction raydium_ode_get_physics_freq();
De cette manière, on peut gérer et surtout diminuer la force appliquée au ballon, et donc rendre son comportement plus proche de la réalité.

c) L'accélération

L'accélération est un procédé physique difficile à coder. En effet, il s'agit d'un vecteur dont la valeur évolue par rapport à la valeur de l'itération précédente. Ainsi, une erreur ou approximation minime à la première itération, peut entraîner un décalage à la chaîne, et l'erreur, minime au départ, prend alors des proportions énormes au bout de quelques autres itérations. Pour régler ce problème, il faut appliquer un vecteur inverse à l'accélération afin de diminuer le "coefficient d'erreur". En positionnant un vecteur inverse à l'accélération, on va pouvoir stabiliser complètement l'hélicostat, et rendre son comportement dans la simulation beaucoup plus concret.
Avec Raydium, notre travail est simplifié : on peut utiliser une fonction très simple : raydium_ode_element_linearvelocity_get_name(), qui va permettre, pour un objet donné, de prendre sa vitesse de déplacement, et de la retourner dans un vecteur (x,y,z). Ensuite, il suffit simplement d'ajouter une force à l'objet choisi, contraire à la vélocité de cet objet, pour pouvoir, quelque soit sa vitesse de déplacement, rendre ses mouvements « naturels » en le stabilisant complètement.

accelerationPetit.png (50.7 KB) Kevin Jabaud, 03/22/2015 02:52 PM