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: [Résolu][C++] SetAngularVel();[/Résolu]  (Read 9109 times)

0 Members and 1 Guest are viewing this topic.

Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
31 October 2007, 16:36:49
Voila. Je suis en train de faire les gyros pour Venus Evpress et je suis coincé au moment de simuler les gyroscopes pour
l'orientation du vaisseau.

Voici le code:

Code: [Select]
void VenusExpress::vPitchUp (void)
{
VECTOR3 Angle={0};
GetAngularVel (Angle);
Angle.x+=10;
SetAngularVel (Angle);
}

et dans le clbkConsumeBufferedKey
Code: [Select]
case OAPI_KEY_NUMPAD2:
vPitchUp ();
return 1;
Ca ne marche pas...ca ne fait pas d'erreur à la compil, rien du tout. Je sais, c'est une question basique (voire très
basique), mais je planche dessus depuis un bout de temps. Qqn a-t-il une solution?
Merci



Message modifié ( 28-11-2007 16:29 )

@++

MSL  


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #1 - 31 October 2007, 17:11:11
Je pense qu'il faut mettre VECTOR3 Angle={0,0,0}; mettre explicitement ton x, ton y et ton z.



Message modifié ( 31-10-2007 17:28 )

------------

no matter.

Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #2 - 31 October 2007, 18:23:35
non ca c'est bon, par contre les angleVel c'est plutot du 0.1 voir 0.05 alors 10 :sick:

Oublie aps que c'est pas une position de rotation, c'est la VITESSE angulaire...
si tu l'augmente de dix a chaque image ton machin va jouer a la toupie
comme un malade...

Essaie plutot

Get
Bidule.x=0.01;
Set

Dan



Message modifié ( 31-10-2007 18:25 )


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #3 - 31 October 2007, 22:31:47
le 10 c'était pour être sur de voir qqch si ca marchait...

j'ai modifié un peu la fonction avec une debug string pour voir la difference entre avant setangularvel et apres...

Dans SetClassCap, j'ai rajouté:

VECTOR3 Angle={0};

Et dans clbkPostStep:
sprintf(oapiDebugString(),"%ld, %ld, %ld", Angle.x, Angle.y, Angle.z);

Les chiffres dans la string ne changent qu'une seul fois par cession orbiter
apres la premiere frappe, je peux ecraser la touche 2 comme je veux, rien ne change

=> la fonction ne s'exécute qu'une fois!


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #4 - 31 October 2007, 22:33:41
Faut le faire dans post step si tu le veux constant... ??
Sais pas, me semble pas logique mais dormi 4 h
et programmé beaucoup...

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #5 - 31 October 2007, 22:38:43
Bon...je savais que c'était un problème con, mais je m'attendais pas à ca!
J'avais rienmis dans le postStep!!!

Merci Dan! (je devais pas etre tres reveille en codant ca...)


@++

MSL  


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #6 - 04 November 2007, 18:23:54
Bon...maintenant, j'ai ca:
Code: [Select]
SetAngularVel(AngularVel);

if (Guidance.bPitchUp)
{
GetAngularVel(AngularVel);
AngularVel.x-=0.1;
SetAngularVel (AngularVel);
}

GetAngularVel(AngularVel);

La fonction s'effectue bien aux deux premières frappes sur NUMPAD2. A la troisième, le vaisseau change subitement d'orientation.
Qqn a-t-il une ch'tite explication??



Message modifié ( 10-11-2007 22:01 )

@++

MSL  


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #7 - 04 November 2007, 21:51:47
Rien à faire: si AngularVel est trop grande, le vaisseau se bloque dans une certaine position, la seule chose à faire pour
arranger les choses: recommencer le scénario!


@++

MSL  


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #8 - 10 November 2007, 22:04:46
Maintenant avec les moteurs d'attitude...loraque j'appuie sur la bonne touche, rien ne se passe! Les exhausts apparaissent
mais le vaisseau ne se met pas en rotation! Dans le ScnEditor, sous Angular Velocity, j'ai ca pour x, y et z:

1.#QNAN0

Qu'est-ce que celà signifie???


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #9 - 10 November 2007, 23:11:57
J'ai l'impression que tu confond toujours *orientation* et *vitesse angulaire*
SetAngularVel s'occupe de la *vitresse angulaire* de ton vaisseau pas
de l'orientation.

Enleve tout tes testes et copie/colle ca dans "postStep" tu comprendra mieux:

Code: [Select]
VECTOR3 vAngularVel={0.05,0,0};
SetAngularVel (vAngularVel);

Ca le fait tourner à vitesse constante "cul par dessus tete" (axe X)
car tu à une vitesse angulaire de 0.05°/seconde. (à tester dans l'espace)

En bref si tu veux un pilote auto d'orientation il faut que tu teste
l'orientation puis applique différente vitesse jusqu'à qu'il soit bien
orienté.

Un bon moyen de faire ca par exemple pour le heading, c'est d'utiliser
justement la différence entre le heading voulu et le heading actuel et utiliser
ce chiffre pour un "retro feedback"

Le principe, je commence depuis le début pour que tu comprenne mieux:

Tu veux allez au 90° et ton nez est actuellement au 45°, pour passer de 45°
à 90° il faut tourner à droite, donc une vitesse angulaire positive sur l'axe Y
jusqu'a que tu soit au 90°

En pseudo code:

Code: [Select]
if(HeadingMaintenant<HeadingVoulu)   // notre nez pointe trop a gauche
{
       VECTOR3 vAngularVel={0,0.05,0};   // une vitesse angulaire constante de rotation vers la droite
       SetAngularVel (vAngularVel);
}
else  // notre nez pointe trop a droite
{
       VECTOR3 vAngularVel={0,-0.05,0};   // une vitesse angulaire constante de rotation vers la gauche
       SetAngularVel (vAngularVel);
}

Compris le gag ?

Mais l'a l'auto pilote est  vraiment pourri, il démarre instantanément (pas d'inertie)
et arrivé près du point voulu "sautillera" de gauche à droite autour du point.

En plus le probleme toujours avec les orientations c'est le passage de 0° a 360°
En bref si ton nez est a 350° (juste un peu a gauche de 0°) il va faire un tour
complet car 350° étant plus grand que zéro il va appliquer une rotation ver la gauche.

Donc il faut regler plusieurs probleme:

1-Ce débrouiller pour avoir dans une valeur la delta position en degré entre le heading voulu
et l'actuelle, ce delta quoiqu'il arrive doit représenter la différence absolue. Dans notre
cas de 350° actuel et 0° voulu tu devrais trouver 10°.  Si ton vaisseau est a 45° et que tu
veux aller a 350° ta valeur devra etre "-55°" (on veut pas faire le grand tour en passant par 180°)

compris ?

Tu pourra utiliser cette valeur directement pour la vitesse angulaire MAIS avec un damper
pour l'inertie ET un limiteur pour pas tourner à fond la caisse.

Un damper serais deja de diviser ton delta par 10 ou 100, plus tu approchera du point
voulu plus la vitesse angulaire ralentira.

un "limiteurs" ca ressemble à ca, une fois que tu a calculé ta vittese angulaire
à appliquer tu passe cette moulinette:

Code: [Select]
dVitesseRotationAxeY=min(0.05,max(-0.05,dVitesseRotationAxeY);
Quoiqu'il arrive "dVitesseRotationAxeY" ne pourra jamais etre plus grand que 0.05
ou plus petit que -0.05

Bon, tripote déjà un peu dans ce domaine...

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #10 - 13 November 2007, 21:31:11
Ok, merci, ca marche!

Juste 2 petites questions:

- T'es sur qu'il y a de l'inertie avec des gyroscopes?? (te marres pas, je suis un bleu du domaine)
- Comment peut-on faire en sorte qu'imfd par exemple reconnaisse cela??


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #11 - 13 November 2007, 23:16:14
Quote
MartySpaceLines a écrit:
- T'es sur qu'il y a de l'inertie avec des gyroscopes?? (te marres pas, je suis un bleu du domaine)

Certains, aucun mouvement de matiere n'est instantané, ce n'est d'ailleurs
pas naturel sinon. Si tu t'en tient au mouvement très(assez)  lent tu peux faire fi
de ce problème, il ce remarquera peu.


Quote
MartySpaceLines a écrit:
- Comment peut-on faire en sorte qu'imfd par exemple reconnaisse cela??

Aucun moyens à priori IMFD veut des thrusters pour pilote lui même je pense.

Comme on peut (presque) tout faire en prog tu pourrais declarer des faux thrusters "RCS"
avec zero puissance et récuperer les actions que fait IMFD dessus pour les appliquer
à tes gyroscopes. Si IMFD regarde la puissance des thrusters la c'est cuit.

C'est pas tout simple.

Dan



Message modifié ( 14-11-2007 01:21 )


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #12 - 14 November 2007, 21:08:36
Donc en fait ca serait presque plus simple de faire des rcs normaux sans exhaust!
(oui, je sais j'aurais pu le remarquer plus tot mais bon ;)


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #13 - 15 November 2007, 05:42:24
Si tu veux rester "compatible" et "standard" ... oui.

Mais certains coup les RCS ne sont pas applicable par exemple
au sol pour la rotation en fonction de la roulette avant.

Si tu fait des RCS qui sont supposés etre des gyros, connecte toi à
OrbiterSound et désactive les son RCS.

A++

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #14 - 15 November 2007, 20:27:35
Merci pour ces réponses

Juste...c quoi qui se passe lorsqu'on entend le bruit des rcs, mais que ceux-cis n'agissent pas??

Je crois que j'ai un peu trop bidouillé angularvel.
Dans le scenarioeditor, elle vaut toujours 1.#QNAN0.
j'ai un peu googelé la dessus et j'ai trouvé que c'était un truc du c++ (p.ex retour d'un double lorsqu'on attend un int ou
qqch comme ca)

Je me damande s'il reste pas des traces de setangularvel dans le code


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #15 - 16 November 2007, 04:47:47
Quote
MartySpaceLines a écrit:
Merci pour ces réponses

Juste...c quoi qui se passe lorsqu'on entend le bruit des rcs, mais que ceux-cis n'agissent pas??

Je crois que j'ai un peu trop bidouillé angularvel.
Dans le scenarioeditor, elle vaut toujours 1.#QNAN0.
j'ai un peu googelé la dessus et j'ai trouvé que c'était un truc du c++ (p.ex retour d'un double lorsqu'on attend un int
ou
qqch comme ca)

Je me damande s'il reste pas des traces de setangularvel dans le code


Fait une recherche "angularvel" dans tes sources (la methode ;) )

Le bruit des RCS ce déclenchent quand la command est actionnée zero poussée ou pas.
Tu peux desactiver ce son avec OrbiterSound.

A++

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #16 - 19 November 2007, 17:18:15
Recherche négative...(bizarre tout de même)

Je truc spécial, c'est que les rcs translation fonctionnent au poil...c'est juste la rotation qui pose problème!


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #17 - 19 November 2007, 18:28:46
Quote
MartySpaceLines a écrit:
Je truc spécial, c'est que les rcs translation fonctionnent au poil...c'est juste la rotation qui pose problème!

tu veux dire ca tourne pas comme prévu ? pour le sRCS rot c'est toujours la prise de tête
et il faut tre super-méticuleux. En plus il faut placer les thruster à egal distance du CG
seul les exhaust seront placé au bon endroit.

Dan


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #18 - 19 November 2007, 18:35:38
Quote
1.#QNAN0
NAN = Not A Number, j'en sais pas plus.

Quote
Tu peux desactiver ce son avec OrbiterSound
Pour désactiver un son tu peux utiliser SoundOptionOnOff3 (faut bien sûr être connecté avec orbitersound).
Par exemple:
SoundOptionOnOff3(MyID,PLAYATTITUDETHRUST,FALSE)

------------

no matter.

Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #19 - 19 November 2007, 20:35:39
Bon...je livre le code (peut-etre que vous y verrez plus clair)
Pour rappel: le problème est que lorsque les rcs en mode rotation sont activés, l'orientation du vaisseau ne change pas.
Dans le ScenarioEditor, les valeurs affichées dans Angularvel sont toutes: 1.#QNAN0
Merci pour vos réponses!! Elles m'ont déja été très utiles!
Désolé pour le manque de commentaires (pas encore trop fait ca)

VenusExpress.cpp
Code: [Select]
#ifndef __VENUSEXPRESS_H
#define __VENUSXPRESS_H

#include "orbitersdk.h"
#include "OrbiterSoundSDK35.h"
#include "SaveRestoreScenario.h"

//////////////////////////////////////////////////////////////
//Quelques constantes de VenusExpress
//////////////////////////////////////////////////////////////
const double VE_FUELMASS = 7.5e2;
const double VE_ISP = 2943;
const double VE_MAXMAINTH = 4.15e2;
const double VE_MAXRCSTH = 1.0e1;

class VenusExpress: public VESSEL2 {
public:
enum animStatut {ANIM_CLOSED, ANIM_OPEN, ANIM_CLOSING, ANIM_OPENING} ant_statut, arr_statut, arrRot_statut;//Statuts des anims

VenusExpress (OBJHANDLE hObj, int fmodel);

//Callbacks d'Orbiter
void clbkSetClassCaps (FILEHANDLE cfg);
void clbkPostStep (double simt, double simdt, double mjd);
int  clbkConsumeBufferedKey (DWORD key, bool down, char *keystate);
void clbkSaveState (FILEHANDLE scn);
void clbkLoadStateEx (FILEHANDLE scn, void *status);
void clbkPostCreation (void);

SaveRestoreScenario Scn;  // handle de la classe
int MyID; //ID du vaisseau pour OrbiterSound

void vDefineAnimations (void);
void vAnimAntenne (void);
void vAnimDeployArray (void);
void vAnimRotateArray (void);
~VenusExpress (void);



private:
UINT anim_ant, anim_arr, anim_arrRot, anim_ArrayLeft1, anim_ArrayLeft2, anim_ArrayLeft3, anim_ArrayLeft4, anim_ArrayRight1,
anim_ArrayRight2, anim_ArrayRight3, anim_ArrayRight4;
double ant_proc, arr_proc, arrRot_proc;
MGROUP_ROTATE *ArrayLeft1, *ArrayLeft2, *ArrayLeft3, *ArrayLeft4, *ArrayRight1, *ArrayRight2, *ArrayRight3, *ArrayRight4;
};
#endif // !__VENUSEXPRESS_H
#define SafeDelete(a) { if (a) {delete a; a = NULL; }}

clbkSetClassCap.cpp
Code: [Select]
#include "VenusExpress.h"

void VenusExpress::clbkSetClassCaps (FILEHANDLE cfg)
{
//Sauvegarde des variables des anims
Scn.InitClass ();
Scn.SavedVariable ("ANTENNA", &ant_proc);
Scn.SavedVariable ("ARRAYS", &arr_proc);
Scn.SavedVariable ("ARRAYSROT", &arrRot_proc);

vDefineAnimations ();

SetSize (0.5);
SetEmptyMass (700);
SetCW (0.3, 0.3, 0.6, 0.9);
SetCrossSections (_V(0.2,0.21,0.22));
SetPMI (_V(0.04, 0.0, 0.0));
SetCameraOffset (_V(0,0,0));
SetTouchdownPoints (_V(0,-0.2,-0.24), _V(-0.2,0.2,-0.24), _V(0.2,0.2,-0.24));

AddMesh ("VenusExpress");

PROPELLANT_HANDLE hpr = CreatePropellantResource (VE_FUELMASS, 1);
THRUSTER_HANDLE th_main, th_rcs[8], th_gyro[2];

th_main = CreateThruster (_V(0,0,-0.8), _V(0,0,1), VE_MAXMAINTH, hpr, VE_ISP);
CreateThrusterGroup (&th_main, 1, THGROUP_MAIN);
AddExhaust (th_main, 2, 0.1);

th_gyro[0] = CreateThruster (_V(0,1,0), _V(0,0,-1), VE_MAXRCSTH, hpr, VE_ISP);
th_gyro[1] = CreateThruster (_V(0,-1,0), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
CreateThrusterGroup (th_gyro, 2, THGROUP_ATT_PITCHUP);

th_rcs[0] = CreateThruster (_V(-0.76,0.76,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[1] = CreateThruster (_V(0.76,0.76,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[2] = CreateThruster (_V(-0.76,-0.76,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[3] = CreateThruster (_V(0.76,-0.76,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[4] = CreateThruster (_V(-0.68,0.68,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[5] = CreateThruster (_V(0.68,0.68,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[6] = CreateThruster (_V(-0.68,-0.68,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[7] = CreateThruster (_V(0.68,-0.68,-0.8), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
CreateThrusterGroup (th_rcs, 8, THGROUP_ATT_FORWARD);

AddExhaust (th_rcs[0], 0.3, 0.02);
AddExhaust (th_rcs[1], 0.3, 0.02);
AddExhaust (th_rcs[2], 0.3, 0.02);
AddExhaust (th_rcs[3], 0.3, 0.02);
AddExhaust (th_rcs[4], 0.3, 0.02);
AddExhaust (th_rcs[5], 0.3, 0.02);
AddExhaust (th_rcs[6], 0.3, 0.02);
AddExhaust (th_rcs[7], 0.3, 0.02);
}

clbkPostStep.cpp
Code: [Select]
#include "VenusExpress.h"

void VenusExpress::clbkPostStep (double simt, double simdt, double mjd)
{
if (ant_statut >= ANIM_CLOSING)
{
double da = simdt * 0.5;
if (ant_statut == ANIM_CLOSING)
{
if (ant_proc > 0.0)
ant_proc = max (0.0, ant_proc-da);
else                
ant_statut = ANIM_CLOSED;
}
else
{
if (ant_proc < 1.0)
ant_proc = min (1.0, ant_proc+da);
else                
ant_statut = ANIM_OPEN;
}
SetAnimation (anim_ant, ant_proc);
}



if (arr_statut >= ANIM_CLOSING)
{
double da = simdt * 0.05;
if (arr_statut == ANIM_CLOSING)
{
if (arr_proc > 0.0)
arr_proc = max (0.0, arr_proc-da);
else                
arr_statut = ANIM_CLOSED;
}
else
{
if (arr_proc < 1.0)
arr_proc = min (1.0, arr_proc+da);
else                
arr_statut = ANIM_OPEN;
}
SetAnimation (anim_arr, arr_proc);
}

if (arrRot_statut >= ANIM_CLOSING)
{
double da = simdt * 0.5;
if (arrRot_statut == ANIM_CLOSING)
{
if (arrRot_proc > 0.0)
arrRot_proc = max (0.0, arrRot_proc-da);
else                
arrRot_statut = ANIM_CLOSED;
}
else
{
if (arrRot_proc < 1.0)
arrRot_proc = min (1.0, arrRot_proc+da);
else                
arrRot_statut = ANIM_OPEN;
}
SetAnimation (anim_arrRot, arrRot_proc);
}
}

clbkConsumeBufferedKey.cpp
Code: [Select]
#include "VenusExpress.h"

int VenusExpress::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
if (!down)
return 0;

else
{
switch (key)
{
case OAPI_KEY_A:
vAnimAntenne ();
return 1;
case OAPI_KEY_G:
vAnimRotateArray();
return 1;
case OAPI_KEY_K:
vAnimDeployArray ();
return 1;
}
}
return 0;
}

Animations.cpp
Code: [Select]
#include "VenusExpress.h"

//////////////////////////////////////////////////////////////
//Déclaration des animations
//////////////////////////////////////////////////////////////
void VenusExpress::vDefineAnimations (void)
{
//Anim de l'antenne
static UINT uAntenne = 5;
static MGROUP_ROTATE Antenne (0, &uAntenne, 1, _V(0,-0.18,0.62), _V(1,0,0), (float)(RAD*90));
anim_ant = CreateAnimation (0.0);
AddAnimationComponent (anim_ant, 0, 1, &Antenne);

//Anim panneaux solaires (PARENT)
anim_arr = CreateAnimation (0.0);
ANIMATIONCOMPONENT_HANDLE parentLeft, parentRight;

//Anim panneaux solaires (GAUCHE)
static UINT uArrayLeft1 = 0;
ArrayLeft1 = new MGROUP_ROTATE (0, &uArrayLeft1, 1, _V(-0.8379773,0,0.378131), _V(0,1,0), (float)(RAD*90));
anim_ArrayLeft1 = CreateAnimation (0.0);
parentLeft = AddAnimationComponent (anim_arr, 0, 0.5, ArrayLeft1);

static UINT uArrayLeft2 = 1;
ArrayLeft2 = new MGROUP_ROTATE (0, &uArrayLeft2, 1, _V(-0.8526793,0,-0.2022336), _V(0,-1,0), (float)(RAD*180));
anim_ArrayLeft2 = CreateAnimation (0.0);
parentLeft = AddAnimationComponent (anim_arr, 0, 0.5, ArrayLeft2, parentLeft);

static UINT uArrayLeft3 = 8;
ArrayLeft3 = new MGROUP_ROTATE (0, &uArrayLeft3, 1, _V(-0.8821518,0,0.5579591), _V(0,1,0), (float)(RAD*180));
anim_ArrayLeft3 = CreateAnimation (0.0);
parentLeft = AddAnimationComponent (anim_arr, 0, 0.5, ArrayLeft3, parentLeft);

static UINT uArrayLeft4 = 7;
ArrayLeft4 = new MGROUP_ROTATE (0, &uArrayLeft4, 1, _V(-0.9117209,0,-0.20223367), _V(0,-1,0), (float)(RAD*180));
anim_ArrayLeft4 = CreateAnimation (0.0);
parentLeft = AddAnimationComponent (anim_arr, 0, 0.5, ArrayLeft4, parentLeft);

//Anim panneaux solaires (DROITE)
static UINT uArrayRight1 = 2;
ArrayRight1 = new MGROUP_ROTATE (0, &uArrayRight1, 1, _V(0.8379773,0,0.378131), _V(0,-1,0), (float)(RAD*90));
anim_ArrayRight1 = CreateAnimation (0.0);
parentRight = AddAnimationComponent (anim_arr, 0, 0.5, ArrayRight1);

static UINT uArrayRight2 = 3;
ArrayRight2 = new MGROUP_ROTATE (0, &uArrayRight2, 1, _V(0.8526793,0,-0.2022336), _V(0,1,0), (float)(RAD*180));
anim_ArrayRight2 = CreateAnimation (0.0);
parentRight = AddAnimationComponent (anim_arr, 0, 0.5, ArrayRight2, parentRight);

static UINT uArrayRight3 = 9;
ArrayRight3 = new MGROUP_ROTATE (0, &uArrayRight3, 1, _V(0.8821518,0,0.5579591), _V(0,-1,0), (float)(RAD*180));
anim_ArrayRight3 = CreateAnimation (0.0);
parentRight = AddAnimationComponent (anim_arr, 0, 0.5, ArrayRight3, parentRight);

static UINT uArrayRight4 = 10;
ArrayRight4 = new MGROUP_ROTATE (0, &uArrayRight4, 1, _V(0.9117209,0,-0.20223367), _V(0,1,0), (float)(RAD*180));
anim_ArrayRight4 = CreateAnimation (0.0);
parentRight = AddAnimationComponent (anim_arr, 0, 0.5, ArrayRight4, parentRight);

//Anim panneaux (ROTATION DE BASE)
static UINT uGrpArrays[8] = {0,1,2,3,7,8,9,10};
static MGROUP_ROTATE Arrays (0, uGrpArrays, 8, _V(0,0,0.3779513), _V(-1,0,0), (float)(RAD*90));
AddAnimationComponent (anim_arr, 0.55, 1, &Arrays);

//Anim rotation des panneaux (oriantation vers le soleil)
anim_arrRot = CreateAnimation (0.0);
static MGROUP_ROTATE RotateArrays (0, uGrpArrays, 8, _V(0,0,0.3779513), _V(-1,0,0), (float)(RAD*45));
AddAnimationComponent (anim_arrRot, 0, 1, &RotateArrays);
}
//
//////////////////////////////////////////////////////////////
//Anim antenne
//////////////////////////////////////////////////////////////
void VenusExpress::vAnimAntenne (void)
{
ant_statut = ((ant_statut == ANIM_CLOSED || ant_statut == ANIM_CLOSING) ?
ANIM_OPENING : ANIM_CLOSING);
}
//
//////////////////////////////////////////////////////////////
//Anim déploiement des panneaux
//////////////////////////////////////////////////////////////
void VenusExpress::vAnimDeployArray(void)
{
if (arrRot_statut == ANIM_CLOSED)
{
arr_statut = ((arr_statut == ANIM_CLOSED || arr_statut == ANIM_CLOSING) ?
ANIM_OPENING : ANIM_CLOSING);
}
}
//
//////////////////////////////////////////////////////////////
//Anim rotation des panneaux
//////////////////////////////////////////////////////////////
void VenusExpress::vAnimRotateArray(void)
{
if (arr_statut == ANIM_OPEN)//On ne peut pas rotationner les panneaux s'ils ne sont pas déployés
{
arrRot_statut = ((arrRot_statut == ANIM_CLOSED || arrRot_statut == ANIM_CLOSING) ?
ANIM_OPENING : ANIM_CLOSING);
}
}

ModuleOrbiter.cpp
Code: [Select]
#define STRICT
#define ORBITER_MODULE

#include "VenusExpress.h"

VenusExpress::VenusExpress (OBJHANDLE hObj, int fmodel) : VESSEL2 (hObj, fmodel)
{
ant_proc = 0;
ant_statut = ANIM_CLOSED;
arr_proc = 0;
arr_statut = ANIM_CLOSED;
arrRot_proc = 0;
arrRot_statut = ANIM_CLOSED;
vDefineAnimations ();
}
// --------------------------------------------------------------
// Vessel initialisation
// --------------------------------------------------------------
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
return new VenusExpress (hvessel, flightmodel);
}
// --------------------------------------------------------------
// Vessel cleanup
// --------------------------------------------------------------
DLLCLBK void ovcExit (VESSEL *vessel)
{
if (vessel) delete (VenusExpress*)vessel;
}

VenusExpress::~VenusExpress (void)
{
SafeDelete(ArrayLeft1);
SafeDelete(ArrayLeft2);
SafeDelete(ArrayLeft3);
SafeDelete(ArrayLeft4);

SafeDelete(ArrayRight1);
SafeDelete(ArrayRight2);
SafeDelete(ArrayRight3);
SafeDelete(ArrayRight4);

}

OrbiterSound35.cpp
Code: [Select]
#include "VenusExpress.h"

void VenusExpress::clbkPostCreation()
{
MyID=ConnectToOrbiterSoundDLL3(GetHandle());
SoundOptionOnOff3(MyID,PLAYATTITUDETHRUST,FALSE);
}

et enfin SaveLoadScenario.cpp
Code: [Select]
#include "VenusExpress.h"

void VenusExpress::clbkLoadStateEx (FILEHANDLE scn, void *vs)
{
char *line;

while (oapiReadScenario_nextline (scn, line))
{
if(Scn.LoadScenario (line) == TRUE)
continue;

ParseScenarioLineEx (line, vs);
}
SetAnimation (anim_ant, ant_proc);
SetAnimation (anim_arr, arr_proc);
SetAnimation (anim_arrRot, arrRot_proc);
}

void VenusExpress::clbkSaveState (FILEHANDLE scn)
{
VESSEL2::clbkSaveState (scn);
Scn.SaveScenario (scn);
}

voila, c'est tout (ouf;)



Message modifié ( 19-11-2007 20:37 )

@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #20 - 19 November 2007, 21:11:25
Je dirais VE_MAXRCSTHR beaucoup trop faible

1.0e1 c'est ... 10 ;)

Dan


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #21 - 19 November 2007, 21:18:21
Beeeeeeeep! Merci d'avoir joué avec nous!
Non, dsl c'est pas ca. J'avais essayé de mettre les memes valeurs que pour shuttlePB mais ca changeait rien.
Pour le 10, voici la page à laquelle je me suis fiée:
Y disent bien 10N pour les rcs:
http://www.esa.int/SPECIALS/Venus_Express/SEMEE3808BE_0.html

Je sais sa parait ridicule mais c'est véridique!


@++

MSL  


Offline DanSteph

  • Administrator
  • Legend
  • *****
  • Posts: 15407
  • Karma: 256
  • Hein, quoi !?
    • FsPassengers
Reply #22 - 19 November 2007, 22:08:24
A ben oui, c'est les vecteurs: _V(0,0,1)

Code: [Select]
th_rcs[0] = CreateThruster (_V(-0.76,0.76,-0.8 ),  _V(0,0,1),VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[1] = CreateThruster (_V(0.76,0.76,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[2] = CreateThruster (_V(-0.76,-0.76,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[3] = CreateThruster (_V(0.76,-0.76,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[4] = CreateThruster (_V(-0.68,0.68,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[5] = CreateThruster (_V(0.68,0.68,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[6] = CreateThruster (_V(-0.68,-0.68,-0.8 ), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
th_rcs[7] = CreateThruster (_V(0.68,-0.68,-0.8 ), _V(0,0,1) , VE_MAXRCSTH, hpr, VE_ISP);

La il poussent tous en +Z  _V(0,0,1)

Tu dois avoir des x,-x,y,-y,z,-z  (_V(-1,0,0) etc etc )

Regarde sur le PB

Dan



Message modifié ( 19-11-2007 22:09 )


Offline MartySpaceLines

  • Legend
  • ******
  • Posts: 1096
  • Karma: 0
Reply #23 - 20 November 2007, 16:37:41
Quote
DanSteph a écrit:
La il poussent tous en +Z  _V(0,0,1)

Tu dois avoir des x,-x,y,-y,z,-z  (_V(-1,0,0) etc etc )

Regarde sur le PB

Dan

Bon...je pense que je vais fournir quelques explications. Ces rcs, ce sont 4 groupes de 2 petits moteurs situés derrière VE,
pour faire les petites corrections de trajectoire.

Ce que je voulais faire, c'est modéliser des gyroscopes, uniquement pour l'orientation:

Code: [Select]
th_gyro[0] = CreateThruster (_V(0,1,0), _V(0,0,-1), VE_MAXRCSTH, hpr, VE_ISP);
th_gyro[1] = CreateThruster (_V(0,-1,0), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
CreateThrusterGroup (th_gyro, 2, THGROUP_ATT_PITCHUP);

Je n'ai pas encore fait ceux pour les autres mouvements, je veux d'abord que ceux-cis fonctionnent ;)


@++

MSL  


Offline no matter

  • Legend
  • ******
  • Posts: 2826
  • Karma: 1
Reply #24 - 21 November 2007, 08:09:34
Quote
th_gyro[0] = CreateThruster (_V(0,1,0), _V(0,0,-1), VE_MAXRCSTH, hpr, VE_ISP);
th_gyro[1] = CreateThruster (_V(0,-1,0), _V(0,0,1), VE_MAXRCSTH, hpr, VE_ISP);
CreateThrusterGroup (th_gyro, 2, THGROUP_ATT_PITCHUP);
Là, à mon avis ils sont trop proche du centre de gravité au regard de leur faible poussée (bon, çà dépend des dimensions de venus express, j'ai pas çà en mémoire...).

Pourquoi ne pas essayer:

th_gyro[0] = CreateThruster (_V(0, 1,-1), _V(0,-1,0), VE_MAXRCSTH, hpr, VE_ISP);
th_gyro[1] = CreateThruster (_V(0,-1, 1), _V(0,1,0), VE_MAXRCSTH, hpr, VE_ISP);
CreateThrusterGroup (th_gyro, 2, THGROUP_ATT_PITCHUP);

en bleu: remplace par la coordonnée sur z de l'avant et de l'arrière de ta sonde.



Message modifié ( 21-11-2007 11:34 )

------------

no matter.