@neilberkman/sidereon 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,7 +15,7 @@ checked against IGS products.
15
15
  ## Install
16
16
 
17
17
  ```sh
18
- npm install @neilberkman/sidereon
18
+ npm install @neilberkman/sidereon@0.23
19
19
  ```
20
20
 
21
21
  The package is dual ESM/CJS and ships prebuilt wasm with bundled TypeScript
@@ -99,9 +99,45 @@ console.log(solution.rxClockS); // receiver clock bias, seconds
99
99
  ```
100
100
 
101
101
  `solveRtkFloat` / `solveRtkFixed` and `solvePppFloat` / `solvePppFixed` follow
102
- the same shape: an options object in, a result object with `Float64Array`
102
+ the same pattern: an options object in, a result object with `Float64Array`
103
103
  positions and scalar attributes out.
104
104
 
105
+ ## Example: post-solve integrity
106
+
107
+ Use `raim` on per-satellite post-fit residuals after a solve. The direct result
108
+ has `faultDetected`, `testStatistic`, `threshold`, `worstSat`,
109
+ `reducedChiSquare`, `normalizedResiduals`, `rmsM`, and `dof`. RAIM residual
110
+ tests must use per-satellite residual variances; unit weights on metre-scale
111
+ residuals make `faultDetected` saturate near 100%. The JS API takes
112
+ inverse-variance weights, so compute them from your variance model.
113
+
114
+ ```js
115
+ import { RaimWeights, raim } from "@neilberkman/sidereon";
116
+
117
+ const usedSats = ["G01", "G02", "G03", "G04", "G05", "G06"];
118
+ const residualsM = [0.2, -0.1, 0.3, 0.2, 9.0, -0.2];
119
+ const elevationDeg = [72, 42, 35, 64, 50, 28];
120
+ const sigma0M = 0.8;
121
+ const weights = Float64Array.from(
122
+ elevationDeg.map((el) => {
123
+ const sinEl = Math.max(Math.sin((el * Math.PI) / 180), 0.2);
124
+ const varianceM2 = (sigma0M / sinEl) ** 2;
125
+ return 1 / varianceM2;
126
+ }),
127
+ );
128
+ const integrity = raim(
129
+ { usedSats, residualsM },
130
+ { pFa: 1e-3, weights: RaimWeights.bySatellite(usedSats, weights) },
131
+ );
132
+
133
+ console.log(integrity.faultDetected, integrity.testStatistic, integrity.worstSat);
134
+ ```
135
+
136
+ Use `araim(geometry, ism, allocation)` for protection levels from line-of-sight
137
+ geometry and an integrity support message. `araimLpv200Allocation()` provides the
138
+ default LPV-200 budget. The direct result has `hplM`, `vplM`, `sigmaAccHM`, and
139
+ `sigmaAccVM`, plus the detailed monitor fields.
140
+
105
141
  ## Capabilities
106
142
 
107
143
  The wasm surface mirrors the full breadth of the engine:
@@ -115,21 +151,28 @@ The wasm surface mirrors the full breadth of the engine:
115
151
  batch least-squares orbit fitting against precise ephemerides (including
116
152
  terrestrial-frame SP3 through the Earth-orientation chain) with a
117
153
  per-satellite residual ledger.
118
- - **GNSS positioning:** SPP, RTK (float/fixed), PPP (float/fixed), DGNSS,
119
- moving-baseline RTK, DOP, velocity, and a robust SPP driver that runs fault
120
- detection and exclusion (RAIM/FDE) with iterative reweighting.
121
- - **Integrity and error bounds:** multi-constellation ARAIM protection levels,
154
+ - **GNSS positioning:** SPP, public `solveStatic` multi-epoch static
155
+ positioning with covariance, leave-one-out redundancy diagnostics, and
156
+ robust weighting, RTK (float/fixed), PPP (float/fixed), static PPP
157
+ temporal-correlation covariance with calibrated day-length bounds, optional
158
+ elevation cutoff, optional tropospheric-gradient estimation, DGNSS,
159
+ moving-baseline RTK, DOP, velocity, and a Huber-reweighted SPP driver that
160
+ runs fault detection and exclusion (RAIM/FDE) with iterative reweighting.
161
+ - **Integrity and error bounds:** direct post-solve RAIM fault detection,
162
+ multi-constellation ARAIM protection levels,
122
163
  SBAS protection levels (DO-229), per-observation reliability (minimal
123
164
  detectable bias, internal/external), observability classification of every
124
165
  solution (rank, redundancy, conditioning), and covariance-derived error
125
166
  metrics (CEP, R95, SEP, error ellipse) that report wide or flagged bounds
126
167
  for weak geometry rather than fabricated confidence.
127
168
  - **GNSS corrections and biases:** SBAS message decoding with SBAS-corrected
128
- solves, RTCM SSR orbit and clock correction streams, Bias-SINEX code and
129
- phase biases (DCB/OSB).
169
+ solves, RTCM SSR orbit and clock correction streams, RTCM 3 broadcast
170
+ ephemeris decode for GPS (1019), GLONASS (1020), Galileo (1045/1046),
171
+ BeiDou (1042), and QZSS (1044), each real-data validated, Bias-SINEX code
172
+ and phase biases (DCB/OSB).
130
173
  - **Timing, estimation, and geodesy:** Allan-family clock stability with
131
174
  power-law noise identification (IEEE 1139), scalar Kalman and alpha-beta
132
- trackers, CFAR detection thresholds, source localization (ToA/TDOA), robust
175
+ trackers, CFAR detection thresholds, source localization (ToA/TDOA),
133
176
  station velocity (MIDAS) with trajectory fitting and step detection,
134
177
  repeating-geometry (sidereal) filtering, geodesic direct and inverse
135
178
  problems (Karney), an epoch-aware terrestrial frame catalog (ITRF/ETRF
@@ -158,7 +201,7 @@ The wasm surface mirrors the full breadth of the engine:
158
201
  - **RF link budget:** free-space path loss, EIRP, C/N0, antenna gain, Doppler
159
202
  shift and range rate.
160
203
  - **GNSS/INS fusion:** strapdown mechanization with an error-state EKF (UKF
161
- option), loose and tight coupling, robust loose updates, an RTS smoother,
204
+ option), loose and tight coupling, IGG-III loose updates, an RTS smoother,
162
205
  a serializable filter state, and field mode (zero-velocity and
163
206
  zero-angular-rate updates, non-holonomic constraints, per-fix-status
164
207
  weighting, IMU-to-body mounting matrix), all off by default.
@@ -179,9 +222,9 @@ computes. Failures surface as the JS exception you would expect (`Error` for
179
222
  engine rejections such as parse failures, non-converging solves, and SGP4 error
180
223
  codes; `TypeError` for malformed input; `RangeError` for out-of-domain numbers).
181
224
  Full signatures live in the bundled TypeScript declarations (`sidereon.d.ts`),
182
- with the plain-object request shapes in `@neilberkman/sidereon/types`.
225
+ with the plain-object request types in `@neilberkman/sidereon/types`.
183
226
 
184
- A few conventions worth knowing: positions and state arrays cross as
227
+ A few conventions to know: positions and state arrays cross as
185
228
  `Float64Array` (multi-epoch arrays are flat row-major, `3 * epochCount`); SGP4
186
229
  epoch grids are `BigInt64Array` of unix microseconds; SP3 query epochs are plain
187
230
  numbers in seconds since J2000.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neilberkman/sidereon",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
4
  "description": "WebAssembly / JavaScript interface over the sidereon GNSS + astrodynamics engine: SP3 loading and multi-product merge, SPP / RTK (float + fixed) / PPP (float + fixed) positioning, IONEX slant delay, SGP4 and numerical orbit propagation, RINEX observation/navigation/clock parsing, CRINEX (Hatanaka) decoding, observable-domain math (carrier combinations, cycle slips, Hatch smoothing, weighting, velocity, GPS C/A signal), and the astro domain (scale-tagged time, frame transforms, Sun/Moon ephemerides, eclipse / body angles, DOP, passes / visibility, conjunction + collision probability, CDM / OMM / ANTEX parsing, RF link budget)",
5
5
  "type": "module",
6
6
  "license": "MIT",