Changeset 11134 in ntrip


Ignore:
Timestamp:
Oct 28, 2026, 10:05:43 AM (3 hours ago)
Author:
stuerze
Message:

IIF shadow behaviour considerred in GPS attitude model

Location:
trunk/BNC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/CHANGELOG.md

    r11133 r11134  
    4141- FIXED: Combination: the satellite offset of an AC was not reset after an outlier
    4242- FIXED: Combination: text of the combination logfile was lost
     43- CHANGED: GPS attitude model ('Computed'): Block IIF satellites in the Earth's shadow yaw at a constant rate from their yaw at shadow entry to the nominal yaw at shadow exit (before: nominal yaw-steering with maximum rate, up to 37 deg off during eclipses, i.e. 25 cm in the APC/CoM conversion with the IIF x offset of 0.39 m)
    4344- FIXED: GPS attitude model ('Computed'): at the end of a noon/midnight turn the yaw jumped to the nominal yaw (e.g. by 95 deg); the satellite now keeps yawing at its maximum rate until it has caught up with the nominal yaw
    4445- FIXED: GLONASS attitude model ('Computed'): the yaw was frozen while the nominal yaw rate exceeded the maximum rate and then jumped to the nominal yaw; now following Dilssner et al. (2011), the satellite yaws at the maximum rate (0.25 deg/s) during noon turns until it has caught up, and in the Earth's shadow until it reaches the nominal yaw at shadow exit
  • trunk/BNC/src/bncantex.cpp

    r11123 r11134  
    632632      prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI,
    633633      st.yaw*180.0/M_PI, psiNom*180.0/M_PI, callGap*1440.0);
    634     st.valid  = false;
    635     st.inTurn = false;
     634    st.valid    = false;
     635    st.inTurn   = false;
     636    st.inShadow = false;
     637  }
     638
     639  // Block IIF in the Earth's shadow (cylinder, around midnight for |mu| <
     640  // muShadow): the satellite yaws at a constant rate from its yaw at shadow
     641  // entry to the nominal yaw at shadow exit (Kouba 2009, Dilssner 2010)
     642  // -------------------------------------------------------------------------
     643  if (blockType == "IIF") {
     644    const double RE = 6378137.0;
     645    double cosMuShadow = sqrt(std::max(0.0, 1.0 - RE * RE / (r * r))) / cos(beta);
     646    bool   inShadow    = (cosMuShadow < 1.0 && cos(mu) > cosMuShadow);
     647    if (inShadow) {
     648      double muExit = acos(cosMuShadow);
     649      if (!st.inShadow) {
     650        double psiExit = atan2(-tanBeta, sin(muExit));      // nominal yaw at shadow exit
     651        double tRem    = (muExit - mu) / nRate;              // remaining time in the shadow [s]
     652        st.inShadow   = true;
     653        st.shadowYaw0 = st.valid ? st.yaw : psiNom;
     654        st.shadowRate = (tRem > 0.0) ? remainder(psiExit - st.shadowYaw0, 2.0 * M_PI) / tRem : 0.0;
     655        st.shadowMjd0 = Mjd;
     656        _gpsYawLog += QString().asprintf(
     657          "%s gpsYaw SHADOW-ENTER Mjd=%.6f beta=%6.3f mu=%7.2f yaw=%7.2f exit=%7.2f rate=%6.3f\n",
     658          prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI, st.shadowYaw0*180.0/M_PI,
     659          psiExit*180.0/M_PI, st.shadowRate*180.0/M_PI);
     660      }
     661      double psiEff = st.shadowYaw0 + st.shadowRate * (Mjd - st.shadowMjd0) * 86400.0;
     662      while (psiEff >  M_PI) psiEff -= 2.0 * M_PI;
     663      while (psiEff < -M_PI) psiEff += 2.0 * M_PI;
     664      st.yaw         = psiEff;
     665      st.lastCallMjd = Mjd;
     666      st.valid       = true;
     667      st.inTurn      = false;
     668      return psiEff;
     669    }
     670    else if (st.inShadow) {
     671      // shadow exit: a remaining difference to the nominal yaw is caught up
     672      // at the maximum rate (catch-up branch below)
     673      st.inShadow = false;
     674      st.inTurn   = true;
     675      st.turnSign = (remainder(psiNom - st.yaw, 2.0 * M_PI) >= 0.0) ? 1.0 : -1.0;
     676      _gpsYawLog += QString().asprintf(
     677        "%s gpsYaw SHADOW-EXIT  Mjd=%.6f beta=%6.3f mu=%7.2f yaw=%7.2f nominal=%7.2f\n",
     678        prn.toLatin1().data(), Mjd, beta*180.0/M_PI, mu*180.0/M_PI, st.yaw*180.0/M_PI, psiNom*180.0/M_PI);
     679    }
    636680  }
    637681
  • trunk/BNC/src/bncantex.h

    r11123 r11134  
    126126      inTurn      = false;
    127127      turnSign    = 1.0;
     128      inShadow    = false;
     129      shadowYaw0  = 0.0;
     130      shadowRate  = 0.0;
     131      shadowMjd0  = 0.0;
    128132    }
    129133    double yaw;
    … …  
    132136    bool   inTurn;    // true while in a constrained noon/midnight turn
    133137    double turnSign;  // direction of the turn (sign of the nominal yaw rate at its start)
     138    bool   inShadow;    // Block IIF in the Earth's shadow
     139    double shadowYaw0;  // yaw at shadow entry [rad]
     140    double shadowRate;  // constant yaw rate in the shadow [rad/s]
     141    double shadowMjd0;  // shadow entry
    134142  };
    135143
  • trunk/BNC/src/bnchelp.html

    r11130 r11134  
    52625262  <pre>
    52635263  G attitude check G14 09:42:30-10:25:30: yaw difference to the model 362 deg, clock change vs. consensus 8.2 cm, predicted 10.7 cm (max 10.7 cm), slope 0.77, clock RMS 6.1 -> 2.0 cm: SSR yaw consistent with the clocks
    5264   G attitude check G25 07:53:00-08:51:30: yaw difference to the model 39 deg, clock change vs. consensus -9.8 cm, predicted -0.0 cm (max 1.2 cm), slope 1.84, clock RMS 5.9 -> 5.8 cm: clock change not explained by the yaw difference (the other ACs model this turn differently?)
    52655264</pre>
    52665265  <p>
    … …  
    83798378  <ul>
    83808379    <li><b>Computed</b> (default): BNC applies its own kinematic attitude model:
    8381       GPS noon/midnight turn manoeuvres (Kouba 2009/2015, Bar-Sever 1996),
     8380      GPS noon/midnight turn manoeuvres (Kouba 2009/2015, Bar-Sever 1996), with Block IIF satellites in the Earth's
     8381      shadow yawing at a constant rate from their yaw at shadow entry to the nominal yaw at shadow exit,
    83828382      GLONASS-M noon turns and midnight turns in the Earth's shadow (Dilssner et al. 2011), and
    83838383      Galileo / BDS orbit-normal mode switching (Kouba 2017, Dai et al. 2015, Steigenberger et al. 2018).</li>
Note: See TracChangeset for help on using the changeset viewer.