See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: [C++] Pilote auto pour le fin de réentrée d'un capsule et modèle de vol  (Read 2271 times)

0 Members and 1 Guest are viewing this topic.

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
30 August 2012, 21:41:40
Bonjour,

Pour ma capsule, je doit faire un pilote auto qui maintient l'AOA à 180° pendant la fin de la réentrée.

Voila ce que j'ai essayer :

Code: [Select]
Data.dAltitude =GetAltitude();
Data.dAOA  =GetAOA();

if (iAOAautoON>0)  
{
if (Data.dAltitude<150000)
{
if (Data.dAOA {
SetThrusterGroupLevel(THGROUP_ATT_UP, 1);
SetThrusterGroupLevel(THGROUP_ATT_DOWN, 0);
}
if (Data.dAOA>PI)
{
SetThrusterGroupLevel(THGROUP_ATT_DOWN, 1);
SetThrusterGroupLevel(THGROUP_ATT_UP, 0);
   }
if (Data.dAOA=PI)
{
SetThrusterGroupLevel(THGROUP_ATT_DOWN, 0);
SetThrusterGroupLevel(THGROUP_ATT_UP, 0);
   }
 }
}

activé par :

Code: [Select]
if(key==OAPI_KEY_G)
{
iAOAautoON=1;
}

Malheureusement, ça ne fonctionne pas

Merci d'avance

A+



Message modifié ( 02-09-2012 18:08 )


Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #1 - 30 August 2012, 21:52:59
D'abord pourquoi iAOAautoON et pas bAOAautoON ? Un booléen est bien plus facile à maitriser (même si un int l'est aussi) et puis un simple "if(bAOAautoON)" marche dans ce cas.

Aussi, pour ton pilote auto il semble qu'il est un peu "hard"; ça manque en effet de marge. les RCS vont brûler du fuel !

Pour t'aider (car je n'ai pas d'expérience en PA), je peux te donner une des fonctions d'"attctrl.lua" par Matrin en personne, pour un pilote auto de maintien de pitch:
Code: [Select]
function setpitch (v,p0,tmax,tol,pitch_func)
  if pitch_func == nil then pitch_func=v.get_pitch end
  local t0 = oapi.get_simtime()
  if tmax == nil then tmax=t0+100 else tmax=t0+tmax end
  if tol == nil then tol = 1e-3 end
  if verbose ~= nil then
    term.out('  setpitch initiated ('..p0*DEG..'deg, tmax='..tmax-t0..', tol='..tol..')')
  end

  repeat
    av = v:get_angvel() -- angular velocity
    p = pitch_func(v)   -- current pitch value
    vp = av.x           -- pitch velocity (damping term)
    dp = p0-p           -- angle difference
    if dp > PI then dp = dp - 2*PI elseif dp < -PI then dp = dp + 2*PI end
    if math.abs(v:get_bank()) > PI05 then dp=-dp end
    // reverse direction if banked more than 90 deg
    rcs = dp*pitch_a - vp*pitch_b
    res_dp = math.abs(dp)        -- angle residual
    res_vp = math.abs(vp)        -- velocity residual
    res = math.max(res_dp,res_vp)
    if rcs > 1 then rcs = 1 elseif rcs < -1 then rcs = -1 end
    if res < 1e-3 then rcs = rcs*0.1 end
    if res < 1e-4 then rcs = rcs*0.1 end
                     // close to minimum, slow down for higher accuracy
    SetRCS(v, RCSMODE.PITCH, rcs)
    if (res_dp > tol or res_vp > tol) and oapi.get_simtime() < tmax then
 proc.skip()
end
  until res_dp < tol and res_vp < tol or oapi.get_simtime() > tmax
  SetRCS(v, RCSMODE.PITCH, 0)

  if verbose ~= nil then
    dt = oapi.get_simtime()-t0
    if dt > tmax-t0 then
      term.out('  setpitch timed out (t='..string.format('%0.2f',dt)..')')
    else
      term.out('  setpitch converged (t='..string.format('%0.2f',dt)..')')
    end
    term.out('  residuals: angle='..string.format('%0.6g',dp)..', vel='..string.format('%0.6g',vp))
  end
end

Voilà qui pourrai aider ;)



Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #2 - 31 August 2012, 15:32:46
J'ai refait mon pilote auto d'après ceci :

http://orbiter.dansteph.com/forum/index.php?topic=6257.msg93289#msg93289

ça donne ça

Code: [Select]
Data.dAltitude =GetAltitude();

if (iAOAautoON>0)  
{
if (Data.dAltitude<45000)
       {
if (Data.dAltitude>12000){
       double dAOA = GetAOA();
                double dReqAOA = PI; //AOA de 180° (nez de la capsule en arrière)

                VECTOR3 Angle={0};
                GetAngularVel(Angle);
                Angle.x=min(0.02,max(-0.02,(dReqAOA-dAOA)));
               SetAngularVel(Angle);
}
if (Data.dAltitude<12000){
                double dPitch = GetPitch();
                double dReqPitch = 0.5*PI; //pitch de 90°  (nez de la capsule en haut)

                VECTOR3 Angle1={0};
                GetAngularVel(Angle1);
                Angle1.x=min(0.02,max(-0.02,(dReqPitch-dPitch)));
                SetAngularVel(Angle1);
}
}
}

ça fonctionne à peu près mais vers la fin l'autopilote du pitch ne marche par bien, il me met un angle de pitch très mauvais mais ça doit être un mauvais réglage dans le code, je vais voir ce que je dois modifier.



Message modifié ( 31-08-2012 15:35 )


Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #3 - 31 August 2012, 22:55:27
La plupart des pilotes automatiques sont basés sur le PID. Il y a un excellent article en français sur Wikipédia : http://fr.wikipedia.org/wiki/Régulateur_PID


Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #4 - 01 September 2012, 17:04:30
Bonjour,

j'ai essayer la méthode dont j'ai parlé dans mon précédent post et le vaisseau tourne sur lui même.

et un truc qui ne m'aide pas c'est que je n'ai pas trop compris le fonctionnement de ceci :

Code: [Select]
Angle.x=min(0.02,max(-0.02,(dReqAOA-dAOA)));
Pour l'instant j'ai ça :

Code: [Select]
currentAOA = GetAOA();
currentAOAdeg = 180*currentAOA/PI;
double dReqAOA=160;

if (iAOAautoON>0)  
{
if (Data.dAltitude>0)
{
if (Data.dAltitude<20000)
{
        VECTOR3 Angle={0};
        GetAngularVel(Angle);
        Angle.x=min(0.05,max(-0.05,(dReqAOA-currentAOAdeg)));
        SetAngularVel(Angle);
}
}
}

Le but est de maintenir le vaisseau nez en arrière (180° d'AOA) pour qu'il se penche de plus en plus à mesure que la vitesse horizontale diminue, jusqu’à ce que le bouclier soit vers le bas : donc un pitch de 90°  

Merci d'avance

Au revoir



Message modifié ( 01-09-2012 18:43 )


Offline SolarLiner

  • Global Moderator
  • Legend
  • *****
  • Posts: 2769
  • Country: France fr
  • Karma: 55
  • a été remercié par Le Créateur
Reply #5 - 01 September 2012, 23:06:33
Déjà il y a la facilité du fait que l'AoA passe d'un pitch de ~0° à 90°, à cause de l'aérodynamique de la capsule. Donc facilité sur ce point.



Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #6 - 02 September 2012, 12:48:32
Quote
Déjà il y a la facilité du fait que l'AoA passe d'un pitch de ~0° à 90°, à cause de l'aérodynamique de la capsule. Donc facilité sur ce point.

C'est donc le modèle de vol qui fait ça ?

j'ai commencer à le faire en utilisant le code du shuttlePB et les paramètre du CEV2.

mais connaissez vous un site ou je pourrais trouver des données sur l'aérodynamique des capsules

J'ai réussis à calculer un certain nombre de truc, c'est juste pour les coefficient de traîner, et de lift en fonction de l'AOA (pour l'instant je regarde le comportement avec les paramètre du CEV2).

Pour les parachutes est ce qu'il faut aussi utiliser le modèle de vol (modifier le coefficient de traîner) ou des addforce() comme j'ai pu lire sur le forum de orbit-hangar?


Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #7 - 02 September 2012, 18:14:58
J'ai essayer de faire le modèle de vol mais ça ne marche pas comme pour une capsule.

Quelqu'un sait il comment je doit m'y prendre pour faire un modèle de vol pour une capsule notamment pour que l'engin change d'AOA tout seul vers la fin.

« Last Edit: 02 September 2012, 19:20:47 by ea76620 »

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #8 - 02 September 2012, 18:54:56
Tiens, voilà la fonction des ailerons pour les capsules de MULE.

C'est une fonction linéaire selon l'angle d'attaque (AOA) pour chaque paramètre. Pour maintenir l'AOA, le tableau le plus important est CM (le coefficient de quantité de mouvement). Il faut créer un momentum plus fort lorsque la capsule est perpendiculaire ou inverse à ce qu'elle devrait être. Et il ne faut créer aucun momentum lorsque la capsule est à l'orientation désirée.

Code: [Select]
void CoeffFunc (double aoa, double M, double Re, double *cl, double *cm, double *cd)
{
const int nlift = 11;
double factor,dfact,lfact,frac,drag,lift;
static const double AOA[nlift] =
{-180.*RAD,-150*RAD,-120*RAD,-110*RAD,-90*RAD,-70*RAD,-60*RAD,-30*RAD,0*RAD,90*RAD,180.*RAD};
static const double CL[nlift]  = {0.0,0.0,0.0,0.9,1.1,0.5,0.0,-0.5,-1.1,-0.9,0.0};
static const double CM[nlift]  = {-0.015,-0.012,-0.006,-0.004,0.0,0.004,0.006,0.012,0.015,0.,-0.015};
static const double CD[nlift]  = {0.8,0.8,1.0,1.0,1.143,1.0,1.0,0.8,0.8,0.8,0.8};
static const double Mach[17] = {0.0,0.7,0.9,1.1,1.2,1.35,1.65,2.0,3.0,5.0,8.0,10.5,13.5,18.2,21.5,31.0,50.0};
static const double LFactor[17] = {0.3,0.392,0.466,0.607,0.641,0.488,0.446,0.435,0.416,0.415,0.405,0.400,0.385,0.385,0.375,0.35,0.33};
static const double DFactor[17] = {0.9,0.944,0.991,1.068,1.044,1.270,1.28,1.267,1.213,1.134,1.15,1.158,1.8,1.8,1.193,1.224,1.25};
int j;
factor = 100;
dfact = 0.9;
lfact = 1.0;
for(j = 0; (j < 16) && (Mach[j+1] < M); j++);
frac = (M-Mach[j])/(Mach[j+1]-Mach[j]);
drag = dfact*(frac*DFactor[j+1]+(1.0-frac)*DFactor[j]);
lift = drag * lfact*(frac*LFactor[j+1]+(1.0-frac)*LFactor[j]);
for(j = 0; (j < nlift-1) && (AOA[j+1] < aoa); j++);
frac = (aoa-AOA[j])/(AOA[j+1]-AOA[j]);
*cd = drag*(frac*CD[j+1]+(1.0-frac)*CD[j]);
*cl = lift*(frac*CL[j+1]+(1.0-frac)*CL[j]);
*cm = factor*(frac*CM[j+1]+(1.0-frac)*CM[j]);
}

Pour le parachute, regarde la fonction CreateVariableDragElement() ;)



Message modifié ( 02-09-2012 18:56 )

« Last Edit: 02 September 2012, 19:20:47 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon

Offline ea76620

  • Sr. Member
  • ****
  • Posts: 393
  • Country: France fr
  • Karma: 15
Reply #9 - 02 September 2012, 19:20:47
Ok, merci je vais comparer tout ceci avec deux bout de code de la capsule orion vu sur le forum d'orbit hangar ainsi qu'aux codes du deltaglider et du shuttlePB afin de mieux comprendre la chose.



Message modifié ( 02-09-2012 22:15 )

« Last Edit: 02 September 2012, 19:20:47 by ea76620 »