Time for another update:
NASSP now supports IMU drift and accelerometer bias!
WARNING: DON'T UPDATE NASSP MID-MISSION FOR THIS UPDATE
Also, you guys can't skip P52s any more.
Brief Intro
The Apollo IMUs are comprised of a reference platform to which 3 IRIGs (Inertial Reference Integrating Gyroscope), and 3 PIPAs (Pulsed Integrating Pendulous Accelerometer) are mounted. The platform is supported by 3 servo-powered gimbals, which actuate to keep the platform in a fixed reference attitude. The image below shows an overview of the platform and the sensing elements on it.
The X, Y, and Z gyros (IRIGS) detect angular accelerations in their respective Input Axis (IA), by spinning a gyroscope along the Spin Reference Axis (SRA), and producing an output torque in the Output Axis (OA). The torquing of the output is sensed, and used by the AGC to determine, how much it needs to drive the IMU servos, such that the IMU platform remains fixed in space. The actual IMU position is determined by measuring the resolver phase angles. (There is a longer version of this description that we can get into when we properly impliment CDUs)
IMU Drift
Because nothing is perfect, the IMU sensing elements are subject to accumulating errors over time. The IMU will experience a drift (angular movement out of a perfect alignment) from the gyros, and the accelerometers will introduce error into the measured DV.
The sources of error in the IMU come in 6 types (each of these have an X, Y, and Z component, so it's really
18)
- Null Bias Drift
- This is the angular drift rate that the IMU experiences under no aceleration. It is a constant (but very slow) movement of the IMU about each of its principal axes.
- Aceleration Drift, Spin Reference Axis
- Angular drift about each principal axis, as a result of aceleration along the spin-refereence axis.
- Aceleration Drift, Input Axis
- Angular drift about each principal axis, as a result of aceleration along the input axis.
- Aceleration Drift, Output Axis (not simulated, neglegable effect)
- Angular drift about each principal axis, as a result of aceleration along the output axis. This is neglegablly small, and we don't simulate it, nor do we have good data for values for flown IMUs
- PIPA Bias
- Offset in where the "zero aceleration" reading is with respect to actual.
- PIPA Scale Error
- Linear error in measured aceleration. (Span error)
If you've ever wondered why the IMU has special density-matched fluids in it, this is why:
Drift-rates are measured in MERU (Milli Earth Rate Unit, equal to 7.29211586E-8 radians/second, or 1/1000 the rate at which earth rotates) or MERU/g.
PIPA biases are in cm/sec.
PIPA Scale errors are in ppm.
This is all now simulated. Our IMUs for Apollo 7-12 have the correct (mission specific) drift-rate and biases, and over time will lose alignment. PIPA bias will be observiable when in P47 or V16N21.
***
While introducing errors into the simulation on its own is certianly fun, its still not the best part of this update. The CMC and LGC ropes actually have software that is ment to compensate for these drifts and biases. The figure below actually shows a 1800 ft/sec SPS burn between ~250 and ~325 seconds. In these plots, you can see both the aceleration sensitive drift, and the null bias drift, allong with the AGCs corrections to compensate.
If you are interested in how this works see:
https://www.ibiblio.org/apollo/listings/Comanche055/IMU_COMPENSATION_PACKAGE.agc.html
The values below come from flown padloads:
| Apollo 7 | | | Apollo 8 | | | Apollo 9 | | | Apollo 10 | | | Apollo 11 | | | Apollo 12 | | |
|---|
| Address | Octal | Value | Address | Octal | Value | Address | Octal | Value | Address | Octal | Value | Address | Octal | Value | Address | Octal | Value |
| CMPIPABIASX | 1452 | 3271 | 0.24 | 1452 | 77766 | -0.0013 | 1452 | 10755 | 0.64 | 1452 | 74157 | -0.27 | 1452 | 74267 | -0.26 | 1452 | 77536 | 0 |
| CMPIPASCALEX | 1453 | 73052 | -300 | 1453 | 76575 | -76.57 | 1453 | 75551 | -140 | 1453 | 76270 | -100 | 1453 | 00520 | 40 | 1453 | 74312 | -173 |
| CMPIPABIASY | 1454 | 3271 | 0.24 | 1454 | 13175 | 0.803 | 1454 | 76462 | -0.1 | 1454 | 77011 | -0.07 | 1454 | 76133 | -0.13 | 1454 | 77536 | -0.15 |
| CMPIPASCALEY | 1455 | 74705 | -190 | 1455 | 72466 | -329.14 | 1455 | 72457 | -330 | 1455 | 74166 | -230 | 1455 | 76450 | -80 | 1455 | 72207 | -243 |
| CMPIPABIASZ | 1456 | 1754 | 0.14 | 1456 | 10654 | 0.631 | 1456 | 6123 | 0.44 | 1456 | 77231 | 0.05 | 1456 | 01754 | 0.14 | 1456 | 77340 | -0.16 |
| CMPIPASCALEZ | 1457 | 72333 | -340 | 1457 | 74553 | -200.71 | 1457 | 73322 | -280 | 1457 | 76540 | -80 | 1457 | 77403 | -30 | 1457 | 71737 | -306 |
| CMNBDX | 1460 | 77677 | -0.5 | 1460 | 425 | 2.18 | 1460 | 461 | 2.4 | 1460 | 63 | 0.4 | 1460 | 77432 | -1.8 | 1460 | 77762 | -0.9 |
| CMNBDY | 1461 | 0 | 0 | 1461 | 515 | 2.62 | 1461 | 0 | 0 | 1461 | 77532 | -1.3 | 1461 | 77663 | -0.6 | 1461 | 77762 | 1.3 |
| CMNBDZ | 1462 | 77663 | -0.6 | 1462 | 632 | 3.22 | 1462 | 461 | 2.4 | 1462 | 231 | 1.2 | 1462 | 77746 | -0.2 | 1462 | 00015 | 0.5 |
| CMADIAX | 1463 | 234 | 8.2 | 1463 | 524 | 17.88 | 1463 | 137 | 5 | 1463 | 23 | 1 | 1463 | 00435 | 15 | 1463 | 00367 | 6.7 |
| CMADIAY | 1464 | 334 | 11.6 | 1464 | 77702 | -3.22 | 1464 | 230 | 8 | 1464 | 367 | 13 | 1464 | 00137 | 5 | 1464 | 00000 | 0.7 |
| CMADIAZ | 1465 | 613 | 20.8 | 1465 | 1031 | 28.23 | 1465 | 77251 | -18 | 1465 | 321 | 11 | 1465 | 00023 | 1 | 1465 | 77754 | -0.1 |
| CMADSRAX | 1466 | 112 | 3.9 | 1466 | 77724 | -2.24 | 1466 | 205 | 7 | 1466 | 276 | 10 | 1466 | 77615 | -6 | 1466 | 77663 | -1.4 |
| CMADSRAY | 1467 | 77767 | -0.4 | 1467 | 40 | 1.66 | 1467 | 253 | 9 | 1467 | 71 | -1.3 | 1467 | 00071 | 3 | 1467 | 77663 | -3.3 |
| CMADSRAZ | 1470 | 77530 | -8.8 | 1470 | 77702 | -3.22 | 1470 | 77663 | -4 | 1470 | 205 | 7 | 1470 | 00137 | 5 | 1470 | 77615 | -3.5 |
| LMPIPABIASX | | | | | | | 1452 | 03131 | 0.31 | 1452 | 73631 | -0.41 | 1452 | 76612 | -0.12 | 1452 | 77015 | -0.296 |
| LMPIPASCALEX | | | | | | | 1453 | 60066 | -968 | 1453 | 70750 | -430 | 1453 | 74435 | -210 | 1453 | 65137 | -649 |
| LMPIPABIASY | | | | | | | 1454 | 01454 | 0.19 | 1454 | 01660 | 0.18 | 1454 | 01573 | 0.17 | 1454 | 00032 | -0.28 |
| LMPIPASCALEY | | | | | | | 1455 | 60462 | -941 | 1455 | 62171 | -840 | 1455 | 74435 | -210 | 1455 | 64147 | -681 |
| LMPIPABIASZ | | | | | | | 1456 | 00000 | 0 | 1456 | 77542 | -0.03 | 1456 | 00557 | 0.07 | 1456 | 01455 | 0.54 |
| LMPIPASCALEZ | | | | | | | 1457 | 62045 | -852 | 1457 | 67241 | -530 | 1457 | 60731 | -920 | 1457 | 61325 | -885 |
| LMNBDX | | | | | | | 1460 | 01111 | 4.6 | 1460 | 77150 | -3.2 | 1460 | 00245 | 1.3 | 1460 | 00015 | 0.6 |
| LMNBDY | | | | | | | 1461 | 01174 | 5 | 1461 | 00277 | 1.5 | 1461 | 77500 | -1.5 | 1461 | 00146 | 0.8 |
| LMNBDZ | | | | | | | 1462 | 01075 | 4.5 | 1462 | 77546 | -1.2 | 1462 | 77415 | -1.9 | 1462 | 00576 | 1.3 |
| LMADIAX | | | | | | | 1463 | 00202 | 5.4 | 1463 | 00032 | 1 | 1463 | 02712 | 57 | 1463 | 00672 | 10.6 |
| LMADIAY | | | | | | | 1464 | 00000 | -0.3 | 1464 | 01010 | 20 | 1464 | 77627 | -4 | 1464 | 77171 | -16 |
| LMADIAZ | | | | | | | 1465 | 01010 | 19.6 | 1465 | 76617 | -24 | 1465 | 01010 | 20 | 1465 | 00522 | 10.8 |
| LMADSRAX | | | | | | | 1466 | 77745 | -0.5 | 1466 | 00202 | 5 | 1466 | 00064 | 2 | 1466 | 77713 | -1.3 |
| LMADSRAY | | | | | | | 1467 | 00640 | 16.3 | 1467 | 00064 | 2 | 1467 | 01244 | 26 | 1467 | 00150 | 4.1 |
| LMADSRAZ | | | | | | | 1470 | 77713 | -1.7 | 1470 | 77745 | -1 | 1470 | 77314 | -11 | 1470 | 77713 | -0.3 |
Our Mission files now have these lines:
Implications for Users
Because the AGC compensates for drift, for the most part the misalignment will be almost unnoticable, apart from slightly higher N93 values. That being said, if you've ever skipped a P52 "because our IMU is perfect, and doesn't drift", you can no longer do that.
If you're really hard-core you could try adjusting one of the rates, and using the mission technique I've linked in References, to try to calculate it only from N93 values (I'm not by any means saying this is easy).
Extras
We also now simulate the IMU resolver voltage outputs, and phase errors. These are downlinked over telemetry, and could be used to determine the orientation of the spacecraft. The image below is from our TCP telemetry client.
Thanks
The very beginings of this project were in December of 2022 and started over dinner and a few beers with
@rcflyinghokie @thewonderidiot, and
@CaptainSwag101 at Paddy's in Newton MA. I did not know what I was getting myself into at the time, and
@indy91 has been a huge help checking my left-handed rotation-matric math, testing, and making sure I don't merge typos or stray debugging code, by reviewing all 122 files I changed for this project.
@rcflyinghokie,
@ThatRedMelon,
@Max-Q, and a few others from the
SFS Discord have also tested this extensively. Thank you.
References