gnss-js 1.28.0 → 1.29.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.
@@ -1620,9 +1620,9 @@ function satStateAtEmission(sp3, prn, recvTimeMs, rcv) {
1620
1620
  var IDX_X = 0;
1621
1621
  var IDX_Y = 1;
1622
1622
  var IDX_Z = 2;
1623
- var IDX_CLK = 3;
1624
- var IDX_ZWD = 4;
1625
- var NBASE = 5;
1623
+ var IDX_ZWD = 3;
1624
+ var NBASE = 4;
1625
+ var CLK_VAR = 1e10;
1626
1626
  function solvePpp(epochs, sp3, opts) {
1627
1627
  const elevMask = (opts.elevationMaskDeg ?? 10) * Math.PI / 180;
1628
1628
  const codeSigma = opts.codeSigma ?? 3;
@@ -1633,8 +1633,6 @@ function solvePpp(epochs, sp3, opts) {
1633
1633
  opts.aprioriPos[0],
1634
1634
  opts.aprioriPos[1],
1635
1635
  opts.aprioriPos[2],
1636
- 0,
1637
- // receiver clock (m)
1638
1636
  0.1
1639
1637
  // zenith wet delay (m) a priori
1640
1638
  ];
@@ -1645,8 +1643,9 @@ function solvePpp(epochs, sp3, opts) {
1645
1643
  P[IDX_X][IDX_X] = 100 * 100;
1646
1644
  P[IDX_Y][IDX_Y] = 100 * 100;
1647
1645
  P[IDX_Z][IDX_Z] = 100 * 100;
1648
- P[IDX_CLK][IDX_CLK] = 1e10;
1649
1646
  P[IDX_ZWD][IDX_ZWD] = 0.5 * 0.5;
1647
+ const clkIdx = /* @__PURE__ */ new Map();
1648
+ const clockSeeded = /* @__PURE__ */ new Set();
1650
1649
  const ambIdx = /* @__PURE__ */ new Map();
1651
1650
  const lastSeen = /* @__PURE__ */ new Map();
1652
1651
  const mwState = /* @__PURE__ */ new Map();
@@ -1687,8 +1686,18 @@ function solvePpp(epochs, sp3, opts) {
1687
1686
  if (i === idx) ambIdx.delete(prn);
1688
1687
  else if (i > idx) ambIdx.set(prn, i - 1);
1689
1688
  }
1689
+ for (const [sys, i] of clkIdx) {
1690
+ if (i > idx) clkIdx.set(sys, i - 1);
1691
+ }
1692
+ };
1693
+ const clockOf = (sys) => {
1694
+ let i = clkIdx.get(sys);
1695
+ if (i === void 0) {
1696
+ i = growState(0, CLK_VAR);
1697
+ clkIdx.set(sys, i);
1698
+ }
1699
+ return i;
1690
1700
  };
1691
- let clockSeeded = false;
1692
1701
  const series = [];
1693
1702
  const truth = opts.groundTruth;
1694
1703
  const t0 = epochs[0]?.timeMs ?? 0;
@@ -1696,7 +1705,7 @@ function solvePpp(epochs, sp3, opts) {
1696
1705
  let convergedStreak = 0;
1697
1706
  for (let ei = 0; ei < epochs.length; ei++) {
1698
1707
  const epoch = epochs[ei];
1699
- P[IDX_CLK][IDX_CLK] = 1e10;
1708
+ for (const ci of clkIdx.values()) P[ci][ci] = CLK_VAR;
1700
1709
  P[IDX_ZWD][IDX_ZWD] += ztdQ * (ei > 0 ? 1 : 0);
1701
1710
  const rcv = [x[IDX_X], x[IDX_Y], x[IDX_Z]];
1702
1711
  const [latDeg, , heightM] = ecefToGeodetic(rcv[0], rcv[1], rcv[2]);
@@ -1760,21 +1769,29 @@ function solvePpp(epochs, sp3, opts) {
1760
1769
  });
1761
1770
  }
1762
1771
  const zwd0 = x[IDX_ZWD];
1763
- if (vis.length > 0) {
1764
- if (!clockSeeded) {
1765
- const s = vis.map(
1766
- (v) => v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw)
1767
- ).sort((a, b) => a - b);
1768
- x[IDX_CLK] = s[Math.floor(s.length / 2)];
1769
- clockSeeded = true;
1772
+ const bySys = /* @__PURE__ */ new Map();
1773
+ for (const v of vis) {
1774
+ const sys = v.prn[0];
1775
+ const r = v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw);
1776
+ const arr = bySys.get(sys);
1777
+ if (arr) arr.push(r);
1778
+ else bySys.set(sys, [r]);
1779
+ }
1780
+ for (const [sys, res] of bySys) {
1781
+ const ci = clockOf(sys);
1782
+ if (!clockSeeded.has(sys)) {
1783
+ res.sort((a, b) => a - b);
1784
+ x[ci] = res[Math.floor(res.length / 2)];
1785
+ clockSeeded.add(sys);
1770
1786
  }
1771
- P[IDX_CLK][IDX_CLK] = 1e10;
1787
+ P[ci][ci] = CLK_VAR;
1772
1788
  }
1773
1789
  let nSats = 0;
1774
1790
  let sumPhaseResSq = 0;
1775
1791
  let nPhaseRes = 0;
1776
1792
  for (const v of vis) {
1777
- const common = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
1793
+ const ci = clockOf(v.prn[0]);
1794
+ const common = v.range + x[ci] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
1778
1795
  let ai = ambIdx.get(v.prn);
1779
1796
  if (ai === void 0 || v.slip) {
1780
1797
  const bInit = v.lIf - (common + v.windupM);
@@ -1799,13 +1816,13 @@ function solvePpp(epochs, sp3, opts) {
1799
1816
  h[IDX_X] = -v.e[0];
1800
1817
  h[IDX_Y] = -v.e[1];
1801
1818
  h[IDX_Z] = -v.e[2];
1802
- h[IDX_CLK] = 1;
1819
+ h[ci] = 1;
1803
1820
  h[IDX_ZWD] = v.mw;
1804
1821
  const innov = v.pIf - common;
1805
1822
  if (Math.abs(innov) < 1e6) ekfUpdateScalar(x, P, h, innov, rCode, 4);
1806
1823
  }
1807
1824
  {
1808
- const commonPh = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
1825
+ const commonPh = v.range + x[ci] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
1809
1826
  const innov = v.lIf - (commonPh + v.windupM + x[ai]);
1810
1827
  if (Math.abs(innov) > 0.15) {
1811
1828
  x[ai] = v.lIf - (commonPh + v.windupM);
@@ -1819,7 +1836,7 @@ function solvePpp(epochs, sp3, opts) {
1819
1836
  h[IDX_X] = -v.e[0];
1820
1837
  h[IDX_Y] = -v.e[1];
1821
1838
  h[IDX_Z] = -v.e[2];
1822
- h[IDX_CLK] = 1;
1839
+ h[ci] = 1;
1823
1840
  h[IDX_ZWD] = v.mw;
1824
1841
  h[ai] = 1;
1825
1842
  if (ekfUpdateScalar(x, P, h, innov, rPhase, 4)) {
package/dist/index.cjs CHANGED
@@ -12872,9 +12872,9 @@ function satStateAtEmission(sp3, prn, recvTimeMs, rcv) {
12872
12872
  var IDX_X = 0;
12873
12873
  var IDX_Y = 1;
12874
12874
  var IDX_Z = 2;
12875
- var IDX_CLK = 3;
12876
- var IDX_ZWD = 4;
12877
- var NBASE = 5;
12875
+ var IDX_ZWD = 3;
12876
+ var NBASE = 4;
12877
+ var CLK_VAR = 1e10;
12878
12878
  function solvePpp(epochs, sp3, opts) {
12879
12879
  const elevMask = (opts.elevationMaskDeg ?? 10) * Math.PI / 180;
12880
12880
  const codeSigma = opts.codeSigma ?? 3;
@@ -12885,8 +12885,6 @@ function solvePpp(epochs, sp3, opts) {
12885
12885
  opts.aprioriPos[0],
12886
12886
  opts.aprioriPos[1],
12887
12887
  opts.aprioriPos[2],
12888
- 0,
12889
- // receiver clock (m)
12890
12888
  0.1
12891
12889
  // zenith wet delay (m) a priori
12892
12890
  ];
@@ -12897,8 +12895,9 @@ function solvePpp(epochs, sp3, opts) {
12897
12895
  P[IDX_X][IDX_X] = 100 * 100;
12898
12896
  P[IDX_Y][IDX_Y] = 100 * 100;
12899
12897
  P[IDX_Z][IDX_Z] = 100 * 100;
12900
- P[IDX_CLK][IDX_CLK] = 1e10;
12901
12898
  P[IDX_ZWD][IDX_ZWD] = 0.5 * 0.5;
12899
+ const clkIdx = /* @__PURE__ */ new Map();
12900
+ const clockSeeded = /* @__PURE__ */ new Set();
12902
12901
  const ambIdx = /* @__PURE__ */ new Map();
12903
12902
  const lastSeen = /* @__PURE__ */ new Map();
12904
12903
  const mwState = /* @__PURE__ */ new Map();
@@ -12939,8 +12938,18 @@ function solvePpp(epochs, sp3, opts) {
12939
12938
  if (i === idx) ambIdx.delete(prn);
12940
12939
  else if (i > idx) ambIdx.set(prn, i - 1);
12941
12940
  }
12941
+ for (const [sys, i] of clkIdx) {
12942
+ if (i > idx) clkIdx.set(sys, i - 1);
12943
+ }
12944
+ };
12945
+ const clockOf = (sys) => {
12946
+ let i = clkIdx.get(sys);
12947
+ if (i === void 0) {
12948
+ i = growState(0, CLK_VAR);
12949
+ clkIdx.set(sys, i);
12950
+ }
12951
+ return i;
12942
12952
  };
12943
- let clockSeeded = false;
12944
12953
  const series = [];
12945
12954
  const truth = opts.groundTruth;
12946
12955
  const t0 = epochs[0]?.timeMs ?? 0;
@@ -12948,7 +12957,7 @@ function solvePpp(epochs, sp3, opts) {
12948
12957
  let convergedStreak = 0;
12949
12958
  for (let ei = 0; ei < epochs.length; ei++) {
12950
12959
  const epoch = epochs[ei];
12951
- P[IDX_CLK][IDX_CLK] = 1e10;
12960
+ for (const ci of clkIdx.values()) P[ci][ci] = CLK_VAR;
12952
12961
  P[IDX_ZWD][IDX_ZWD] += ztdQ * (ei > 0 ? 1 : 0);
12953
12962
  const rcv = [x[IDX_X], x[IDX_Y], x[IDX_Z]];
12954
12963
  const [latDeg, , heightM] = ecefToGeodetic(rcv[0], rcv[1], rcv[2]);
@@ -13012,21 +13021,29 @@ function solvePpp(epochs, sp3, opts) {
13012
13021
  });
13013
13022
  }
13014
13023
  const zwd0 = x[IDX_ZWD];
13015
- if (vis.length > 0) {
13016
- if (!clockSeeded) {
13017
- const s = vis.map(
13018
- (v) => v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw)
13019
- ).sort((a, b) => a - b);
13020
- x[IDX_CLK] = s[Math.floor(s.length / 2)];
13021
- clockSeeded = true;
13024
+ const bySys = /* @__PURE__ */ new Map();
13025
+ for (const v of vis) {
13026
+ const sys = v.prn[0];
13027
+ const r = v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw);
13028
+ const arr = bySys.get(sys);
13029
+ if (arr) arr.push(r);
13030
+ else bySys.set(sys, [r]);
13031
+ }
13032
+ for (const [sys, res] of bySys) {
13033
+ const ci = clockOf(sys);
13034
+ if (!clockSeeded.has(sys)) {
13035
+ res.sort((a, b) => a - b);
13036
+ x[ci] = res[Math.floor(res.length / 2)];
13037
+ clockSeeded.add(sys);
13022
13038
  }
13023
- P[IDX_CLK][IDX_CLK] = 1e10;
13039
+ P[ci][ci] = CLK_VAR;
13024
13040
  }
13025
13041
  let nSats = 0;
13026
13042
  let sumPhaseResSq = 0;
13027
13043
  let nPhaseRes = 0;
13028
13044
  for (const v of vis) {
13029
- const common = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
13045
+ const ci = clockOf(v.prn[0]);
13046
+ const common = v.range + x[ci] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
13030
13047
  let ai = ambIdx.get(v.prn);
13031
13048
  if (ai === void 0 || v.slip) {
13032
13049
  const bInit = v.lIf - (common + v.windupM);
@@ -13051,13 +13068,13 @@ function solvePpp(epochs, sp3, opts) {
13051
13068
  h[IDX_X] = -v.e[0];
13052
13069
  h[IDX_Y] = -v.e[1];
13053
13070
  h[IDX_Z] = -v.e[2];
13054
- h[IDX_CLK] = 1;
13071
+ h[ci] = 1;
13055
13072
  h[IDX_ZWD] = v.mw;
13056
13073
  const innov = v.pIf - common;
13057
13074
  if (Math.abs(innov) < 1e6) ekfUpdateScalar(x, P, h, innov, rCode, 4);
13058
13075
  }
13059
13076
  {
13060
- const commonPh = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
13077
+ const commonPh = v.range + x[ci] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
13061
13078
  const innov = v.lIf - (commonPh + v.windupM + x[ai]);
13062
13079
  if (Math.abs(innov) > 0.15) {
13063
13080
  x[ai] = v.lIf - (commonPh + v.windupM);
@@ -13071,7 +13088,7 @@ function solvePpp(epochs, sp3, opts) {
13071
13088
  h[IDX_X] = -v.e[0];
13072
13089
  h[IDX_Y] = -v.e[1];
13073
13090
  h[IDX_Z] = -v.e[2];
13074
- h[IDX_CLK] = 1;
13091
+ h[ci] = 1;
13075
13092
  h[IDX_ZWD] = v.mw;
13076
13093
  h[ai] = 1;
13077
13094
  if (ekfUpdateScalar(x, P, h, innov, rPhase, 4)) {
package/dist/index.js CHANGED
@@ -162,7 +162,7 @@ import {
162
162
  solveSpp,
163
163
  sunEcef,
164
164
  toRtkEpoch
165
- } from "./chunk-O65WA6CM.js";
165
+ } from "./chunk-5WHKMKIB.js";
166
166
  import {
167
167
  almanacEpochMs,
168
168
  almanacSatPosition,
@@ -2118,9 +2118,9 @@ function satStateAtEmission(sp3, prn, recvTimeMs, rcv) {
2118
2118
  var IDX_X = 0;
2119
2119
  var IDX_Y = 1;
2120
2120
  var IDX_Z = 2;
2121
- var IDX_CLK = 3;
2122
- var IDX_ZWD = 4;
2123
- var NBASE = 5;
2121
+ var IDX_ZWD = 3;
2122
+ var NBASE = 4;
2123
+ var CLK_VAR = 1e10;
2124
2124
  function solvePpp(epochs, sp3, opts) {
2125
2125
  const elevMask = (opts.elevationMaskDeg ?? 10) * Math.PI / 180;
2126
2126
  const codeSigma = opts.codeSigma ?? 3;
@@ -2131,8 +2131,6 @@ function solvePpp(epochs, sp3, opts) {
2131
2131
  opts.aprioriPos[0],
2132
2132
  opts.aprioriPos[1],
2133
2133
  opts.aprioriPos[2],
2134
- 0,
2135
- // receiver clock (m)
2136
2134
  0.1
2137
2135
  // zenith wet delay (m) a priori
2138
2136
  ];
@@ -2143,8 +2141,9 @@ function solvePpp(epochs, sp3, opts) {
2143
2141
  P[IDX_X][IDX_X] = 100 * 100;
2144
2142
  P[IDX_Y][IDX_Y] = 100 * 100;
2145
2143
  P[IDX_Z][IDX_Z] = 100 * 100;
2146
- P[IDX_CLK][IDX_CLK] = 1e10;
2147
2144
  P[IDX_ZWD][IDX_ZWD] = 0.5 * 0.5;
2145
+ const clkIdx = /* @__PURE__ */ new Map();
2146
+ const clockSeeded = /* @__PURE__ */ new Set();
2148
2147
  const ambIdx = /* @__PURE__ */ new Map();
2149
2148
  const lastSeen = /* @__PURE__ */ new Map();
2150
2149
  const mwState = /* @__PURE__ */ new Map();
@@ -2185,8 +2184,18 @@ function solvePpp(epochs, sp3, opts) {
2185
2184
  if (i === idx) ambIdx.delete(prn);
2186
2185
  else if (i > idx) ambIdx.set(prn, i - 1);
2187
2186
  }
2187
+ for (const [sys, i] of clkIdx) {
2188
+ if (i > idx) clkIdx.set(sys, i - 1);
2189
+ }
2190
+ };
2191
+ const clockOf = (sys) => {
2192
+ let i = clkIdx.get(sys);
2193
+ if (i === void 0) {
2194
+ i = growState(0, CLK_VAR);
2195
+ clkIdx.set(sys, i);
2196
+ }
2197
+ return i;
2188
2198
  };
2189
- let clockSeeded = false;
2190
2199
  const series = [];
2191
2200
  const truth = opts.groundTruth;
2192
2201
  const t0 = epochs[0]?.timeMs ?? 0;
@@ -2194,7 +2203,7 @@ function solvePpp(epochs, sp3, opts) {
2194
2203
  let convergedStreak = 0;
2195
2204
  for (let ei = 0; ei < epochs.length; ei++) {
2196
2205
  const epoch = epochs[ei];
2197
- P[IDX_CLK][IDX_CLK] = 1e10;
2206
+ for (const ci of clkIdx.values()) P[ci][ci] = CLK_VAR;
2198
2207
  P[IDX_ZWD][IDX_ZWD] += ztdQ * (ei > 0 ? 1 : 0);
2199
2208
  const rcv = [x[IDX_X], x[IDX_Y], x[IDX_Z]];
2200
2209
  const [latDeg, , heightM] = ecefToGeodetic(rcv[0], rcv[1], rcv[2]);
@@ -2258,21 +2267,29 @@ function solvePpp(epochs, sp3, opts) {
2258
2267
  });
2259
2268
  }
2260
2269
  const zwd0 = x[IDX_ZWD];
2261
- if (vis.length > 0) {
2262
- if (!clockSeeded) {
2263
- const s = vis.map(
2264
- (v) => v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw)
2265
- ).sort((a, b) => a - b);
2266
- x[IDX_CLK] = s[Math.floor(s.length / 2)];
2267
- clockSeeded = true;
2270
+ const bySys = /* @__PURE__ */ new Map();
2271
+ for (const v of vis) {
2272
+ const sys = v.prn[0];
2273
+ const r = v.pIf - (v.range - v.satClkM + v.tropoFixed + zwd0 * v.mw);
2274
+ const arr = bySys.get(sys);
2275
+ if (arr) arr.push(r);
2276
+ else bySys.set(sys, [r]);
2277
+ }
2278
+ for (const [sys, res] of bySys) {
2279
+ const ci = clockOf(sys);
2280
+ if (!clockSeeded.has(sys)) {
2281
+ res.sort((a, b) => a - b);
2282
+ x[ci] = res[Math.floor(res.length / 2)];
2283
+ clockSeeded.add(sys);
2268
2284
  }
2269
- P[IDX_CLK][IDX_CLK] = 1e10;
2285
+ P[ci][ci] = CLK_VAR;
2270
2286
  }
2271
2287
  let nSats = 0;
2272
2288
  let sumPhaseResSq = 0;
2273
2289
  let nPhaseRes = 0;
2274
2290
  for (const v of vis) {
2275
- const common = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
2291
+ const ci = clockOf(v.prn[0]);
2292
+ const common = v.range + x[ci] - v.satClkM + v.tropoFixed + zwd0 * v.mw;
2276
2293
  let ai = ambIdx.get(v.prn);
2277
2294
  if (ai === void 0 || v.slip) {
2278
2295
  const bInit = v.lIf - (common + v.windupM);
@@ -2297,13 +2314,13 @@ function solvePpp(epochs, sp3, opts) {
2297
2314
  h[IDX_X] = -v.e[0];
2298
2315
  h[IDX_Y] = -v.e[1];
2299
2316
  h[IDX_Z] = -v.e[2];
2300
- h[IDX_CLK] = 1;
2317
+ h[ci] = 1;
2301
2318
  h[IDX_ZWD] = v.mw;
2302
2319
  const innov = v.pIf - common;
2303
2320
  if (Math.abs(innov) < 1e6) ekfUpdateScalar(x, P, h, innov, rCode, 4);
2304
2321
  }
2305
2322
  {
2306
- const commonPh = v.range + x[IDX_CLK] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
2323
+ const commonPh = v.range + x[ci] - v.satClkM + v.tropoFixed + x[IDX_ZWD] * v.mw;
2307
2324
  const innov = v.lIf - (commonPh + v.windupM + x[ai]);
2308
2325
  if (Math.abs(innov) > 0.15) {
2309
2326
  x[ai] = v.lIf - (commonPh + v.windupM);
@@ -2317,7 +2334,7 @@ function solvePpp(epochs, sp3, opts) {
2317
2334
  h[IDX_X] = -v.e[0];
2318
2335
  h[IDX_Y] = -v.e[1];
2319
2336
  h[IDX_Z] = -v.e[2];
2320
- h[IDX_CLK] = 1;
2337
+ h[ci] = 1;
2321
2338
  h[IDX_ZWD] = v.mw;
2322
2339
  h[ai] = 1;
2323
2340
  if (ekfUpdateScalar(x, P, h, innov, rPhase, 4)) {
@@ -19,7 +19,7 @@ import {
19
19
  solveSpp,
20
20
  sunEcef,
21
21
  toRtkEpoch
22
- } from "./chunk-O65WA6CM.js";
22
+ } from "./chunk-5WHKMKIB.js";
23
23
  import "./chunk-MHGNKSSH.js";
24
24
  import "./chunk-37QNKGTC.js";
25
25
  import "./chunk-6FAL6P4G.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "description": "Comprehensive GNSS library for JavaScript — time scales, coordinates, RINEX parsing, RTCM3 decoding, orbit computation, and signal analysis",
5
5
  "type": "module",
6
6
  "sideEffects": false,