gnss-js 2.2.0 → 2.3.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/index.cjs CHANGED
@@ -116,6 +116,7 @@ __export(src_exports, {
116
116
  almanacEpochMs: () => almanacEpochMs,
117
117
  almanacSatPosition: () => almanacSatPosition,
118
118
  analyzeQuality: () => analyzeQuality,
119
+ antexFreqOfGroup: () => antexFreqOfGroup,
119
120
  applyHelmert: () => applyHelmert,
120
121
  applyIonoDcb: () => applyIonoDcb,
121
122
  applyOrbitClock: () => applyOrbitClock,
@@ -127,6 +128,7 @@ __export(src_exports, {
127
128
  buildGloChannelMap: () => buildGloChannelMap,
128
129
  buildObsIndices: () => buildObsIndices,
129
130
  buildPppAntenna: () => buildPppAntenna,
131
+ buildRtkAntenna: () => buildRtkAntenna,
130
132
  clampUnit: () => clampUnit,
131
133
  clkBias: () => clkBias,
132
134
  computeAllPositions: () => computeAllPositions,
@@ -309,6 +311,7 @@ __export(src_exports, {
309
311
  postProcessRtk: () => postProcessRtk,
310
312
  rad2deg: () => rad2deg,
311
313
  rangeRate: () => rangeRate,
314
+ rcvAntennaRangeM: () => rcvAntennaRangeM,
312
315
  readString: () => readString,
313
316
  reportDecodeError: () => reportDecodeError,
314
317
  resetGloFreqCache: () => resetGloFreqCache,
@@ -13226,6 +13229,211 @@ function lambdaReduction(Q, n) {
13226
13229
  return Z2;
13227
13230
  }
13228
13231
 
13232
+ // src/positioning/ppp-antenna.ts
13233
+ function parseAntexTime(s) {
13234
+ const p = s.trim().split(/\s+/).map(Number);
13235
+ if (p.length < 3 || p.some((v) => Number.isNaN(v))) return null;
13236
+ return Date.UTC(
13237
+ p[0],
13238
+ (p[1] || 1) - 1,
13239
+ p[2] || 1,
13240
+ p[3] ?? 0,
13241
+ p[4] ?? 0,
13242
+ Math.floor(p[5] ?? 0)
13243
+ );
13244
+ }
13245
+ function freqOf(entry, code) {
13246
+ return entry.frequencies.find((f) => f.frequency === code);
13247
+ }
13248
+ function combineIf(fA, fB, f1, f2) {
13249
+ const g = f1 * f1 / (f1 * f1 - f2 * f2);
13250
+ const mm = 1e-3;
13251
+ const pco = [
13252
+ (g * fA.pcoN - (g - 1) * fB.pcoN) * mm,
13253
+ (g * fA.pcoE - (g - 1) * fB.pcoE) * mm,
13254
+ (g * fA.pcoU - (g - 1) * fB.pcoU) * mm
13255
+ ];
13256
+ const nz = Math.min(fA.pcvNoazi.length, fB.pcvNoazi.length);
13257
+ const pcvNoazi = new Array(nz);
13258
+ for (let i = 0; i < nz; i++) {
13259
+ pcvNoazi[i] = (g * fA.pcvNoazi[i] - (g - 1) * fB.pcvNoazi[i]) * mm;
13260
+ }
13261
+ return { pco, pcvZen1Deg: 0, pcvDzenDeg: 0, pcvNoazi };
13262
+ }
13263
+ function buildPppAntenna(antex) {
13264
+ const sats = /* @__PURE__ */ new Map();
13265
+ const rcvs = /* @__PURE__ */ new Map();
13266
+ for (const a of antex.antennas) {
13267
+ if (a.isSatellite) {
13268
+ const list = sats.get(a.serialNo) ?? [];
13269
+ list.push(a);
13270
+ sats.set(a.serialNo, list);
13271
+ } else if (!rcvs.has(a.type)) {
13272
+ rcvs.set(a.type, a);
13273
+ }
13274
+ }
13275
+ const withZen = (entry, off) => ({
13276
+ ...off,
13277
+ pcvZen1Deg: entry.zen1,
13278
+ pcvDzenDeg: entry.dzen
13279
+ });
13280
+ return {
13281
+ satOffset(prn, dateMs, band1, band2, f1, f2) {
13282
+ const list = sats.get(prn);
13283
+ if (!list) return null;
13284
+ const entry = list.find((e) => {
13285
+ const from = parseAntexTime(e.validFrom);
13286
+ const until = parseAntexTime(e.validUntil);
13287
+ return (from == null || dateMs >= from) && (until == null || dateMs <= until);
13288
+ });
13289
+ if (!entry) return null;
13290
+ const a = freqOf(entry, band1);
13291
+ const b = freqOf(entry, band2);
13292
+ if (!a || !b) return null;
13293
+ return withZen(entry, combineIf(a, b, f1, f2));
13294
+ },
13295
+ rcvOffset(antType, band1, band2, f1, f2) {
13296
+ const entry = rcvs.get(antType);
13297
+ if (!entry) return null;
13298
+ const a = freqOf(entry, band1);
13299
+ const b = freqOf(entry, band2);
13300
+ if (!a || !b) return null;
13301
+ return withZen(entry, combineIf(a, b, f1, f2));
13302
+ }
13303
+ };
13304
+ }
13305
+ function cross(a, b) {
13306
+ return [
13307
+ a[1] * b[2] - a[2] * b[1],
13308
+ a[2] * b[0] - a[0] * b[2],
13309
+ a[0] * b[1] - a[1] * b[0]
13310
+ ];
13311
+ }
13312
+ function norm(a) {
13313
+ const n = Math.hypot(a[0], a[1], a[2]) || 1;
13314
+ return [a[0] / n, a[1] / n, a[2] / n];
13315
+ }
13316
+ function dot(a, b) {
13317
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
13318
+ }
13319
+ function satBodyFrame(satEcef, sunEcef2) {
13320
+ const z = norm([-satEcef[0], -satEcef[1], -satEcef[2]]);
13321
+ const eSun = norm([
13322
+ sunEcef2[0] - satEcef[0],
13323
+ sunEcef2[1] - satEcef[1],
13324
+ sunEcef2[2] - satEcef[2]
13325
+ ]);
13326
+ const y = norm(cross(z, eSun));
13327
+ const x = norm(cross(y, z));
13328
+ return { x, y, z };
13329
+ }
13330
+ function satPcoToEcef(pcoBody, frame) {
13331
+ return [
13332
+ pcoBody[0] * frame.x[0] + pcoBody[1] * frame.y[0] + pcoBody[2] * frame.z[0],
13333
+ pcoBody[0] * frame.x[1] + pcoBody[1] * frame.y[1] + pcoBody[2] * frame.z[1],
13334
+ pcoBody[0] * frame.x[2] + pcoBody[1] * frame.y[2] + pcoBody[2] * frame.z[2]
13335
+ ];
13336
+ }
13337
+ function enuToEcef(enu, latRad, lonRad) {
13338
+ const sl = Math.sin(latRad);
13339
+ const cl = Math.cos(latRad);
13340
+ const so = Math.sin(lonRad);
13341
+ const co = Math.cos(lonRad);
13342
+ const [e, n, u] = enu;
13343
+ return [
13344
+ -so * e - sl * co * n + cl * co * u,
13345
+ co * e - sl * so * n + cl * so * u,
13346
+ cl * n + sl * u
13347
+ ];
13348
+ }
13349
+ function interpPcv(off, angleDeg) {
13350
+ const { pcvZen1Deg, pcvDzenDeg, pcvNoazi } = off;
13351
+ if (pcvDzenDeg <= 0 || pcvNoazi.length < 2) return 0;
13352
+ const x = (angleDeg - pcvZen1Deg) / pcvDzenDeg;
13353
+ if (x <= 0) return pcvNoazi[0];
13354
+ if (x >= pcvNoazi.length - 1) return pcvNoazi[pcvNoazi.length - 1];
13355
+ const i = Math.floor(x);
13356
+ const t = x - i;
13357
+ return pcvNoazi[i] * (1 - t) + pcvNoazi[i + 1] * t;
13358
+ }
13359
+ function phaseWindup(prn, losRcvToSat, satFrame, latRad, lonRad, state) {
13360
+ const k = [
13361
+ -losRcvToSat[0],
13362
+ -losRcvToSat[1],
13363
+ -losRcvToSat[2]
13364
+ ];
13365
+ const kx = satFrame.x;
13366
+ const ky = satFrame.y;
13367
+ const kdotx = dot(k, kx);
13368
+ const kcrossY = cross(k, ky);
13369
+ const dS = [
13370
+ kx[0] - k[0] * kdotx - kcrossY[0],
13371
+ kx[1] - k[1] * kdotx - kcrossY[1],
13372
+ kx[2] - k[2] * kdotx - kcrossY[2]
13373
+ ];
13374
+ const north = enuToEcef([0, 1, 0], latRad, lonRad);
13375
+ const east = enuToEcef([1, 0, 0], latRad, lonRad);
13376
+ const kdotn = dot(k, north);
13377
+ const kcrossE = cross(k, east);
13378
+ const dR = [
13379
+ north[0] - k[0] * kdotn + kcrossE[0],
13380
+ north[1] - k[1] * kdotn + kcrossE[1],
13381
+ north[2] - k[2] * kdotn + kcrossE[2]
13382
+ ];
13383
+ const nS = Math.hypot(dS[0], dS[1], dS[2]) || 1;
13384
+ const nR = Math.hypot(dR[0], dR[1], dR[2]) || 1;
13385
+ let cosPhi = dot(dS, dR) / (nS * nR);
13386
+ cosPhi = Math.max(-1, Math.min(1, cosPhi));
13387
+ const zeta = cross(dS, dR);
13388
+ const sign = dot(k, zeta) >= 0 ? 1 : -1;
13389
+ const dphi = sign * Math.acos(cosPhi) / (2 * Math.PI);
13390
+ const prev = state.get(prn);
13391
+ const wu = prev == null ? dphi : dphi + Math.round(prev - dphi);
13392
+ state.set(prn, wu);
13393
+ return wu;
13394
+ }
13395
+
13396
+ // src/positioning/rtk-antenna.ts
13397
+ function freqOf2(entry, code) {
13398
+ return entry.frequencies.find((f) => f.frequency === code);
13399
+ }
13400
+ function buildRtkAntenna(antex) {
13401
+ const rcvs = /* @__PURE__ */ new Map();
13402
+ for (const a of antex.antennas) {
13403
+ if (!a.isSatellite && !rcvs.has(a.type)) rcvs.set(a.type, a);
13404
+ }
13405
+ const mm = 1e-3;
13406
+ return {
13407
+ rcvOffset(antType, freq) {
13408
+ const entry = rcvs.get(antType);
13409
+ if (!entry) return null;
13410
+ const f = freqOf2(entry, freq);
13411
+ if (!f) return null;
13412
+ return {
13413
+ pco: [f.pcoN * mm, f.pcoE * mm, f.pcoU * mm],
13414
+ pcvZen1Deg: entry.zen1,
13415
+ pcvDzenDeg: entry.dzen,
13416
+ pcvNoazi: f.pcvNoazi.map((v) => v * mm)
13417
+ };
13418
+ }
13419
+ };
13420
+ }
13421
+ function rcvAntennaRangeM(off, losRcvToSat, latRad, lonRad, elRad, antDeltaEnu = [0, 0, 0]) {
13422
+ const total = [
13423
+ off.pco[0] + antDeltaEnu[0],
13424
+ off.pco[1] + antDeltaEnu[1],
13425
+ off.pco[2] + antDeltaEnu[2]
13426
+ ];
13427
+ const ecef = enuToEcef(total, latRad, lonRad);
13428
+ let m = -dot(losRcvToSat, ecef);
13429
+ const zenithDeg = 90 - elRad * 180 / Math.PI;
13430
+ m += interpPcv(off, zenithDeg);
13431
+ return m;
13432
+ }
13433
+ function antexFreqOfGroup(group) {
13434
+ return `${group[0]}0${group[1]}`;
13435
+ }
13436
+
13229
13437
  // src/positioning/rtk.ts
13230
13438
  var L1_CODES = {
13231
13439
  G: ["1C"],
@@ -13291,8 +13499,16 @@ function resolveEphemeris(src, prn, timeMs) {
13291
13499
  return selectEphemeris(src, prn, timeMs);
13292
13500
  return src.get(prn) ?? null;
13293
13501
  }
13294
- function buildGeometry(rover, base, basePos, ephemerides, timeMs, maskRad, troposphere) {
13502
+ var ZERO_DELTA = [0, 0, 0];
13503
+ function buildGeometry(rover, base, basePos, ephemerides, timeMs, maskRad, troposphere, antenna = null) {
13295
13504
  const out = [];
13505
+ let baseLatRad = 0;
13506
+ let baseLonRad = 0;
13507
+ if (antenna?.base) {
13508
+ const [latDeg, lonDeg] = ecefToGeodetic(basePos[0], basePos[1], basePos[2]);
13509
+ baseLatRad = latDeg * Math.PI / 180;
13510
+ baseLonRad = lonDeg * Math.PI / 180;
13511
+ }
13296
13512
  for (const [prn, mR] of rover) {
13297
13513
  const sys = prn[0];
13298
13514
  if (!"GERCJ".includes(sys)) continue;
@@ -13317,14 +13533,43 @@ function buildGeometry(rover, base, basePos, ephemerides, timeMs, maskRad, tropo
13317
13533
  satB.z - basePos[2]
13318
13534
  ) / C_LIGHT;
13319
13535
  const [bx, by, bz] = sagnac(satB, travelB);
13320
- const rhoB = Math.hypot(bx - basePos[0], by - basePos[1], bz - basePos[2]);
13536
+ let rhoB = Math.hypot(bx - basePos[0], by - basePos[1], bz - basePos[2]);
13321
13537
  const elB = ecefToAzEl(basePos[0], basePos[1], basePos[2], bx, by, bz).el;
13322
13538
  if (elB < maskRad) continue;
13539
+ const group = sys + mR.code;
13540
+ let offR = null;
13541
+ let roverDelta = ZERO_DELTA;
13542
+ if (antenna) {
13543
+ const antexFreq = antexFreqOfGroup(group);
13544
+ if (antenna.base) {
13545
+ const offB = antenna.model.rcvOffset(antenna.base.type, antexFreq);
13546
+ if (offB) {
13547
+ const inv = 1 / rhoB;
13548
+ const losB = [
13549
+ (bx - basePos[0]) * inv,
13550
+ (by - basePos[1]) * inv,
13551
+ (bz - basePos[2]) * inv
13552
+ ];
13553
+ rhoB += rcvAntennaRangeM(
13554
+ offB,
13555
+ losB,
13556
+ baseLatRad,
13557
+ baseLonRad,
13558
+ elB,
13559
+ antenna.base.deltaEnu
13560
+ );
13561
+ }
13562
+ }
13563
+ if (antenna.rover) {
13564
+ offR = antenna.model.rcvOffset(antenna.rover.type, antexFreq);
13565
+ roverDelta = antenna.rover.deltaEnu ?? ZERO_DELTA;
13566
+ }
13567
+ }
13323
13568
  const gloK = sys === "R" ? mR.gloChannel ?? mB.gloChannel ?? eph.freqNum ?? null : null;
13324
13569
  const freq = carrierFreqHz(sys, mR.code, gloK);
13325
13570
  out.push({
13326
13571
  prn,
13327
- group: sys + mR.code,
13572
+ group,
13328
13573
  lambda: freq > 0 ? C_LIGHT / freq : 0,
13329
13574
  satR,
13330
13575
  rhoB,
@@ -13335,7 +13580,9 @@ function buildGeometry(rover, base, basePos, ephemerides, timeMs, maskRad, tropo
13335
13580
  cpR: mR.cp ?? null,
13336
13581
  cpB: mB.cp ?? null,
13337
13582
  lockR: mR.lockTimeMs,
13338
- lockB: mB.lockTimeMs
13583
+ lockB: mB.lockTimeMs,
13584
+ offR,
13585
+ roverDelta
13339
13586
  });
13340
13587
  }
13341
13588
  return out;
@@ -13343,17 +13590,29 @@ function buildGeometry(rover, base, basePos, ephemerides, timeMs, maskRad, tropo
13343
13590
  function roverTerms(g, x, y, z, troposphere) {
13344
13591
  const travel = Math.hypot(g.satR.x - x, g.satR.y - y, g.satR.z - z) / C_LIGHT;
13345
13592
  const [sx, sy, sz] = sagnac(g.satR, travel);
13346
- const rho = Math.hypot(sx - x, sy - y, sz - z);
13593
+ let rho = Math.hypot(sx - x, sy - y, sz - z);
13347
13594
  const u = [
13348
13595
  (x - sx) / rho,
13349
13596
  (y - sy) / rho,
13350
13597
  (z - sz) / rho
13351
13598
  ];
13599
+ const needEl = troposphere || g.offR != null;
13600
+ const elR = needEl ? ecefToAzEl(x, y, z, sx, sy, sz).el : 0;
13352
13601
  let dTropo = 0;
13353
13602
  if (troposphere) {
13354
- const elR = ecefToAzEl(x, y, z, sx, sy, sz).el;
13355
13603
  dTropo = tropoDelay(Math.max(elR, 0.05)) - g.tropoB;
13356
13604
  }
13605
+ if (g.offR) {
13606
+ const [latDeg, lonDeg] = ecefToGeodetic(x, y, z);
13607
+ rho += rcvAntennaRangeM(
13608
+ g.offR,
13609
+ [-u[0], -u[1], -u[2]],
13610
+ latDeg * Math.PI / 180,
13611
+ lonDeg * Math.PI / 180,
13612
+ elR,
13613
+ g.roverDelta
13614
+ );
13615
+ }
13357
13616
  return { rho, u, dTropo };
13358
13617
  }
13359
13618
  function sdVariance(sigmaM, elRad) {
@@ -13592,7 +13851,8 @@ var RtkFloatEngine = class {
13592
13851
  arElevationMaskDeg: opts.arElevationMaskDeg ?? 0,
13593
13852
  glonassAr: opts.glonassAr ?? false,
13594
13853
  partialFixing: opts.partialFixing ?? true,
13595
- minFixAmbiguities: opts.minFixAmbiguities ?? 4
13854
+ minFixAmbiguities: opts.minFixAmbiguities ?? 4,
13855
+ antenna: opts.antenna ?? null
13596
13856
  };
13597
13857
  }
13598
13858
  /** Clear all filter state (position, ambiguities, lock history). */
@@ -13715,7 +13975,8 @@ var RtkFloatEngine = class {
13715
13975
  this.ephemerides,
13716
13976
  timeMs,
13717
13977
  o.elevationMaskDeg * Math.PI / 180,
13718
- o.troposphere
13978
+ o.troposphere,
13979
+ o.antenna
13719
13980
  );
13720
13981
  const byPrn = new Map(geom.map((g) => [g.prn, g]));
13721
13982
  const dtS = this.lastMs !== null ? (timeMs - this.lastMs) / 1e3 : 0;
@@ -14843,14 +15104,14 @@ var SbasProcessor = class {
14843
15104
  };
14844
15105
 
14845
15106
  // src/positioning/ssr-apply.ts
14846
- var cross = (a, b) => [
15107
+ var cross2 = (a, b) => [
14847
15108
  a[1] * b[2] - a[2] * b[1],
14848
15109
  a[2] * b[0] - a[0] * b[2],
14849
15110
  a[0] * b[1] - a[1] * b[0]
14850
15111
  ];
14851
- var norm = (a) => Math.hypot(a[0], a[1], a[2]);
15112
+ var norm2 = (a) => Math.hypot(a[0], a[1], a[2]);
14852
15113
  var unit = (a) => {
14853
- const n = norm(a);
15114
+ const n = norm2(a);
14854
15115
  return n > 0 ? [a[0] / n, a[1] / n, a[2] / n] : [0, 0, 0];
14855
15116
  };
14856
15117
  function applyOrbitClock(eph, corr, timeMs) {
@@ -14864,8 +15125,8 @@ function applyOrbitClock(eph, corr, timeMs) {
14864
15125
  const p = [s.x, s.y, s.z];
14865
15126
  const v = [s.vx, s.vy, s.vz];
14866
15127
  const er = unit(p);
14867
- const en = unit(cross(p, v));
14868
- const ea = cross(en, er);
15128
+ const en = unit(cross2(p, v));
15129
+ const ea = cross2(en, er);
14869
15130
  const dr = corr.radial + (corr.dotRadial ?? 0) * age;
14870
15131
  const da = corr.along + (corr.dotAlong ?? 0) * age;
14871
15132
  const dc = corr.cross + (corr.dotCross ?? 0) * age;
@@ -15075,170 +15336,6 @@ function solidEarthTide(rcv, sun, moon) {
15075
15336
  return disp;
15076
15337
  }
15077
15338
 
15078
- // src/positioning/ppp-antenna.ts
15079
- function parseAntexTime(s) {
15080
- const p = s.trim().split(/\s+/).map(Number);
15081
- if (p.length < 3 || p.some((v) => Number.isNaN(v))) return null;
15082
- return Date.UTC(
15083
- p[0],
15084
- (p[1] || 1) - 1,
15085
- p[2] || 1,
15086
- p[3] ?? 0,
15087
- p[4] ?? 0,
15088
- Math.floor(p[5] ?? 0)
15089
- );
15090
- }
15091
- function freqOf(entry, code) {
15092
- return entry.frequencies.find((f) => f.frequency === code);
15093
- }
15094
- function combineIf(fA, fB, f1, f2) {
15095
- const g = f1 * f1 / (f1 * f1 - f2 * f2);
15096
- const mm = 1e-3;
15097
- const pco = [
15098
- (g * fA.pcoN - (g - 1) * fB.pcoN) * mm,
15099
- (g * fA.pcoE - (g - 1) * fB.pcoE) * mm,
15100
- (g * fA.pcoU - (g - 1) * fB.pcoU) * mm
15101
- ];
15102
- const nz = Math.min(fA.pcvNoazi.length, fB.pcvNoazi.length);
15103
- const pcvNoazi = new Array(nz);
15104
- for (let i = 0; i < nz; i++) {
15105
- pcvNoazi[i] = (g * fA.pcvNoazi[i] - (g - 1) * fB.pcvNoazi[i]) * mm;
15106
- }
15107
- return { pco, pcvZen1Deg: 0, pcvDzenDeg: 0, pcvNoazi };
15108
- }
15109
- function buildPppAntenna(antex) {
15110
- const sats = /* @__PURE__ */ new Map();
15111
- const rcvs = /* @__PURE__ */ new Map();
15112
- for (const a of antex.antennas) {
15113
- if (a.isSatellite) {
15114
- const list = sats.get(a.serialNo) ?? [];
15115
- list.push(a);
15116
- sats.set(a.serialNo, list);
15117
- } else if (!rcvs.has(a.type)) {
15118
- rcvs.set(a.type, a);
15119
- }
15120
- }
15121
- const withZen = (entry, off) => ({
15122
- ...off,
15123
- pcvZen1Deg: entry.zen1,
15124
- pcvDzenDeg: entry.dzen
15125
- });
15126
- return {
15127
- satOffset(prn, dateMs, band1, band2, f1, f2) {
15128
- const list = sats.get(prn);
15129
- if (!list) return null;
15130
- const entry = list.find((e) => {
15131
- const from = parseAntexTime(e.validFrom);
15132
- const until = parseAntexTime(e.validUntil);
15133
- return (from == null || dateMs >= from) && (until == null || dateMs <= until);
15134
- });
15135
- if (!entry) return null;
15136
- const a = freqOf(entry, band1);
15137
- const b = freqOf(entry, band2);
15138
- if (!a || !b) return null;
15139
- return withZen(entry, combineIf(a, b, f1, f2));
15140
- },
15141
- rcvOffset(antType, band1, band2, f1, f2) {
15142
- const entry = rcvs.get(antType);
15143
- if (!entry) return null;
15144
- const a = freqOf(entry, band1);
15145
- const b = freqOf(entry, band2);
15146
- if (!a || !b) return null;
15147
- return withZen(entry, combineIf(a, b, f1, f2));
15148
- }
15149
- };
15150
- }
15151
- function cross2(a, b) {
15152
- return [
15153
- a[1] * b[2] - a[2] * b[1],
15154
- a[2] * b[0] - a[0] * b[2],
15155
- a[0] * b[1] - a[1] * b[0]
15156
- ];
15157
- }
15158
- function norm2(a) {
15159
- const n = Math.hypot(a[0], a[1], a[2]) || 1;
15160
- return [a[0] / n, a[1] / n, a[2] / n];
15161
- }
15162
- function dot(a, b) {
15163
- return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
15164
- }
15165
- function satBodyFrame(satEcef, sunEcef2) {
15166
- const z = norm2([-satEcef[0], -satEcef[1], -satEcef[2]]);
15167
- const eSun = norm2([
15168
- sunEcef2[0] - satEcef[0],
15169
- sunEcef2[1] - satEcef[1],
15170
- sunEcef2[2] - satEcef[2]
15171
- ]);
15172
- const y = norm2(cross2(z, eSun));
15173
- const x = norm2(cross2(y, z));
15174
- return { x, y, z };
15175
- }
15176
- function satPcoToEcef(pcoBody, frame) {
15177
- return [
15178
- pcoBody[0] * frame.x[0] + pcoBody[1] * frame.y[0] + pcoBody[2] * frame.z[0],
15179
- pcoBody[0] * frame.x[1] + pcoBody[1] * frame.y[1] + pcoBody[2] * frame.z[1],
15180
- pcoBody[0] * frame.x[2] + pcoBody[1] * frame.y[2] + pcoBody[2] * frame.z[2]
15181
- ];
15182
- }
15183
- function enuToEcef(enu, latRad, lonRad) {
15184
- const sl = Math.sin(latRad);
15185
- const cl = Math.cos(latRad);
15186
- const so = Math.sin(lonRad);
15187
- const co = Math.cos(lonRad);
15188
- const [e, n, u] = enu;
15189
- return [
15190
- -so * e - sl * co * n + cl * co * u,
15191
- co * e - sl * so * n + cl * so * u,
15192
- cl * n + sl * u
15193
- ];
15194
- }
15195
- function interpPcv(off, angleDeg) {
15196
- const { pcvZen1Deg, pcvDzenDeg, pcvNoazi } = off;
15197
- if (pcvDzenDeg <= 0 || pcvNoazi.length < 2) return 0;
15198
- const x = (angleDeg - pcvZen1Deg) / pcvDzenDeg;
15199
- if (x <= 0) return pcvNoazi[0];
15200
- if (x >= pcvNoazi.length - 1) return pcvNoazi[pcvNoazi.length - 1];
15201
- const i = Math.floor(x);
15202
- const t = x - i;
15203
- return pcvNoazi[i] * (1 - t) + pcvNoazi[i + 1] * t;
15204
- }
15205
- function phaseWindup(prn, losRcvToSat, satFrame, latRad, lonRad, state) {
15206
- const k = [
15207
- -losRcvToSat[0],
15208
- -losRcvToSat[1],
15209
- -losRcvToSat[2]
15210
- ];
15211
- const kx = satFrame.x;
15212
- const ky = satFrame.y;
15213
- const kdotx = dot(k, kx);
15214
- const kcrossY = cross2(k, ky);
15215
- const dS = [
15216
- kx[0] - k[0] * kdotx - kcrossY[0],
15217
- kx[1] - k[1] * kdotx - kcrossY[1],
15218
- kx[2] - k[2] * kdotx - kcrossY[2]
15219
- ];
15220
- const north = enuToEcef([0, 1, 0], latRad, lonRad);
15221
- const east = enuToEcef([1, 0, 0], latRad, lonRad);
15222
- const kdotn = dot(k, north);
15223
- const kcrossE = cross2(k, east);
15224
- const dR = [
15225
- north[0] - k[0] * kdotn + kcrossE[0],
15226
- north[1] - k[1] * kdotn + kcrossE[1],
15227
- north[2] - k[2] * kdotn + kcrossE[2]
15228
- ];
15229
- const nS = Math.hypot(dS[0], dS[1], dS[2]) || 1;
15230
- const nR = Math.hypot(dR[0], dR[1], dR[2]) || 1;
15231
- let cosPhi = dot(dS, dR) / (nS * nR);
15232
- cosPhi = Math.max(-1, Math.min(1, cosPhi));
15233
- const zeta = cross2(dS, dR);
15234
- const sign = dot(k, zeta) >= 0 ? 1 : -1;
15235
- const dphi = sign * Math.acos(cosPhi) / (2 * Math.PI);
15236
- const prev = state.get(prn);
15237
- const wu = prev == null ? dphi : dphi + Math.round(prev - dphi);
15238
- state.set(prn, wu);
15239
- return wu;
15240
- }
15241
-
15242
15339
  // src/positioning/ppp-corrections.ts
15243
15340
  function applyCorrections(corrections, geom, ctx) {
15244
15341
  if (corrections.evaluate) return corrections.evaluate(geom, ctx);
@@ -18989,6 +19086,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
18989
19086
  almanacEpochMs,
18990
19087
  almanacSatPosition,
18991
19088
  analyzeQuality,
19089
+ antexFreqOfGroup,
18992
19090
  applyHelmert,
18993
19091
  applyIonoDcb,
18994
19092
  applyOrbitClock,
@@ -19000,6 +19098,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
19000
19098
  buildGloChannelMap,
19001
19099
  buildObsIndices,
19002
19100
  buildPppAntenna,
19101
+ buildRtkAntenna,
19003
19102
  clampUnit,
19004
19103
  clkBias,
19005
19104
  computeAllPositions,
@@ -19182,6 +19281,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
19182
19281
  postProcessRtk,
19183
19282
  rad2deg,
19184
19283
  rangeRate,
19284
+ rcvAntennaRangeM,
19185
19285
  readString,
19186
19286
  reportDecodeError,
19187
19287
  resetGloFreqCache,
package/dist/index.d.cts CHANGED
@@ -19,7 +19,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
19
19
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.cjs';
20
20
  export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.cjs';
21
21
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
22
- export { AntennaOffset, AppliedOrbitClock, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, OrbitClockCorrection, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEngine, PppEphemerisSource, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SatSample, SbasCorrectionSource, SbasIgp, SbasIonoDelay, SbasProcessor, SbasSatCorrection, Sp3EphemerisSource, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, applyOrbitClock, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, hasToOrbitClock, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
22
+ export { AntennaOffset, AppliedOrbitClock, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, OrbitClockCorrection, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEngine, PppEphemerisSource, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkAntennaConfig, RtkAntennaModel, RtkAntennaOffset, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkReceiverAntenna, RtkTrackPoint, SatGeom, SatSample, SbasCorrectionSource, SbasIgp, SbasIonoDelay, SbasProcessor, SbasSatCorrection, Sp3EphemerisSource, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, antexFreqOfGroup, applyOrbitClock, buildPppAntenna, buildRtkAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, hasToOrbitClock, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, rcvAntennaRangeM, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
23
23
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.cjs';
24
24
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.cjs';
25
25
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.cjs';
package/dist/index.d.ts CHANGED
@@ -19,7 +19,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
19
19
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.js';
20
20
  export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.js';
21
21
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
22
- export { AntennaOffset, AppliedOrbitClock, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, OrbitClockCorrection, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEngine, PppEphemerisSource, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SatSample, SbasCorrectionSource, SbasIgp, SbasIonoDelay, SbasProcessor, SbasSatCorrection, Sp3EphemerisSource, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, applyOrbitClock, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, hasToOrbitClock, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
22
+ export { AntennaOffset, AppliedOrbitClock, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, OrbitClockCorrection, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEngine, PppEphemerisSource, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkAntennaConfig, RtkAntennaModel, RtkAntennaOffset, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkReceiverAntenna, RtkTrackPoint, SatGeom, SatSample, SbasCorrectionSource, SbasIgp, SbasIonoDelay, SbasProcessor, SbasSatCorrection, Sp3EphemerisSource, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, antexFreqOfGroup, applyOrbitClock, buildPppAntenna, buildRtkAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, hasToOrbitClock, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, rcvAntennaRangeM, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
23
23
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.js';
24
24
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.js';
25
25
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.js';
package/dist/index.js CHANGED
@@ -174,8 +174,10 @@ import {
174
174
  RtkFloatEngine,
175
175
  SbasProcessor,
176
176
  Sp3EphemerisSource,
177
+ antexFreqOfGroup,
177
178
  applyOrbitClock,
178
179
  buildPppAntenna,
180
+ buildRtkAntenna,
179
181
  createPppCorrections,
180
182
  estimateNarrowlaneFcb,
181
183
  estimateNetworkFcbs,
@@ -194,6 +196,7 @@ import {
194
196
  niellMapping,
195
197
  nlWavelength,
196
198
  postProcessRtk,
199
+ rcvAntennaRangeM,
197
200
  resolvePppAmbiguities,
198
201
  satClockCorrection,
199
202
  sbasIonoDeg,
@@ -206,7 +209,7 @@ import {
206
209
  sunEcef,
207
210
  toRtkEpoch,
208
211
  wlWavelength
209
- } from "./chunk-DWUQRJ37.js";
212
+ } from "./chunk-TYJNN77C.js";
210
213
  import "./chunk-WQX354KD.js";
211
214
  import {
212
215
  almanacEpochMs,
@@ -486,6 +489,7 @@ export {
486
489
  almanacEpochMs,
487
490
  almanacSatPosition,
488
491
  analyzeQuality,
492
+ antexFreqOfGroup,
489
493
  applyHelmert,
490
494
  applyIonoDcb,
491
495
  applyOrbitClock,
@@ -497,6 +501,7 @@ export {
497
501
  buildGloChannelMap,
498
502
  buildObsIndices,
499
503
  buildPppAntenna,
504
+ buildRtkAntenna,
500
505
  clampUnit,
501
506
  clkBias,
502
507
  computeAllPositions,
@@ -679,6 +684,7 @@ export {
679
684
  postProcessRtk,
680
685
  rad2deg,
681
686
  rangeRate,
687
+ rcvAntennaRangeM,
682
688
  readString,
683
689
  reportDecodeError,
684
690
  resetGloFreqCache,