gnss-js 1.19.0 → 1.20.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/dist/{chunk-2IM5VXNI.js → chunk-7RKLWE6R.js} +23 -2
- package/dist/{chunk-QXZZNXE3.js → chunk-B5LU4746.js} +1 -1
- package/dist/{chunk-JW2ICDR7.js → chunk-DLXTTHRK.js} +2 -4
- package/dist/{chunk-OMVL3X7V.js → chunk-JNFV5BYB.js} +186 -8
- package/dist/{chunk-K73SERD5.js → chunk-NOQAAUGY.js} +2 -4
- package/dist/{chunk-5S5HMAKW.js → chunk-VJEPOC76.js} +908 -14
- package/dist/{chunk-6NCMACDO.js → chunk-WZDFZ76K.js} +149 -8
- package/dist/index.cjs +1150 -57
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +21 -8
- package/dist/nav-BYmYoh9A.d.cts +137 -0
- package/dist/nav-CN8rxL4h.d.ts +137 -0
- package/dist/novatel.cjs +230 -15
- package/dist/novatel.d.cts +8 -1
- package/dist/novatel.d.ts +8 -1
- package/dist/novatel.js +2 -2
- package/dist/orbit.cjs +190 -8
- package/dist/orbit.d.cts +90 -1
- package/dist/orbit.d.ts +90 -1
- package/dist/orbit.js +9 -1
- package/dist/positioning.d.cts +1 -0
- package/dist/positioning.d.ts +1 -0
- package/dist/positioning.js +2 -2
- package/dist/rinex.js +2 -3
- package/dist/sbf.cjs +908 -11
- package/dist/sbf.d.cts +114 -136
- package/dist/sbf.d.ts +114 -136
- package/dist/sbf.js +8 -3
- package/dist/ubx.js +2 -3
- package/package.json +1 -1
- package/dist/chunk-IQ5OIMQD.js +0 -148
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
+
CnavAssembler,
|
|
3
|
+
cnavCrcOk,
|
|
2
4
|
decodeGpsLnavFrame
|
|
3
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-WZDFZ76K.js";
|
|
4
6
|
import {
|
|
5
7
|
getUtcDate
|
|
6
8
|
} from "./chunk-HVXYFUCB.js";
|
|
@@ -51,6 +53,7 @@ function* oem4Frames(data, view, stats) {
|
|
|
51
53
|
|
|
52
54
|
// src/novatel/nav.ts
|
|
53
55
|
var ID_IONUTC = 8;
|
|
56
|
+
var ID_RAWCNAVFRAME = 1066;
|
|
54
57
|
var ID_RAWEPHEM = 41;
|
|
55
58
|
var ID_GLOEPHEMERIS = 723;
|
|
56
59
|
var ID_GALEPHEMERIS = 1122;
|
|
@@ -257,6 +260,9 @@ function parseNovatelNav(data) {
|
|
|
257
260
|
const ephemerides = [];
|
|
258
261
|
const ionoCorrections = {};
|
|
259
262
|
let leapSeconds = null;
|
|
263
|
+
const cnav = [];
|
|
264
|
+
const cnavAssembler = new CnavAssembler();
|
|
265
|
+
let cnavBadCrc = 0;
|
|
260
266
|
const lastKep = /* @__PURE__ */ new Map();
|
|
261
267
|
const lastGlo = /* @__PURE__ */ new Map();
|
|
262
268
|
const pushKepler = (key, eph) => {
|
|
@@ -287,6 +293,14 @@ function parseNovatelNav(data) {
|
|
|
287
293
|
} else if (frame.id === ID_QZSSEPHEMERIS && frame.msgLen >= 204) {
|
|
288
294
|
const eph = decodeGpsQzssEphemeris(view, frame.payload, "J");
|
|
289
295
|
if (eph) pushKepler(eph.prn, eph);
|
|
296
|
+
} else if (frame.id === ID_RAWCNAVFRAME && frame.msgLen >= 50) {
|
|
297
|
+
const msg = data.subarray(frame.payload + 12, frame.payload + 50);
|
|
298
|
+
if (!cnavCrcOk(msg)) {
|
|
299
|
+
cnavBadCrc++;
|
|
300
|
+
} else {
|
|
301
|
+
const eph = cnavAssembler.push(msg);
|
|
302
|
+
if (eph) cnav.push(eph);
|
|
303
|
+
}
|
|
290
304
|
} else if (frame.id === ID_IONUTC && frame.msgLen >= 108) {
|
|
291
305
|
const p = frame.payload;
|
|
292
306
|
const alpha = [];
|
|
@@ -309,7 +323,14 @@ function parseNovatelNav(data) {
|
|
|
309
323
|
ephemerides.push(eph);
|
|
310
324
|
}
|
|
311
325
|
}
|
|
312
|
-
return {
|
|
326
|
+
return {
|
|
327
|
+
ephemerides,
|
|
328
|
+
ionoCorrections,
|
|
329
|
+
leapSeconds,
|
|
330
|
+
cnav,
|
|
331
|
+
cnavBadCrc,
|
|
332
|
+
badCrc: stats.badCrc
|
|
333
|
+
};
|
|
313
334
|
}
|
|
314
335
|
|
|
315
336
|
// src/novatel/index.ts
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CnavAssembler,
|
|
3
|
-
cnavCrcOk
|
|
4
|
-
} from "./chunk-6NCMACDO.js";
|
|
5
|
-
import {
|
|
3
|
+
cnavCrcOk,
|
|
6
4
|
decodeGpsLnavFrame,
|
|
7
5
|
getBitS,
|
|
8
6
|
getBitU,
|
|
9
7
|
setBitU
|
|
10
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-WZDFZ76K.js";
|
|
11
9
|
|
|
12
10
|
// src/ubx/frame.ts
|
|
13
11
|
function* ubxFrames(data, stats = { badChecksums: 0 }) {
|
|
@@ -13,10 +13,184 @@ import {
|
|
|
13
13
|
OMEGA_E
|
|
14
14
|
} from "./chunk-FIEWO4J4.js";
|
|
15
15
|
|
|
16
|
-
// src/orbit/
|
|
16
|
+
// src/orbit/almanac.ts
|
|
17
17
|
var GM_GPS = 3986005e8;
|
|
18
18
|
var GM_GAL = 3986004418e5;
|
|
19
19
|
var GM_BDS = 3986004418e5;
|
|
20
|
+
var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
|
|
21
|
+
var BDT_EPOCH_MS = Date.UTC(2006, 0, 1);
|
|
22
|
+
var WEEK_MS = 6048e5;
|
|
23
|
+
var BDT_MINUS_GPST_MS = 14e3;
|
|
24
|
+
var BDS_GEO_PRNS = /* @__PURE__ */ new Set([1, 2, 3, 4, 5, 59, 60, 61, 62, 63]);
|
|
25
|
+
function almanacEpochMs(alm) {
|
|
26
|
+
if (alm.system === "C") {
|
|
27
|
+
return BDT_EPOCH_MS + alm.weekAlm * WEEK_MS + alm.toaSec * 1e3 + BDT_MINUS_GPST_MS;
|
|
28
|
+
}
|
|
29
|
+
return GPS_EPOCH_MS + alm.weekAlm * WEEK_MS + alm.toaSec * 1e3;
|
|
30
|
+
}
|
|
31
|
+
function almanacSatPosition(alm, timeMs) {
|
|
32
|
+
const GM = alm.system === "E" ? GM_GAL : alm.system === "C" ? GM_BDS : GM_GPS;
|
|
33
|
+
const a = alm.sqrtA * alm.sqrtA;
|
|
34
|
+
const n0 = Math.sqrt(GM / (a * a * a));
|
|
35
|
+
const tk = (timeMs - almanacEpochMs(alm)) / 1e3;
|
|
36
|
+
const Mk = alm.m0 + n0 * tk;
|
|
37
|
+
let Ek = Mk;
|
|
38
|
+
for (let i = 0; i < 12; i++) {
|
|
39
|
+
const dE = (Mk - (Ek - alm.e * Math.sin(Ek))) / (1 - alm.e * Math.cos(Ek));
|
|
40
|
+
Ek += dE;
|
|
41
|
+
if (Math.abs(dE) < 1e-12) break;
|
|
42
|
+
}
|
|
43
|
+
const sinE = Math.sin(Ek);
|
|
44
|
+
const cosE = Math.cos(Ek);
|
|
45
|
+
const vk = Math.atan2(Math.sqrt(1 - alm.e * alm.e) * sinE, cosE - alm.e);
|
|
46
|
+
const uk = vk + alm.omega;
|
|
47
|
+
const rk = a * (1 - alm.e * cosE);
|
|
48
|
+
const ik = alm.i0OrDeltaI;
|
|
49
|
+
const xp = rk * Math.cos(uk);
|
|
50
|
+
const yp = rk * Math.sin(uk);
|
|
51
|
+
const clockBias = alm.af0 + alm.af1 * tk;
|
|
52
|
+
const isGeo = alm.system === "C" && BDS_GEO_PRNS.has(Number(alm.prn.slice(1)));
|
|
53
|
+
if (isGeo) {
|
|
54
|
+
const omegak2 = alm.omega0 + alm.omegaDot * tk - OMEGA_E * alm.toaSec;
|
|
55
|
+
const cosO2 = Math.cos(omegak2);
|
|
56
|
+
const sinO2 = Math.sin(omegak2);
|
|
57
|
+
const cosI2 = Math.cos(ik);
|
|
58
|
+
const sinI2 = Math.sin(ik);
|
|
59
|
+
const xg = xp * cosO2 - yp * cosI2 * sinO2;
|
|
60
|
+
const yg = xp * sinO2 + yp * cosI2 * cosO2;
|
|
61
|
+
const zg = yp * sinI2;
|
|
62
|
+
const phi = OMEGA_E * tk;
|
|
63
|
+
const cosPhi = Math.cos(phi);
|
|
64
|
+
const sinPhi = Math.sin(phi);
|
|
65
|
+
const COS5 = Math.cos(-5 * Math.PI / 180);
|
|
66
|
+
const SIN5 = Math.sin(-5 * Math.PI / 180);
|
|
67
|
+
return {
|
|
68
|
+
prn: alm.prn,
|
|
69
|
+
x: xg * cosPhi + yg * sinPhi * COS5 + zg * sinPhi * SIN5,
|
|
70
|
+
y: -xg * sinPhi + yg * cosPhi * COS5 + zg * cosPhi * SIN5,
|
|
71
|
+
z: -yg * SIN5 + zg * COS5,
|
|
72
|
+
clockBias
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
const omegak = alm.omega0 + (alm.omegaDot - OMEGA_E) * tk - OMEGA_E * alm.toaSec;
|
|
76
|
+
const cosO = Math.cos(omegak);
|
|
77
|
+
const sinO = Math.sin(omegak);
|
|
78
|
+
const cosI = Math.cos(ik);
|
|
79
|
+
const sinI = Math.sin(ik);
|
|
80
|
+
return {
|
|
81
|
+
prn: alm.prn,
|
|
82
|
+
x: xp * cosO - yp * cosI * sinO,
|
|
83
|
+
y: xp * sinO + yp * cosI * cosO,
|
|
84
|
+
z: yp * sinI,
|
|
85
|
+
clockBias
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// src/orbit/almanac-glo.ts
|
|
90
|
+
var C20 = -108263e-8;
|
|
91
|
+
var J = -1.5 * C20;
|
|
92
|
+
var AE = 6378.136;
|
|
93
|
+
var MU = 398600.44;
|
|
94
|
+
var OMEGA_Z = 7292115e-11;
|
|
95
|
+
var I_MEAN = 63 * Math.PI / 180;
|
|
96
|
+
var T_MEAN = 43200;
|
|
97
|
+
var GLO_1996_UTC_MS = Date.UTC(1996, 0, 1) - 108e5;
|
|
98
|
+
var DAY_MS = 864e5;
|
|
99
|
+
var FOUR_YEARS_DAYS = 1461;
|
|
100
|
+
function glonassAlmanacEpochMs(alm) {
|
|
101
|
+
const utcMs = GLO_1996_UTC_MS + ((alm.n4 - 1) * FOUR_YEARS_DAYS + (alm.nDay - 1)) * DAY_MS + alm.tLambda * 1e3;
|
|
102
|
+
return utcMs + getGpsLeap(new Date(utcMs)) * 1e3;
|
|
103
|
+
}
|
|
104
|
+
function c20Deltas(lam, tau, B, h, l, n, sinI, cosI) {
|
|
105
|
+
const sin2i = sinI * sinI;
|
|
106
|
+
const cos2i = cosI * cosI;
|
|
107
|
+
const s1 = Math.sin(lam);
|
|
108
|
+
const c1 = Math.cos(lam);
|
|
109
|
+
const s2 = Math.sin(2 * lam);
|
|
110
|
+
const c2 = Math.cos(2 * lam);
|
|
111
|
+
const s3 = Math.sin(3 * lam);
|
|
112
|
+
const c3 = Math.cos(3 * lam);
|
|
113
|
+
const s4 = Math.sin(4 * lam);
|
|
114
|
+
const c4 = Math.cos(4 * lam);
|
|
115
|
+
const daOverA = 2 * B * (1 - 1.5 * sin2i) * (l * c1 + h * s1) + B * sin2i * (0.5 * h * s1 - 0.5 * l * c1 + c2 + 3.5 * l * c3 + 3.5 * h * s3);
|
|
116
|
+
const dh = B * (1 - 1.5 * sin2i) * (l * n * tau + s1 + 1.5 * l * s2 - 1.5 * h * c2) - 0.25 * B * sin2i * (s1 - 7 / 3 * s3 + 5 * l * s2 - 8.5 * l * s4 + 8.5 * h * c4 + h * c2) + B * cos2i * (l * n * tau - 0.5 * l * s2);
|
|
117
|
+
const dl = B * (1 - 1.5 * sin2i) * (-h * n * tau + c1 + 1.5 * l * c2 + 1.5 * h * s2) - 0.25 * B * sin2i * (-c1 - 7 / 3 * c3 - 5 * h * s2 - 8.5 * l * c4 - 8.5 * h * s4 + l * c2) + B * cos2i * (-h * n * tau + 0.5 * h * s2);
|
|
118
|
+
const nodeBracket = n * tau + 3.5 * l * s1 - 2.5 * h * c1 - 0.5 * s2 - 7 / 6 * l * s3 + 7 / 6 * h * c3;
|
|
119
|
+
const dOmega = -B * cosI * nodeBracket;
|
|
120
|
+
const di = 0.5 * B * sinI * cosI * (-l * c1 + h * s1 + c2 + 7 / 3 * l * c3 + 7 / 3 * h * s3);
|
|
121
|
+
const dLambda = 2 * B * (1 - 1.5 * sin2i) * (n * tau + 1.75 * l * s1 - 1.75 * h * c1) + 3 * B * sin2i * (-(7 / 24) * h * c1 - 7 / 24 * l * s1 - 49 / 72 * h * c3 + 49 / 72 * l * s3 + 0.25 * s2) + B * cos2i * nodeBracket;
|
|
122
|
+
return { daOverA, dh, dl, dOmega, di, dLambda };
|
|
123
|
+
}
|
|
124
|
+
function glonassAlmanacPosition(alm, timeMs) {
|
|
125
|
+
const i = I_MEAN + alm.deltaI;
|
|
126
|
+
const sinI = Math.sin(i);
|
|
127
|
+
const cosI = Math.cos(i);
|
|
128
|
+
const sin2i = sinI * sinI;
|
|
129
|
+
const e = alm.epsilon;
|
|
130
|
+
const oneMinusE2 = 1 - e * e;
|
|
131
|
+
const Tdr = T_MEAN + alm.deltaT;
|
|
132
|
+
const n = 2 * Math.PI / Tdr;
|
|
133
|
+
const cosW = Math.cos(alm.omega);
|
|
134
|
+
let a = Math.cbrt((Tdr / (2 * Math.PI)) ** 2 * MU);
|
|
135
|
+
for (let k = 0; k < 10; k++) {
|
|
136
|
+
const p = a * oneMinusE2;
|
|
137
|
+
const tOsc = Tdr / (1 + 1.5 * C20 * (AE / p) ** 2 * ((2 - 2.5 * sin2i) * (Math.pow(oneMinusE2, 1.5) / (1 + e * cosW) ** 2) + (1 + e * cosW) ** 3 / oneMinusE2));
|
|
138
|
+
const aNext = Math.cbrt((tOsc / (2 * Math.PI)) ** 2 * MU);
|
|
139
|
+
const converged = Math.abs(aNext - a) < 1e-3;
|
|
140
|
+
a = aNext;
|
|
141
|
+
if (converged) break;
|
|
142
|
+
}
|
|
143
|
+
const tStar = (timeMs - glonassAlmanacEpochMs(alm)) / 1e3;
|
|
144
|
+
const W = Math.floor(tStar / Tdr);
|
|
145
|
+
const nodeShift = Tdr * W + alm.deltaTDot * W * W;
|
|
146
|
+
const omegaDot = 1.5 * C20 * n * (AE / a) ** 2 * cosI * oneMinusE2 ** -2;
|
|
147
|
+
const lambdaK = alm.lambda + (omegaDot - OMEGA_Z) * nodeShift;
|
|
148
|
+
const tau = tStar - nodeShift;
|
|
149
|
+
const h = e * Math.sin(alm.omega);
|
|
150
|
+
const l = e * cosW;
|
|
151
|
+
const E0 = 2 * Math.atan(Math.sqrt((1 - e) / (1 + e)) * Math.tan(-alm.omega / 2));
|
|
152
|
+
const M = E0 - e * Math.sin(E0);
|
|
153
|
+
const B = J * (AE / a) ** 2;
|
|
154
|
+
const d1 = c20Deltas(M + alm.omega, 0, B, h, l, n, sinI, cosI);
|
|
155
|
+
const d2 = c20Deltas(M + alm.omega + n * tau, tau, B, h, l, n, sinI, cosI);
|
|
156
|
+
const hi = h + (d2.dh - d1.dh);
|
|
157
|
+
const li = l + (d2.dl - d1.dl);
|
|
158
|
+
const epsI = Math.hypot(hi, li);
|
|
159
|
+
const omegaI = epsI === 0 ? 0 : Math.atan2(hi, li);
|
|
160
|
+
const aI = a + a * (d2.daOverA - d1.daOverA);
|
|
161
|
+
const iI = i + (d2.di - d1.di);
|
|
162
|
+
const omegaG = lambdaK + (d2.dOmega - d1.dOmega) - OMEGA_Z * tau;
|
|
163
|
+
const lambdaStar = M + alm.omega + n * tau + (d2.dLambda - d1.dLambda);
|
|
164
|
+
const Mi = lambdaStar - omegaI;
|
|
165
|
+
let E = Mi;
|
|
166
|
+
for (let k = 0; k < 30; k++) {
|
|
167
|
+
const next = Mi + epsI * Math.sin(E);
|
|
168
|
+
const converged = Math.abs(next - E) < 1e-12;
|
|
169
|
+
E = next;
|
|
170
|
+
if (converged) break;
|
|
171
|
+
}
|
|
172
|
+
const v = 2 * Math.atan(Math.sqrt((1 + epsI) / (1 - epsI)) * Math.tan(E / 2));
|
|
173
|
+
const u = v + omegaI;
|
|
174
|
+
const rKm = aI * (1 - epsI * Math.cos(E));
|
|
175
|
+
const cosU = Math.cos(u);
|
|
176
|
+
const sinU = Math.sin(u);
|
|
177
|
+
const cosO = Math.cos(omegaG);
|
|
178
|
+
const sinO = Math.sin(omegaG);
|
|
179
|
+
const cosIi = Math.cos(iI);
|
|
180
|
+
const sinIi = Math.sin(iI);
|
|
181
|
+
return {
|
|
182
|
+
prn: alm.prn,
|
|
183
|
+
x: 1e3 * rKm * (cosU * cosO - sinU * sinO * cosIi),
|
|
184
|
+
y: 1e3 * rKm * (cosU * sinO + sinU * cosO * cosIi),
|
|
185
|
+
z: 1e3 * rKm * sinU * sinIi,
|
|
186
|
+
clockBias: -alm.tau
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// src/orbit/index.ts
|
|
191
|
+
var GM_GPS2 = 3986005e8;
|
|
192
|
+
var GM_GAL2 = 3986004418e5;
|
|
193
|
+
var GM_BDS2 = 3986004418e5;
|
|
20
194
|
var GM_GLO = 39860044e7;
|
|
21
195
|
var BDS_GEO_MAX_INCLINATION_RAD = 0.1;
|
|
22
196
|
var BDS_GEO_MIN_SEMIMAJOR_AXIS_M = 4e7;
|
|
@@ -24,9 +198,9 @@ var AE_GLO = 6378136;
|
|
|
24
198
|
var J2_GLO = 108263e-8;
|
|
25
199
|
var TWO_PI = 2 * Math.PI;
|
|
26
200
|
function gmForSystem(sys) {
|
|
27
|
-
if (sys === "E") return
|
|
28
|
-
if (sys === "C") return
|
|
29
|
-
return
|
|
201
|
+
if (sys === "E") return GM_GAL2;
|
|
202
|
+
if (sys === "C") return GM_BDS2;
|
|
203
|
+
return GM_GPS2;
|
|
30
204
|
}
|
|
31
205
|
var geoVelocityPass = false;
|
|
32
206
|
function keplerPosition(eph, t) {
|
|
@@ -362,10 +536,10 @@ function selectBest(ephs, timeMs) {
|
|
|
362
536
|
}
|
|
363
537
|
return best;
|
|
364
538
|
}
|
|
365
|
-
var
|
|
539
|
+
var GPS_EPOCH_MS2 = START_GPS_TIME.getTime();
|
|
366
540
|
var MS_PER_WEEK = 7 * 864e5;
|
|
367
541
|
var BDS_EPOCH_MS = START_BDS_TIME.getTime();
|
|
368
|
-
var GAL_EPOCH_MS =
|
|
542
|
+
var GAL_EPOCH_MS = GPS_EPOCH_MS2 + 1024 * MS_PER_WEEK;
|
|
369
543
|
function ephInfoToEphemeris(info) {
|
|
370
544
|
const sys = info.prn.charAt(0);
|
|
371
545
|
if (sys === "R") {
|
|
@@ -416,8 +590,8 @@ function ephInfoToEphemeris(info) {
|
|
|
416
590
|
} else if (sys === "E") {
|
|
417
591
|
epochMs = GAL_EPOCH_MS;
|
|
418
592
|
} else {
|
|
419
|
-
epochMs =
|
|
420
|
-
const weeksNow = (info.lastReceived -
|
|
593
|
+
epochMs = GPS_EPOCH_MS2;
|
|
594
|
+
const weeksNow = (info.lastReceived - GPS_EPOCH_MS2) / MS_PER_WEEK;
|
|
421
595
|
week += 1024 * Math.round((weeksNow - week) / 1024);
|
|
422
596
|
}
|
|
423
597
|
const tocDate = new Date(epochMs + week * MS_PER_WEEK + tocSec * 1e3);
|
|
@@ -598,6 +772,10 @@ function computeVisibilityFromPositions(all, elevationMaskDeg = 10) {
|
|
|
598
772
|
}
|
|
599
773
|
|
|
600
774
|
export {
|
|
775
|
+
almanacEpochMs,
|
|
776
|
+
almanacSatPosition,
|
|
777
|
+
glonassAlmanacEpochMs,
|
|
778
|
+
glonassAlmanacPosition,
|
|
601
779
|
keplerPosition,
|
|
602
780
|
glonassPosition,
|
|
603
781
|
rangeRate,
|