Desenvolvimento do simulador de espaçonave Soyuz TMA

Olá! Somos a equipa do simulador Soyuz TMA, um programa que simula o voo orbital da nave Soyuz e da Estação Espacial Internacional, encontro e atracação da nave espacial com a ISS, bem como desacoplamento e descida. Tudo isso é simulado tanto no modo automático (ou seja, sob o controle dos modelos de equipamentos de bordo do Sistema de Controle de Movimento) e nos modos de voo manual, que são idênticos em sua composição algorítmica e lógica aos usados ​​a bordo da espaçonave Soyuz TMA.





" " C++ Builder 6. , VS - , , " " , , (Qt, VS).





- , , , .





- " ". , , . , . , , , , . .





:





  1. :





    • (Jxx, Jyy, Jzz, Jxy, Jyz, Jzx) - . , .





    • ( ).





    • .





  2. :





    • .





    • J2000.





  3. :





    • ( ).





    • (, , ).





    • (Wx, Wy, Wz).





  4. :





    • ( ).





    • .





    • .





    • .





    • .









:





Formato "Entrada NU" - Complexo
" " -













, -, , , , .





- , . , TSaveDialog TOpenDialog. ini (TIniFile), . .





( , ) .









Recibo para carregar as condições iniciais de um arquivo

, .





//    
struct{
////     ////
TDateTime nu_day;                   // 2    /
////    ////
double vec_j2000_mks[3];                // 8      ..   J2000 (X, Y, Z)
double vel_j2000_mks[3];                // 11       ..         J2000 (X, Y, Z)
double Q_mks[4];                        // 14                                                  0  1  2
double w_j2000_mks[3];                  // 18        J2000      (Wx Wy Wz)
double vec_mks_PC[3];                   // 21      ..             (X, Y, Z)
double m_mk;                            // 24   
double mi_mks[3][3];                    // 25       (Jxx, Jxy, Jxz...)
////   ////
double vec_j2000_tk[3];                 // 34     ..   J2000 (X, Y, Z)
double vel_j2000_tk[3];                 // 37       ..         J2000 (X, Y, Z)                   0   1   2   3
double Q_tk[4];                         // 40         J2000 (Qs, Qx, Qy, Qz)
double w_j2000_tk[3];                   // 44        J2000      (Wx Wy Wz)
double vec_tk_TPK[3];                   // 47      ..    /         (X, Y, Z)
double m_tk;                            // 50   
double mi_tk[3][3];                     // 51       (Jxx, Jxy, Jxz...)
//// M I S C ////
double vec_solar[3];                    // 60      J2000      J2000 (ex, ey, ez)
unsigned long r_st_mks;                 // 63    
unsigned long n_su_4_dk;                // 64     ,      (,  )
unsigned long nu_otor_switch_styk_dk;	  // 65  № ,     (    )
double tk_top_zap;                      // 66     ( +)
double mks_top_zap;                     // 67     (  +)
unsigned long pr_doking;                // 68         
unsigned long nr_sudn;                  // 69      
} NU_temp;

//   
static bool USO_Booled[20][16];         //   (  _ .. 3.7)

      
      



(. . - ISBN 5-7038-2178-9), ( SoyCOM) , .





SGP4, ( TLE - ).





() UI , "" -





"-16". ().





, .





: () 15- ( + / -), "" - . . :





  • / ( 16- ).





  • ( ).





  • .





  • / .





, , .





, - , "" ( 246), (1-1) ( , () ). 20.





C++ Builder 6 Visual Studio (, MFC + OpenGL ) (***_form.cpp) , /. :





, ON, brvi_on = true;





void __fastcall TIrBrForm::brvi_on_btnClick(TObject *Sender)
{
brvi_on=true;           //   
Panel1->Color=clLime;   //      
}
      
      



- , , , , . . - , №228

















14









15









17









18





"0"





30





"1"





31

















24









25









27









28









04









05





TPanel, Caption. - . "1":





void __fastcall TIrBrForm::brvi_btn_1Click(TObject *Sender)
{
if(brvi_on){
USO_BitType[16][3] = 0111;
if(i1->Caption=="")
        i1->Caption="1";
else if(i2->Caption=="")
        i2->Caption="1";
else if(i3->Caption=="")
        i3->Caption="1";
else if(i4->Caption=="")
        i4->Caption="1";
else if(i5->Caption=="")
        i5->Caption="1";
else if(i6->Caption=="")
        i6->Caption="1";
else if(i7->Caption=="")
        i7->Caption="1";
else if(i8->Caption=="")
        i8->Caption="1";
else if(i9->Caption=="")
        i9->Caption="1";
else if(i10->Caption=="")
        i10->Caption="1";
else if(i11->Caption=="")
        i11->Caption="1";
else if(i12->Caption=="")
        i12->Caption="1";
else if(i13->Caption=="")
        i13->Caption="1";
else if(i14->Caption=="")
        i14->Caption="1";
else {}
}
}
      
      



, for, . . , "", , "".





, :





void __fastcall TIrBrForm::isp_btnClick(TObject *Sender)
{
if(brvi_on) { //   
if(i1->Caption==""&&i2->Caption==""){  //      ,
i1->Caption=="A";     //   
i2->Caption=="A";
JPS(3,is_irvi,is_operator,"","");  //    
} else {              //  ( 1  2  )
AnsiString brvi_msg = i1->Caption+i2->Caption+i3->Caption+i4->Caption+    //      
i5->Caption+i6->Caption+i7->Caption+i8->Caption+i9->Caption+i10->Caption+
i11->Caption+i12->Caption+i13->Caption+i14->Caption+i15->Caption;
JPS(1,is_operator,is_irvi,brvi_msg,"");
Timer1->Enabled=true;  //    
//    
i1->Caption="";
i2->Caption="";
i3->Caption="";
i4->Caption="";
i5->Caption="";
i6->Caption="";
i7->Caption="";
i8->Caption="";
i9->Caption="";
i10->Caption="";
i11->Caption="";
i12->Caption="";
i13->Caption="";
i14->Caption="";
i15->Caption="";

irvi_string = brvi_msg; //     

ChekIrvi(irvi_string); }} else  //   
JPS(3,is_miu,is_operator,cmd_brvi_error,"");   //   
}

      
      



, AnsiString irvi_string. ChekIrvi :





void ChekIrvi (AnsiString irvi_str){
if(irvi_str.IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
irvi_type.mode = StrToInt(irvi_str.SubString(1,2)); //       ""
switch (irvi_type.mode) {   //  
        case 00: /*      - 1 - 4 */ break;
        case 04: /*   10-  */ break;
        case 05: /*   8-  */ break;
        case 10: /*    */   break;           // Arg addr RUS AUS data?
        case 11: /*    1-  */  break;
        case 12: /*    2-  */  break;
        case 14: /*   10-  */                       //   14, 
                 if((irvi_str.SubString(3,5)).IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   //   
                 if(CorrectAddr(irvi_type.addr)) {                     //   ,  , 
                 if((irvi_str.SubString(8,7)).IsEmpty())JPS(3,is_miu,is_operator," !",""); else {
                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  //  
                 ArgonMemoryType[irvi_type.addr] = irvi_type.value;    //      
                 SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z );   //    
                 JPS(4,is_argon,is_irvi,"  "+               //   (  )
                 IntToStr(irvi_type.value)+"   "+IntToStr(irvi_type.addr),"");}}
                 else {                                                 //     ,
                 irvi_err = true;
                 JPS(3,is_argon,is_operator,arg_addr_error,"");     } }  //      16
                 break;
        case 15: /*   8-  */  break;
        case 17: /*   10-  */ break;
        case 18: /*   8-  */
                // irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   //   
                 // if(CorrectAddr(irvi_type.addr)) {                    //   ,  , 
                 //irvi_type.value = StrToInt(irvi_str.SubString(8,7));  //  
                // ArgonMemoryType[irvi_type.addr] = irvi_type.value;   //      
                 //SetItvi(irvi_type.mode,(irvi_type.addr)+1,ArgonMemoryType[irvi_type.addr], irvi_type.z );   //    
                 //mode18act=true;
                 break;
        case 21: /*    1-  */ break;
        case 22: /*    2-  */ break;
        case 24: /*   10-  */                      //   24, 
                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   //     
                 if(CorrectAddr(irvi_type.addr)) {                     //   ,  , 
                 SetItvi(irvi_type.mode,irvi_type.addr,ArgonMemoryType[irvi_type.addr], irvi_type.z ); }  //    
                 else   {                                               //     ,
                 irvi_err = true;
                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }     //      16
                 break;
        case 25: /*   8-  */ break;
        case 27: /*   10-  */ break;
        case 28: /*   8-   */break;
        case 30: /*      -   */
                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   //     
                 if(CorrectAddr(irvi_type.addr)) {                     //   ,  , 
                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  //  
                 mode_30(irvi_type.addr,irvi_type.value); }             //    
                 else   {                                              //     ,
                 irvi_err = true;
                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }    //      16
                 break;
        case 31: /*      -   */
                 irvi_type.addr = StrToInt(irvi_str.SubString(3,5));   //     
                 if(CorrectAddr(irvi_type.addr)) {                     //   ,  , 
                 irvi_type.value = StrToInt(irvi_str.SubString(8,7));  //  
                 mode_31(irvi_type.addr,irvi_type.value); }             //    
                 else   {                                              //     ,
                 irvi_err = true;
                 JPS(3,is_argon,is_operator,arg_addr_error,"");   }    //      16
                 break;
        case 40: /*  */ break;
        case 41: /*  */ break;
        case 42: /*  */ break;
        case 43: /*  */ break;
        case 44: /*  */ break;
        case 45: /*  */ break;
        case 46: /*  */ break;
        case 48: /*   */
        break;
        default: irvi_err = true;       //   (   )
                 JPS(3,is_argon,is_irvi,"","");        //     
                 JPS(3,is_miu,is_operator," !","");
        irvi_type.addr = StrToInt(irvi_str.SubString(3,5));
        irvi_type.value = StrToInt(irvi_str.SubString(8,7));
        break;
} } }

      
      



/ , . , :





(, , .) .





"-16", " 16", :





( ), ( , .. 2 - UDP), , (.. 2 3) . . TLabel , .





( ) ( ).





, , - . "-" . - , , . :









, , - №219 ( № 5.19, № 5.1)





.. . , . - () , (), , . , , "", "7". , , "" .





, , :





, - , , () . , 11 " 4" 15 " 15" 13 " 8".





.





static bool KSP_Booled[16][9];
      
      



, , true, . 7 " " KSP_Booled[0][6]=true;



, KSP_Booled[0][6]=1 , , , " ", :





//  ,    7
 ...
   if (KSP_Let[0]){ //                                  
   KSP_Booled[0][6]=true;                          //    7 - 
   JPS(1,is_operator,is_miu,is_ksp,"7"); } else   //   
 ... 

//  uso_model.cpp  USO_work
 ...
     if(KSP_Booled[0][6]) { // A 7
        KSP_Booled[0][6] = false;
        // 95     
        USO_Booled[0][3]=true;
        kdu_sdd = false;
     }
 ...
 
//   -   
 ...
  if(USO_Booled[0][3]){  // KSP A7
  A7_LABEL->Color=clLime;
  A7_LABEL->Font->Color=clBlack;  } else {
  A7_LABEL->Color=clGreen;
  A7_LABEL->Font->Color=clYellow; }
 ...  
      
      



Assim, implementamos a lógica padrão de trabalho com PCB e USO, é claro, se há pessoas que entendem a USO da espaçonave Soyuz que encontraram um erro em nossa interpretação da lógica de trabalho com PCB, corrija-nos, porque não temos materiais sobre USO e construímos essa lógica estudando o trabalho dos modelos do InPU e o manual para trabalhar com o sistema Neptune-ME.





Acho que são muitas informações para um post, então descreverei o restante dos formatos no próximo post.








All Articles