0 Members and 1 Guest are viewing this topic.
Mon train rentre et sort seul au décollage et à l'atterrissage en l'asservissant à l'altitude et au sens de la vitesse de montée et je suis assez content de moi. Il me reste à faire des tests plus complets pour voir qu'il n'y a pas de blocage possible.
Papyref a écrit:C'est utopique mais assez complet pour se faire la main.
(j'ajouterai peut être un bip d'alarme)
Papyref a écrit:Je vais attaquer le bras robotique et ça sera peut être un peu plus délicat !
void Hercule::RevertPorte (){ if (Porte_status == DOOR_CLOSED|| Porte_status == DOOR_CLOSING) { Porte_status = DOOR_OPENING; } else if (Porte_status == DOOR_OPENING|| Porte_status == DOOR_OPEN) { Porte_status = DOOR_CLOSING; }}
void Hercule::RevertPorte (){ Porte_status = ((Porte_status == DOOR_CLOSED|| Porte_status == DOOR_CLOSING)? DOOR_OPENING:DOOR_CLOSING);}
void Hercule::RevertPorte (){ if (Porte_status == DOOR_CLOSED|| Porte_status == DOOR_OPEN) { Porte_status = DOOR_OPENING; } else if (Porte_status == DOOR_OPENING|| Porte_status == DOOR_OPEN) { Porte_status = DOOR_CLOSING; }}
dAvantBras_proc // de 0 a 1, variable passée à SetAnimation, position de l'avant bras dAvantBras_request // de 0 a 1, variable qui demande une position de l'avant bras.
// Bouge l'avant bras d'après la valeur demandée "dAvantBras_request"if(dAvantBras_proc<dAvantBras_request){ dAvantBras_proc+=0.1f;}else{ dAvantBras_proc-=0.1f;}SetAnimation(bidule,dAvantBras_proc);
// Bouge l'avant bras d'après la valeur demandée "dAvantBras_request"if(dAvantBras_Request!=dAvantBras_Proc){ double dg =simdt*0.02f; // vitesse en fonction du FPS if(dAvantBras_Proc<dAvantBras_Request-dg) { dAvantBras_Proc+=dg; } else if(dAvantBras_Proc>dAvantBras_Request+dg) { dAvantBras_Proc-=dg; } else { // la valeur est très proche, met la egale donc // désactive ce bloque d'animation la prochaine boucle dAvantBras_Proc=dAvantBras_Request; } SetAnimation (uAnim_AvantBras , dAvantBras_Proc);}
// Bouge l'avant bras d'après la valeur demandée "dAvantBras_request"// demande de 0° a 360°if(dAvantBras_Request!=dAvantBras_Proc){ // protection contre une valeur request "out of range" // limite a 0-360 la valeur. dAvantBras_Request=min(360,max(0,dAvantBras_Request)); double dg =simdt*5.0f; // vitesse en fonction du FPS if(dAvantBras_Proc<dAvantBras_Request-dg) { dAvantBras_Proc+=dg; } else if(dAvantBras_Proc>dAvantBras_Request+dg) { dAvantBras_Proc-=dg; } else { // la valeur est très proche, met la egale donc // désactive ce bloque d'animation la prochaine boucle dAvantBras_Proc=dAvantBras_Request; } SetAnimation (uAnim_AvantBras , dAvantBras_Proc/360.0f);}
ProcessBrasAnimation(UINT NoAnimation,double * dProc,double *dRequest)
ProcessBrasAnimation(uAnim_AvantBras,&dAvantBras_Proc,&dAvantBras_Request);ProcessBrasAnimation(uAnim_Bras, &Bras_Proc, &Bras_Request);ProcessBrasAnimation(uAnim_Epaule, &dEpaule_Proc, &dEpaule_Request);ProcessBrasAnimation(uAnim_Poignet, &dPoignet_Proc, &dPoignet_Request);
if(dAvantBras_Request!=dAvantBras_Proc) ProcessBrasAnimation(uAnim_AvantBras,&dAvantBras_Proc,&dAvantBras_Request);if(Bras_Request!=Bras_Proc) ProcessBrasAnimation(uAnim_Bras, &Bras_Proc, &Bras_Request);if(dEpaule_Proc!=dEpaule_Request) ProcessBrasAnimation(uAnim_Epaule, &dEpaule_Proc, &dEpaule_Request);if(dPoignet_Request!=dPoignet_Proc) ProcessBrasAnimation(uAnim_Poignet, &dPoignet_Proc, &dPoignet_Request);
Papyref a écrit:Moi aussi je trouve que j'écris trop de lignes mais il faut d'abord que ça marche et ensuite on peut envisager de faire plus sioux avec l'expérience.
Papyref a écrit:Il faut s'oxygener les méninges C++sûr sinon mon vieux cerveau va perdre beaucoup trop de neurones
brainstorm a écrit:hum moins de 10 % parait il ....
case OAPI_KEY_LEFT: // Deplacement longitudinal avant de la rotule if (dShiftZ_request <= 0.95) dShiftZ_request = dShiftZ_request + 0.05; return 1;case OAPI_KEY_RIGHT: // Deplacement longitudinal arrière de la rotule if (dShiftZ_request >= 0.05) dShiftZ_request = dShiftZ_request - 0.05; return 1;
// ne traite que quand la touche est enfoncée pas quand elle remonte if (!down) return 0;
int Hercule::clbkConsumeDirectKey(char *kstate){ if(KEYDOWN(kstate,OAPI_KEY_T) { // si ici, touche T appuyée en ce moment }}
int Hercule::clbkConsumeDirectKey(char *kstate){ if(KEYDOWN(kstate,OAPI_KEY_LEFT) { dAvantBras_Request=dAvantBras_Proc+0.05; dAvantBras_Request=min(1.0,max(0.0,dAvantBras_Request)); // limite } else if(KEYDOWN(kstate,OAPI_KEY_RIGHT) { dAvantBras_Request=dAvantBras_Proc-0.05; dAvantBras_Request=min(1.0,max(0.0,dAvantBras_Request)); // limite }}
case OAPI_KEY_SPACE: // Controle du bras demandé ou non par CTRL + SPACEBAR // La variable iControlBras va servir d'inverseur // A 1 le bras est sous controle, a 0 il ne l'est pas iControlBras = iControlBras + 1; if (iControlBras >1) { iControlBras =0 ; } return 1; } case OAPI_KEY_UP: // On cycle avec la fléche UP pour choisir quelle partie du bras // sera controlée par les fléches LEFT et RIGHT if (iControlBras == 1) { iControlPartBras = iControlPartBras + 1; if (iControlPartBras >7) { iControlPartBras =1 ; } } }
int Hercule::clbkConsumeDirectKey (char*kstate){if (iControlBras == 1) // Le bras est sous controle pour la translation longitudinale{ if(KEYDOWN (kstate,OAPI_KEY_LEFT) && iControlPartBras == 1) // La partie 1 est choisie { dShiftZ_request = dShiftZ_proc + 0.01; dShiftZ_request = min(1.0,max(0.0,dShiftZ_request)); } else if(KEYDOWN (kstate,OAPI_KEY_RIGHT)&& iControlPartBras == 1) { dShiftZ_request = dShiftZ_proc - 0.01; dShiftZ_request = min(1.0,max(0.0,dShiftZ_request)); }
bool bControlBras = false; if (bControlBras) //Si bControlBras est true { ... } if (!bControlBras) //Si bControlBras est false { ... }
iControlBras = iControlBras + 1; //Très long...
iControlBras++;
iControlBras--;
Les variables iControlBras et iControlPartBras sont des entiers mais je dois écrire iControlBras ==1 et iControlPartBras ==1 pour que ça marche.