Attitude Reference Systems

Gyro Platform

The bottom synchro is a stable gyro reference platform upon which rests an error synchro which corrects the compass card to the Earth's magnetic field. The card position is monitored by the upper synchro which takes into account the fact that the card can be turned manually as well as by the error synchro. Gyrocompass is simulated by the following 'C' function (excluding circuit breaker logic):

Gyro(double et) {
  #define T       ????         //annunciator's tick-tock constant
  #define FSD     ????         //annunciator's full-scale deflection
  #define HALFDEG .008725      //½° in radians
  #define ERRDEC .002908333    //10°/min card error decrement constant in radians/second
  static int AnnDecr = T;      //Use Annunciator tick-tock constant as iterative decrement 

  /*If the compass card is within half a degree of indicating 
    the correct magnetic heading, make the annunciator 
    tick-tock, otherwise set it a full scale deflection. */

  if( (double CardErr = BipAng(Air.CardHdg - Air.Hdg - Air.MagVar)) < HALFDEG ) {
    if(Air.Ann > +FSD)         //if annunciator > full scale +ve
      AnnDecr = -T;            //make deflection decrementer -ve
    else 
      if(Air.Ann < -FSD)       //if annunciator < full scale -ve
        AnnDecr = +T;          //make deflection decrementer +ve
    Air.Ann += AnnDecr * et;   //Decrement annunciator by the
  }                            //amount of the tick-tock constant
  else                         //Else set annunciator to
   Ann = FSD;                  //full scale deflection
  double ErrDec = ERRDEC * et; //amount to decrement the card 
                               //error this program pass
  if(CardErr > 0)              //A +ve error requires a -ve
    ErrDec = -ErrDec;          //decrement and vice versa.
  Air.CardHdg += ErrDec;       //Advance card heading towards magnetic heading
}

Pitch & Roll

Pitch and roll information is provided by 3 gyro platforms:
  System 0   the auxiliary gyro
  System 1   the captain's main gyro
  System 2   the first officer's main gyro
The auxiliary can be switched in place of either of the other gyros. The transfer switch is a 28 volt dc relay supplied through its own circuit breaker. Each gyro is powered from the appropriate 115 volt ac bus via its own circuit breaker.

The captain and first officer each have an attitude reference indicator containing a sphere which shows the current attitude (pitch and roll) of the aircraft. These are each powered through their own circuit breakers from the appropriate 115 volt ac bus. If an instrument or the gyro supplying it with attitude information is off or faulty, a physical warning flag drops into view within the instrument window.

The captain or first officer can check the integrity of his gyro and instrument synchros by putting it through a 'precess' cycle. This causes the sphere to precess exponentially from the level-flight indication to an indication of 90-degrees of both pitch and roll. The precess cycle, as illustrated by the adjacent graph, takes about 10 seconds to complete.

Assuming the equipment is working properly, the sphere then drops back to indicate the aircraft's current pitch and roll. The precess cycle is controlled by the precess state flag as follows:

GyroState = 0  gyro just switched on or has been warm-reset
            1  gyro has erected and is working OK
            2  gyro has failed
The following data has to be maintained independently for each gyro system. The data structures for the auxiliary gyro (system 0), the captain's main gyro (system 1) and the first officer's main gyro (system 2) are accessed through the array of pointers *Gx[ ]. Data relating to the horizon instruments is in the captain's (NAV1) or the first officer's (NAV2) RxData structure as appropriate.
struct GyroData {
  int Status;     //stage in the gyro precess cycle (see above)
  double Pre[2];  //current gyro pitch & roll precess angles
  BOOL GyroCB;    //gyro's 115volt a.c. circuit breaker state
  BOOL Erect;     //TRUE = gyro erected OK, FALSE = gyro failed
} *Gx[3];
A 'C' function which simulates the gyro's precessing cycle is shown below. This function is entered separately for pitch and for roll for each gyro system.
double GyroPrecess (
  struct GyroData *g,           //pointer to data struct of Gyro 0, 1, 2
  int i,                        //pitch/roll index:  0 = pitch, 1 = roll
  double et                     //elapsed time since last program pass
) {
  #define INIT  .0001           //gyro angle at start of precess cycle
  #define K    1.5              //precess iterative multiplying factor

  double pre = *(g->Pre + i);   //gyro's current precess angle

  /* If this gyro has just been switched on or reset, 
     set its precess angle to its initial 'seed' value 
     and advance the gyro to its 'precessing' state. */

  if(g->Status) == 0) { pre = INIT; g->Status = 1; }

  /* Else if this gyro is currently in its precessing 
     cycle and it has not yet precessed 90 degrees, 
     multiply its current precess angle by 90 degrees. */

  else if((g->Status == 1) && (pre < HalfPi)) {
    pre *= (K * et);

    /* If, as a result, the precess angle has now overshot
       its 90° limit, set it to its 90° limit and then
       advance the gyro to its 'precess completed' state. */

    if(pre > HalfPi) { pre = HalfPi; g->Status = 2; }
  }
  *(g->Pre + i) = pre;   //store updated precess angle ready
  return(pre);           //for next pass and also return it.
}
The circuit breaker and main/auxiliary gyro switching logic is dealt with by the following function. It returns an index number 'j' which indicates which gyro platform is supplying the attitude information. If we are dealing with the captain's instruments, j can be 0 or 1; if we are dealing with the first officer's instruments, j can be 0 or 2 according to whether the pilot concerned is switched to the auxiliary or his main gyro. However, if the gyro is inoperative for some reason, it returns a negative value of 'j' according to the nature of the problem.
int GyroLogic (
  int i,         //index: 0 for captain's instruments, 1 for first officer's instruments
  double et      //elapsed time since last program pass
) {
  //Declare pointer to the captain's or first officer's RxData
  struct RxData *r = *(Rx + 4 + i);

  /* If the 'transfer switch' circuit breaker is closed 
     and the transfer switch is set to 'auxiliary gyro',
     light the 'transferred to auxiliary' lamp and set 
     gyro index to zero to indicate the auxiliary gyro. */

  if(r->TranCB == TRUE) && (r->TranSw == True))
  { r->TranLmp = TRUE; j = 0; }

  /* Else kill the 'transferred to auxiliary' lamp and set
     gyro index same as captain / first officer index. */

  else { r->TranLmp = FALSE; j = i; }

  //Declare a pointer to the data structure for the gyro in use 
  struct GyroData *g = *(Gx + j);

  /* If the relevant gyro's circuit breaker is out, set gyro
     index to indicate that the gyro platform is inoperative */

  if(g->GyroCB == FALSE) j =  -1;

  /* If horizon circuit breaker is out or gyro platform 
     failed to erect, set gyro index to indicate that 
     the attitude system has failed. */

  if(r->SphCB == FALSE || g->Erect == FALSE) j = -2;		

  return(j); //return valid gyro platform index or failure code
}
The main attitude system function below uses the previous two functions to provide the attitude (pitch and roll) indications on the captain's or first officer's horizon display, and also displays the appropriate instrument warning flags and warning lamps.
AttitudeSystem (
int i,             //index: 0 = captain's instruments, 1 = first officer's instruments
double et          //elapsed time since last program pass
) {
  if((int j = GyroLogic(i, et)) < -1) {  //IF CURRENT GYRO IS INOPERABLE
    r->GyroFlag = TRUE;                  //  display its warning flag
    if(j < -1)                           //If gyro platform failed 
       r->AttFailLmp = TRUE;             // light attitude system fail lamp
  } else {                               //THE GYRO CONCERNED IS WORKING OK
    r->AttFailLmp = FALSE;               //kill attitude system fail lamp
    r->Pitch = Air.Pitch;                //set sphere pitch to aircraft pitch
    r->Roll = Air.Roll;                  //set sphere roll to aircraft roll
    if(r->PreReq == TRUE) {              //If pilot holding down 'precess test' button,
      r->GyroFlag = TRUE;                // show the gyro warning flag
      r->Pitch += GyroPrecess(g, 0, et); //add the gyro precess pitch increment
      r->Roll += GyroPrecess(g, 1, et);  //add the gyro precess roll increment
    } else r->GyroFlag = FALSE;          //else hide warning flag

  }
}

This page's parent within this Web Site. About this Web Site. Its home page. Email its Author.