ootk 6.0.0 → 6.0.2
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/main.cjs +692 -17
- package/dist/main.d.cts +379 -23
- package/dist/main.d.ts +379 -23
- package/dist/main.js +692 -18
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -9855,13 +9855,26 @@ var FormatTle = class _FormatTle {
|
|
|
9855
9855
|
const meanaStr = _FormatTle.meanAnomaly(meana);
|
|
9856
9856
|
const ecenStr = _FormatTle.eccentricity(ecen);
|
|
9857
9857
|
const intlStr = intl.padEnd(8, " ");
|
|
9858
|
-
|
|
9858
|
+
const classification = tleParams.classification ?? "U";
|
|
9859
|
+
const elementSetNo = (tleParams.elementSetNo ?? 999).toString().padStart(4, " ");
|
|
9860
|
+
const ephemerisType = (tleParams.ephemerisType ?? 0).toString();
|
|
9861
|
+
const revAtEpoch = (tleParams.revAtEpoch ?? 0).toString().padStart(5, " ");
|
|
9862
|
+
let TLE1Ending;
|
|
9863
|
+
if (tleParams.sat) {
|
|
9864
|
+
TLE1Ending = tleParams.sat.tle1.substring(32, 71);
|
|
9865
|
+
} else {
|
|
9866
|
+
const mmDot = _FormatTle.formatMeanMotionDot(tleParams.meanMotionDot ?? 0);
|
|
9867
|
+
const mmDdot = _FormatTle.formatTleExponential(tleParams.meanMotionDdot ?? 0);
|
|
9868
|
+
const bstarStr = _FormatTle.formatTleExponential(tleParams.bstar ?? 0);
|
|
9869
|
+
TLE1Ending = ` ${mmDot} ${mmDdot} ${bstarStr} ${ephemerisType} ${elementSetNo}0`;
|
|
9870
|
+
}
|
|
9859
9871
|
TLE1Ending = TLE1Ending[1] === " " ? _FormatTle.setCharAt(TLE1Ending, 1, "+") : TLE1Ending;
|
|
9860
9872
|
TLE1Ending = TLE1Ending[12] === " " ? _FormatTle.setCharAt(TLE1Ending, 12, "+") : TLE1Ending;
|
|
9861
9873
|
TLE1Ending = TLE1Ending[21] === " " ? _FormatTle.setCharAt(TLE1Ending, 21, "+") : TLE1Ending;
|
|
9862
|
-
|
|
9863
|
-
const tle1 =
|
|
9864
|
-
const
|
|
9874
|
+
const tle1Pre = `1 ${scc}${classification} ${intlStr} ${epochYrStr}${epochdayStr}${TLE1Ending}`;
|
|
9875
|
+
const tle1 = _FormatTle.setCharAt(tle1Pre, 68, _FormatTle.tleChecksum(tle1Pre).toString());
|
|
9876
|
+
const tle2Pre = `2 ${scc} ${incStr} ${rascStr} ${ecenStr} ${argPeStr} ${meanaStr} ${meanmoStr}${revAtEpoch}0`;
|
|
9877
|
+
const tle2 = _FormatTle.setCharAt(tle2Pre, 68, _FormatTle.tleChecksum(tle2Pre).toString());
|
|
9865
9878
|
return { tle1, tle2 };
|
|
9866
9879
|
}
|
|
9867
9880
|
/**
|
|
@@ -9990,6 +10003,61 @@ var FormatTle = class _FormatTle {
|
|
|
9990
10003
|
}
|
|
9991
10004
|
return `${str.substring(0, index)}${chr}${str.substring(index + 1)}`;
|
|
9992
10005
|
}
|
|
10006
|
+
/**
|
|
10007
|
+
* Format mean motion dot (first derivative / 2) for TLE line 1.
|
|
10008
|
+
* Format: sign + ".NNNNNNNN" = 10 chars total.
|
|
10009
|
+
* @param value - Mean motion dot value (rev/day^2)
|
|
10010
|
+
* @returns Formatted 10-character string
|
|
10011
|
+
*/
|
|
10012
|
+
static formatMeanMotionDot(value) {
|
|
10013
|
+
const sign2 = value >= 0 ? " " : "-";
|
|
10014
|
+
return sign2 + Math.abs(value).toFixed(8).substring(1);
|
|
10015
|
+
}
|
|
10016
|
+
/**
|
|
10017
|
+
* Format a value in TLE exponential notation for BSTAR or mean motion ddot.
|
|
10018
|
+
* Format: "sNNNNN±N" (8 chars) where mantissa has implied leading decimal point.
|
|
10019
|
+
* Example: 0.00017507 → " 17507-3" (i.e., .17507 × 10^-3)
|
|
10020
|
+
* @param value - The value to format
|
|
10021
|
+
* @returns Formatted 8-character string
|
|
10022
|
+
*/
|
|
10023
|
+
static formatTleExponential(value) {
|
|
10024
|
+
if (value === 0) {
|
|
10025
|
+
return " 00000-0";
|
|
10026
|
+
}
|
|
10027
|
+
const sign2 = value >= 0 ? " " : "-";
|
|
10028
|
+
const absVal = Math.abs(value);
|
|
10029
|
+
let exponent = Math.floor(Math.log10(absVal)) + 1;
|
|
10030
|
+
let mantissa = absVal / Math.pow(10, exponent);
|
|
10031
|
+
if (mantissa >= 1) {
|
|
10032
|
+
mantissa /= 10;
|
|
10033
|
+
exponent++;
|
|
10034
|
+
}
|
|
10035
|
+
if (mantissa < 0.1 && mantissa > 0) {
|
|
10036
|
+
mantissa *= 10;
|
|
10037
|
+
exponent--;
|
|
10038
|
+
}
|
|
10039
|
+
const mantissaStr = Math.round(mantissa * 1e5).toString().padStart(5, "0");
|
|
10040
|
+
const expSign = exponent >= 0 ? "+" : "-";
|
|
10041
|
+
const expStr = Math.abs(exponent).toString();
|
|
10042
|
+
return sign2 + mantissaStr + expSign + expStr;
|
|
10043
|
+
}
|
|
10044
|
+
/**
|
|
10045
|
+
* Compute TLE line checksum (modulo 10 sum of digits, '-' counts as 1).
|
|
10046
|
+
* @param line - TLE line (first 68 characters are summed)
|
|
10047
|
+
* @returns Checksum digit (0-9)
|
|
10048
|
+
*/
|
|
10049
|
+
static tleChecksum(line) {
|
|
10050
|
+
let sum = 0;
|
|
10051
|
+
for (let i = 0; i < 68 && i < line.length; i++) {
|
|
10052
|
+
const c = line[i];
|
|
10053
|
+
if (c >= "0" && c <= "9") {
|
|
10054
|
+
sum += parseInt(c);
|
|
10055
|
+
} else if (c === "-") {
|
|
10056
|
+
sum += 1;
|
|
10057
|
+
}
|
|
10058
|
+
}
|
|
10059
|
+
return sum % 10;
|
|
10060
|
+
}
|
|
9993
10061
|
};
|
|
9994
10062
|
|
|
9995
10063
|
// src/coordinate/RelativeState.ts
|
|
@@ -14041,7 +14109,7 @@ ${this.line2}`;
|
|
|
14041
14109
|
bstar1 *= 10 ** exponent;
|
|
14042
14110
|
if (bstarSymbol === "-") {
|
|
14043
14111
|
bstar1 *= -1;
|
|
14044
|
-
} else if (bstarSymbol === "+" || bstarSymbol === " ") ; else {
|
|
14112
|
+
} else if (bstarSymbol === "+" || bstarSymbol === " " || bstarSymbol === "0") ; else {
|
|
14045
14113
|
throw new ParseError(`Invalid BSTAR symbol: ${bstarSymbol}`, "TLE");
|
|
14046
14114
|
}
|
|
14047
14115
|
return toPrecision(bstar1, 14);
|
|
@@ -14251,7 +14319,8 @@ ${this.line2}`;
|
|
|
14251
14319
|
* @returns The first derivative of the mean motion.
|
|
14252
14320
|
*/
|
|
14253
14321
|
static meanMoDev1(tleLine1) {
|
|
14254
|
-
const
|
|
14322
|
+
const raw = tleLine1.substring(_Tle.meanMoDev1_.start, _Tle.meanMoDev1_.stop).trim();
|
|
14323
|
+
const meanMoDev1 = parseFloat(raw.startsWith("+") ? raw.substring(1) : raw);
|
|
14255
14324
|
if (isNaN(meanMoDev1)) {
|
|
14256
14325
|
throw new ParseError("Invalid first derivative of mean motion", "TLE");
|
|
14257
14326
|
}
|
|
@@ -16586,6 +16655,14 @@ var Satellite = class _Satellite extends SpaceObject {
|
|
|
16586
16655
|
name
|
|
16587
16656
|
});
|
|
16588
16657
|
}
|
|
16658
|
+
/**
|
|
16659
|
+
* Creates a Satellite from an OMM (Orbit Mean-elements Message) data object.
|
|
16660
|
+
* @param omm - The OMM data in flat format
|
|
16661
|
+
* @param name - Optional satellite name (overrides OMM OBJECT_NAME)
|
|
16662
|
+
*/
|
|
16663
|
+
static fromOmm(omm, name) {
|
|
16664
|
+
return new _Satellite({ omm, name: name ?? omm.OBJECT_NAME });
|
|
16665
|
+
}
|
|
16589
16666
|
// ==================== TLE/OMM Parsing ====================
|
|
16590
16667
|
parseTleAndUpdateOrbit_(tle1, tle2, sccNum) {
|
|
16591
16668
|
const tleData = Tle.parse(tle1, tle2);
|
|
@@ -16614,8 +16691,9 @@ var Satellite = class _Satellite extends SpaceObject {
|
|
|
16614
16691
|
this.satrec = Sgp4.createSatrec(tle1, tle2);
|
|
16615
16692
|
}
|
|
16616
16693
|
parseOmmAndUpdateOrbit_(omm) {
|
|
16617
|
-
|
|
16618
|
-
this.
|
|
16694
|
+
const noradStr = String(omm.NORAD_CAT_ID);
|
|
16695
|
+
this.sccNum = noradStr.padStart(5, "0");
|
|
16696
|
+
this.sccNum5 = Tle.convert6DigitToA5(noradStr);
|
|
16619
16697
|
this.sccNum6 = Tle.convertA5to6Digit(this.sccNum5);
|
|
16620
16698
|
this.intlDes = omm.OBJECT_ID;
|
|
16621
16699
|
const YYYY = omm.EPOCH.slice(0, 4);
|
|
@@ -16628,6 +16706,19 @@ var Satellite = class _Satellite extends SpaceObject {
|
|
|
16628
16706
|
const dayOfYear = (epochDateObj - Date.UTC(Number(YYYY), 0, 0)) / 864e5;
|
|
16629
16707
|
const ommParsed = {
|
|
16630
16708
|
...omm,
|
|
16709
|
+
NORAD_CAT_ID: noradStr,
|
|
16710
|
+
MEAN_MOTION: String(omm.MEAN_MOTION),
|
|
16711
|
+
ECCENTRICITY: String(omm.ECCENTRICITY),
|
|
16712
|
+
INCLINATION: String(omm.INCLINATION),
|
|
16713
|
+
RA_OF_ASC_NODE: String(omm.RA_OF_ASC_NODE),
|
|
16714
|
+
ARG_OF_PERICENTER: String(omm.ARG_OF_PERICENTER),
|
|
16715
|
+
MEAN_ANOMALY: String(omm.MEAN_ANOMALY),
|
|
16716
|
+
EPHEMERIS_TYPE: String(omm.EPHEMERIS_TYPE),
|
|
16717
|
+
ELEMENT_SET_NO: String(omm.ELEMENT_SET_NO),
|
|
16718
|
+
REV_AT_EPOCH: String(omm.REV_AT_EPOCH),
|
|
16719
|
+
BSTAR: String(omm.BSTAR),
|
|
16720
|
+
MEAN_MOTION_DOT: String(omm.MEAN_MOTION_DOT),
|
|
16721
|
+
MEAN_MOTION_DDOT: String(omm.MEAN_MOTION_DDOT),
|
|
16631
16722
|
epoch: {
|
|
16632
16723
|
year: Number(YYYY),
|
|
16633
16724
|
month: Number(MM),
|
|
@@ -16640,20 +16731,41 @@ var Satellite = class _Satellite extends SpaceObject {
|
|
|
16640
16731
|
};
|
|
16641
16732
|
this.epochYear = parseInt(YYYY.slice(2, 4));
|
|
16642
16733
|
this.epochDay = dayOfYear;
|
|
16643
|
-
this.meanMoDev1 =
|
|
16644
|
-
this.meanMoDev2 =
|
|
16645
|
-
this.bstar =
|
|
16646
|
-
this.inclination =
|
|
16647
|
-
this.rightAscension =
|
|
16648
|
-
this.eccentricity =
|
|
16649
|
-
this.argOfPerigee =
|
|
16650
|
-
this.meanAnomaly =
|
|
16651
|
-
this.meanMotion =
|
|
16734
|
+
this.meanMoDev1 = Number(omm.MEAN_MOTION_DOT);
|
|
16735
|
+
this.meanMoDev2 = Number(omm.MEAN_MOTION_DDOT);
|
|
16736
|
+
this.bstar = Number(omm.BSTAR);
|
|
16737
|
+
this.inclination = Number(omm.INCLINATION);
|
|
16738
|
+
this.rightAscension = Number(omm.RA_OF_ASC_NODE);
|
|
16739
|
+
this.eccentricity = Number(omm.ECCENTRICITY);
|
|
16740
|
+
this.argOfPerigee = Number(omm.ARG_OF_PERICENTER);
|
|
16741
|
+
this.meanAnomaly = Number(omm.MEAN_ANOMALY);
|
|
16742
|
+
this.meanMotion = Number(omm.MEAN_MOTION);
|
|
16652
16743
|
this.period = 1440 / this.meanMotion;
|
|
16653
16744
|
this.semiMajorAxis = (8681663653e-3 / this.meanMotion) ** (2 / 3);
|
|
16654
16745
|
this.semiMinorAxis = this.semiMajorAxis * Math.sqrt(1 - this.eccentricity ** 2);
|
|
16655
16746
|
this.apogee = this.semiMajorAxis * (1 + this.eccentricity) - 6371;
|
|
16656
16747
|
this.perigee = this.semiMajorAxis * (1 - this.eccentricity) - 6371;
|
|
16748
|
+
const { tle1, tle2 } = FormatTle.createTle({
|
|
16749
|
+
inc: this.inclination,
|
|
16750
|
+
meanmo: this.meanMotion,
|
|
16751
|
+
rasc: this.rightAscension,
|
|
16752
|
+
argPe: this.argOfPerigee,
|
|
16753
|
+
meana: this.meanAnomaly,
|
|
16754
|
+
ecen: this.eccentricity,
|
|
16755
|
+
epochyr: this.epochYear,
|
|
16756
|
+
epochday: this.epochDay,
|
|
16757
|
+
intl: omm.OBJECT_ID,
|
|
16758
|
+
scc: this.sccNum,
|
|
16759
|
+
bstar: this.bstar,
|
|
16760
|
+
meanMotionDot: this.meanMoDev1,
|
|
16761
|
+
meanMotionDdot: this.meanMoDev2,
|
|
16762
|
+
classification: String(omm.CLASSIFICATION_TYPE) || "U",
|
|
16763
|
+
revAtEpoch: Number(omm.REV_AT_EPOCH) || 0,
|
|
16764
|
+
elementSetNo: Number(omm.ELEMENT_SET_NO) || 999,
|
|
16765
|
+
ephemerisType: Number(omm.EPHEMERIS_TYPE) || 0
|
|
16766
|
+
});
|
|
16767
|
+
this.tle1 = tle1;
|
|
16768
|
+
this.tle2 = tle2;
|
|
16657
16769
|
this.satrec = Sgp4.createSatrecFromOmm(ommParsed);
|
|
16658
16770
|
}
|
|
16659
16771
|
// ==================== Type Checking ====================
|
|
@@ -25123,6 +25235,568 @@ var OdmExporter = class _OdmExporter {
|
|
|
25123
25235
|
}
|
|
25124
25236
|
};
|
|
25125
25237
|
|
|
25238
|
+
// src/parsers/OmmParser.ts
|
|
25239
|
+
var OmmParser = class _OmmParser {
|
|
25240
|
+
constructor() {
|
|
25241
|
+
}
|
|
25242
|
+
/**
|
|
25243
|
+
* Parse OMM KVN format text into structured data.
|
|
25244
|
+
* @param content - The raw OMM file content as a string
|
|
25245
|
+
* @returns Parsed OMM structure with all sections
|
|
25246
|
+
* @throws ParseError if the file cannot be parsed or is missing required fields
|
|
25247
|
+
*/
|
|
25248
|
+
static parse(content) {
|
|
25249
|
+
const lines = content.split(/\r?\n/u).map((l) => l.trim()).filter((l) => l.length > 0);
|
|
25250
|
+
const keyValues = _OmmParser.parseKeyValues_(lines);
|
|
25251
|
+
const comments = _OmmParser.parseComments_(lines);
|
|
25252
|
+
const header = _OmmParser.parseHeader_(keyValues, comments.header);
|
|
25253
|
+
const metadata = _OmmParser.parseMetadata_(keyValues, comments.metadata);
|
|
25254
|
+
const meanElements = _OmmParser.parseMeanElements_(keyValues, comments.meanElements);
|
|
25255
|
+
const result = { header, metadata, meanElements };
|
|
25256
|
+
const spacecraftParameters = _OmmParser.parseSpacecraftParameters_(keyValues, comments.spacecraft);
|
|
25257
|
+
if (spacecraftParameters) {
|
|
25258
|
+
result.spacecraftParameters = spacecraftParameters;
|
|
25259
|
+
}
|
|
25260
|
+
const tleParameters = _OmmParser.parseTleParameters_(keyValues, comments.tle);
|
|
25261
|
+
if (tleParameters) {
|
|
25262
|
+
result.tleParameters = tleParameters;
|
|
25263
|
+
}
|
|
25264
|
+
const covarianceMatrix = _OmmParser.parseCovarianceMatrix_(keyValues, comments.covariance);
|
|
25265
|
+
if (covarianceMatrix) {
|
|
25266
|
+
result.covarianceMatrix = covarianceMatrix;
|
|
25267
|
+
}
|
|
25268
|
+
const userDefined = _OmmParser.parseUserDefined_(keyValues);
|
|
25269
|
+
if (userDefined) {
|
|
25270
|
+
result.userDefined = userDefined;
|
|
25271
|
+
}
|
|
25272
|
+
_OmmParser.validate_(result);
|
|
25273
|
+
return result;
|
|
25274
|
+
}
|
|
25275
|
+
/**
|
|
25276
|
+
* Check if a parsed OMM represents TLE-compatible data.
|
|
25277
|
+
* @param omm - Parsed OMM structure
|
|
25278
|
+
* @returns true if the OMM uses SGP, SGP4, or SGP4-XP mean element theory
|
|
25279
|
+
*/
|
|
25280
|
+
static isTleCompatible(omm) {
|
|
25281
|
+
const theory = omm.metadata.MEAN_ELEMENT_THEORY.toUpperCase();
|
|
25282
|
+
return theory === "SGP" || theory === "SGP4" || theory === "SGP4-XP";
|
|
25283
|
+
}
|
|
25284
|
+
/**
|
|
25285
|
+
* Parse a CelesTrak-style flat JSON OMM object into the structured ParsedOmm format.
|
|
25286
|
+
*
|
|
25287
|
+
* CelesTrak's JSON OMM format is a flat object with all fields at the top level,
|
|
25288
|
+
* omitting metadata fields like CENTER_NAME, REF_FRAME, TIME_SYSTEM, and
|
|
25289
|
+
* MEAN_ELEMENT_THEORY (which are always EARTH/TEME/UTC/SGP4 for GP data).
|
|
25290
|
+
*
|
|
25291
|
+
* @param omm - A flat OMM JSON object from CelesTrak
|
|
25292
|
+
* @returns Parsed OMM structure with inferred metadata
|
|
25293
|
+
*/
|
|
25294
|
+
static parseJson(omm) {
|
|
25295
|
+
const result = {
|
|
25296
|
+
header: {
|
|
25297
|
+
CCSDS_OMM_VERS: "3.0",
|
|
25298
|
+
CREATION_DATE: (/* @__PURE__ */ new Date()).toISOString(),
|
|
25299
|
+
ORIGINATOR: "CelesTrak"
|
|
25300
|
+
},
|
|
25301
|
+
metadata: {
|
|
25302
|
+
OBJECT_NAME: omm.OBJECT_NAME,
|
|
25303
|
+
OBJECT_ID: omm.OBJECT_ID,
|
|
25304
|
+
CENTER_NAME: "EARTH",
|
|
25305
|
+
REF_FRAME: "TEME",
|
|
25306
|
+
TIME_SYSTEM: "UTC",
|
|
25307
|
+
MEAN_ELEMENT_THEORY: "SGP4"
|
|
25308
|
+
},
|
|
25309
|
+
meanElements: {
|
|
25310
|
+
EPOCH: omm.EPOCH,
|
|
25311
|
+
MEAN_MOTION: Number(omm.MEAN_MOTION),
|
|
25312
|
+
ECCENTRICITY: Number(omm.ECCENTRICITY),
|
|
25313
|
+
INCLINATION: Number(omm.INCLINATION),
|
|
25314
|
+
RA_OF_ASC_NODE: Number(omm.RA_OF_ASC_NODE),
|
|
25315
|
+
ARG_OF_PERICENTER: Number(omm.ARG_OF_PERICENTER),
|
|
25316
|
+
MEAN_ANOMALY: Number(omm.MEAN_ANOMALY)
|
|
25317
|
+
},
|
|
25318
|
+
tleParameters: {
|
|
25319
|
+
EPHEMERIS_TYPE: Number(omm.EPHEMERIS_TYPE),
|
|
25320
|
+
CLASSIFICATION_TYPE: String(omm.CLASSIFICATION_TYPE),
|
|
25321
|
+
NORAD_CAT_ID: Number(omm.NORAD_CAT_ID),
|
|
25322
|
+
ELEMENT_SET_NO: Number(omm.ELEMENT_SET_NO),
|
|
25323
|
+
REV_AT_EPOCH: Number(omm.REV_AT_EPOCH),
|
|
25324
|
+
BSTAR: Number(omm.BSTAR),
|
|
25325
|
+
MEAN_MOTION_DOT: Number(omm.MEAN_MOTION_DOT),
|
|
25326
|
+
MEAN_MOTION_DDOT: Number(omm.MEAN_MOTION_DDOT)
|
|
25327
|
+
}
|
|
25328
|
+
};
|
|
25329
|
+
return result;
|
|
25330
|
+
}
|
|
25331
|
+
/**
|
|
25332
|
+
* Parse an array of CelesTrak-style flat JSON OMM objects.
|
|
25333
|
+
* @param ommArray - Array of flat OMM JSON objects from CelesTrak
|
|
25334
|
+
* @returns Array of parsed OMM structures
|
|
25335
|
+
*/
|
|
25336
|
+
static parseJsonArray(ommArray) {
|
|
25337
|
+
return ommArray.map((omm) => _OmmParser.parseJson(omm));
|
|
25338
|
+
}
|
|
25339
|
+
/**
|
|
25340
|
+
* Parse all key-value pairs from OMM lines (excluding COMMENT lines).
|
|
25341
|
+
*/
|
|
25342
|
+
static parseKeyValues_(lines) {
|
|
25343
|
+
const keyValues = /* @__PURE__ */ new Map();
|
|
25344
|
+
for (const line of lines) {
|
|
25345
|
+
if (line.startsWith("COMMENT")) {
|
|
25346
|
+
continue;
|
|
25347
|
+
}
|
|
25348
|
+
if (!line.includes("=")) {
|
|
25349
|
+
continue;
|
|
25350
|
+
}
|
|
25351
|
+
const eqIndex = line.indexOf("=");
|
|
25352
|
+
const key = line.substring(0, eqIndex).trim();
|
|
25353
|
+
const value = line.substring(eqIndex + 1).trim();
|
|
25354
|
+
keyValues.set(key, value);
|
|
25355
|
+
}
|
|
25356
|
+
return keyValues;
|
|
25357
|
+
}
|
|
25358
|
+
/**
|
|
25359
|
+
* Parse COMMENT lines and assign them to sections based on position.
|
|
25360
|
+
*
|
|
25361
|
+
* Comments are assigned to sections based on the keywords that follow them.
|
|
25362
|
+
* The OMM KVN format allows comments at the beginning of each section.
|
|
25363
|
+
*/
|
|
25364
|
+
static parseComments_(lines) {
|
|
25365
|
+
const result = {
|
|
25366
|
+
header: [],
|
|
25367
|
+
metadata: [],
|
|
25368
|
+
meanElements: [],
|
|
25369
|
+
spacecraft: [],
|
|
25370
|
+
tle: [],
|
|
25371
|
+
covariance: []
|
|
25372
|
+
};
|
|
25373
|
+
let section = "header";
|
|
25374
|
+
const pendingComments = [];
|
|
25375
|
+
for (const line of lines) {
|
|
25376
|
+
if (line.startsWith("COMMENT")) {
|
|
25377
|
+
pendingComments.push(line.substring(7).trim());
|
|
25378
|
+
continue;
|
|
25379
|
+
}
|
|
25380
|
+
if (!line.includes("=")) {
|
|
25381
|
+
continue;
|
|
25382
|
+
}
|
|
25383
|
+
const eqIndex = line.indexOf("=");
|
|
25384
|
+
const key = line.substring(0, eqIndex).trim();
|
|
25385
|
+
if (key === "OBJECT_NAME") {
|
|
25386
|
+
section = "metadata";
|
|
25387
|
+
} else if (key === "EPOCH") {
|
|
25388
|
+
section = "meanElements";
|
|
25389
|
+
} else if (key === "MASS" || key === "SOLAR_RAD_AREA") {
|
|
25390
|
+
section = "spacecraft";
|
|
25391
|
+
} else if (key === "EPHEMERIS_TYPE" || key === "CLASSIFICATION_TYPE" || key === "NORAD_CAT_ID") {
|
|
25392
|
+
section = "tle";
|
|
25393
|
+
} else if (key === "COV_REF_FRAME" || key === "CX_X") {
|
|
25394
|
+
section = "covariance";
|
|
25395
|
+
}
|
|
25396
|
+
if (pendingComments.length > 0) {
|
|
25397
|
+
result[section].push(...pendingComments);
|
|
25398
|
+
pendingComments.length = 0;
|
|
25399
|
+
}
|
|
25400
|
+
}
|
|
25401
|
+
if (pendingComments.length > 0) {
|
|
25402
|
+
result[section].push(...pendingComments);
|
|
25403
|
+
}
|
|
25404
|
+
return result;
|
|
25405
|
+
}
|
|
25406
|
+
/**
|
|
25407
|
+
* Parse header section.
|
|
25408
|
+
* @see CCSDS 502.0-B-3 Table 4-1
|
|
25409
|
+
*/
|
|
25410
|
+
static parseHeader_(kv, comments) {
|
|
25411
|
+
const version = kv.get("CCSDS_OMM_VERS");
|
|
25412
|
+
if (!version) {
|
|
25413
|
+
throw new ParseError("Missing required CCSDS_OMM_VERS field", "OMM");
|
|
25414
|
+
}
|
|
25415
|
+
const creationDate = kv.get("CREATION_DATE");
|
|
25416
|
+
if (!creationDate) {
|
|
25417
|
+
throw new ParseError("Missing required CREATION_DATE field", "OMM");
|
|
25418
|
+
}
|
|
25419
|
+
const originator = kv.get("ORIGINATOR");
|
|
25420
|
+
if (!originator) {
|
|
25421
|
+
throw new ParseError("Missing required ORIGINATOR field", "OMM");
|
|
25422
|
+
}
|
|
25423
|
+
const header = {
|
|
25424
|
+
CCSDS_OMM_VERS: version,
|
|
25425
|
+
CREATION_DATE: creationDate,
|
|
25426
|
+
ORIGINATOR: originator
|
|
25427
|
+
};
|
|
25428
|
+
const messageId = kv.get("MESSAGE_ID");
|
|
25429
|
+
if (messageId) {
|
|
25430
|
+
header.MESSAGE_ID = messageId;
|
|
25431
|
+
}
|
|
25432
|
+
const classification = kv.get("CLASSIFICATION");
|
|
25433
|
+
if (classification) {
|
|
25434
|
+
header.CLASSIFICATION = classification;
|
|
25435
|
+
}
|
|
25436
|
+
if (comments.length > 0) {
|
|
25437
|
+
header.COMMENT = comments;
|
|
25438
|
+
}
|
|
25439
|
+
return header;
|
|
25440
|
+
}
|
|
25441
|
+
/**
|
|
25442
|
+
* Parse metadata section.
|
|
25443
|
+
* @see CCSDS 502.0-B-3 Table 4-2
|
|
25444
|
+
*/
|
|
25445
|
+
static parseMetadata_(kv, comments) {
|
|
25446
|
+
const objectName = kv.get("OBJECT_NAME");
|
|
25447
|
+
if (!objectName) {
|
|
25448
|
+
throw new ParseError("Missing required OBJECT_NAME field", "OMM");
|
|
25449
|
+
}
|
|
25450
|
+
const objectId = kv.get("OBJECT_ID");
|
|
25451
|
+
if (!objectId) {
|
|
25452
|
+
throw new ParseError("Missing required OBJECT_ID field", "OMM");
|
|
25453
|
+
}
|
|
25454
|
+
const centerName = kv.get("CENTER_NAME");
|
|
25455
|
+
if (!centerName) {
|
|
25456
|
+
throw new ParseError("Missing required CENTER_NAME field", "OMM");
|
|
25457
|
+
}
|
|
25458
|
+
const refFrame = kv.get("REF_FRAME");
|
|
25459
|
+
if (!refFrame) {
|
|
25460
|
+
throw new ParseError("Missing required REF_FRAME field", "OMM");
|
|
25461
|
+
}
|
|
25462
|
+
const timeSystem = kv.get("TIME_SYSTEM");
|
|
25463
|
+
if (!timeSystem) {
|
|
25464
|
+
throw new ParseError("Missing required TIME_SYSTEM field", "OMM");
|
|
25465
|
+
}
|
|
25466
|
+
const meanElementTheory = kv.get("MEAN_ELEMENT_THEORY");
|
|
25467
|
+
if (!meanElementTheory) {
|
|
25468
|
+
throw new ParseError("Missing required MEAN_ELEMENT_THEORY field", "OMM");
|
|
25469
|
+
}
|
|
25470
|
+
const metadata = {
|
|
25471
|
+
OBJECT_NAME: objectName,
|
|
25472
|
+
OBJECT_ID: objectId,
|
|
25473
|
+
CENTER_NAME: centerName,
|
|
25474
|
+
REF_FRAME: refFrame,
|
|
25475
|
+
TIME_SYSTEM: timeSystem,
|
|
25476
|
+
MEAN_ELEMENT_THEORY: meanElementTheory
|
|
25477
|
+
};
|
|
25478
|
+
const refFrameEpoch = kv.get("REF_FRAME_EPOCH");
|
|
25479
|
+
if (refFrameEpoch) {
|
|
25480
|
+
metadata.REF_FRAME_EPOCH = refFrameEpoch;
|
|
25481
|
+
}
|
|
25482
|
+
if (comments.length > 0) {
|
|
25483
|
+
metadata.COMMENT = comments;
|
|
25484
|
+
}
|
|
25485
|
+
return metadata;
|
|
25486
|
+
}
|
|
25487
|
+
/**
|
|
25488
|
+
* Parse mean Keplerian elements section.
|
|
25489
|
+
* @see CCSDS 502.0-B-3 Table 4-3
|
|
25490
|
+
*/
|
|
25491
|
+
static parseMeanElements_(kv, comments) {
|
|
25492
|
+
const epoch = kv.get("EPOCH");
|
|
25493
|
+
if (!epoch) {
|
|
25494
|
+
throw new ParseError("Missing required EPOCH field", "OMM");
|
|
25495
|
+
}
|
|
25496
|
+
const semiMajorAxis = _OmmParser.parseOptionalFloat_(kv, "SEMI_MAJOR_AXIS");
|
|
25497
|
+
const meanMotion = _OmmParser.parseOptionalFloat_(kv, "MEAN_MOTION");
|
|
25498
|
+
if (semiMajorAxis === void 0 && meanMotion === void 0) {
|
|
25499
|
+
throw new ParseError("Either SEMI_MAJOR_AXIS or MEAN_MOTION must be provided", "OMM");
|
|
25500
|
+
}
|
|
25501
|
+
const eccentricity = _OmmParser.parseRequiredFloat_(kv, "ECCENTRICITY");
|
|
25502
|
+
const inclination = _OmmParser.parseRequiredFloat_(kv, "INCLINATION");
|
|
25503
|
+
const raOfAscNode = _OmmParser.parseRequiredFloat_(kv, "RA_OF_ASC_NODE");
|
|
25504
|
+
const argOfPericenter = _OmmParser.parseRequiredFloat_(kv, "ARG_OF_PERICENTER");
|
|
25505
|
+
const meanAnomaly = _OmmParser.parseRequiredFloat_(kv, "MEAN_ANOMALY");
|
|
25506
|
+
const elements = {
|
|
25507
|
+
EPOCH: epoch,
|
|
25508
|
+
ECCENTRICITY: eccentricity,
|
|
25509
|
+
INCLINATION: inclination,
|
|
25510
|
+
RA_OF_ASC_NODE: raOfAscNode,
|
|
25511
|
+
ARG_OF_PERICENTER: argOfPericenter,
|
|
25512
|
+
MEAN_ANOMALY: meanAnomaly
|
|
25513
|
+
};
|
|
25514
|
+
if (semiMajorAxis !== void 0) {
|
|
25515
|
+
elements.SEMI_MAJOR_AXIS = semiMajorAxis;
|
|
25516
|
+
}
|
|
25517
|
+
if (meanMotion !== void 0) {
|
|
25518
|
+
elements.MEAN_MOTION = meanMotion;
|
|
25519
|
+
}
|
|
25520
|
+
const gm = _OmmParser.parseOptionalFloat_(kv, "GM");
|
|
25521
|
+
if (gm !== void 0) {
|
|
25522
|
+
elements.GM = gm;
|
|
25523
|
+
}
|
|
25524
|
+
if (comments.length > 0) {
|
|
25525
|
+
elements.COMMENT = comments;
|
|
25526
|
+
}
|
|
25527
|
+
return elements;
|
|
25528
|
+
}
|
|
25529
|
+
/**
|
|
25530
|
+
* Parse optional spacecraft parameters section.
|
|
25531
|
+
* @see CCSDS 502.0-B-3 Table 4-3
|
|
25532
|
+
*/
|
|
25533
|
+
static parseSpacecraftParameters_(kv, comments) {
|
|
25534
|
+
const mass = _OmmParser.parseOptionalFloat_(kv, "MASS");
|
|
25535
|
+
const solarRadArea = _OmmParser.parseOptionalFloat_(kv, "SOLAR_RAD_AREA");
|
|
25536
|
+
const solarRadCoeff = _OmmParser.parseOptionalFloat_(kv, "SOLAR_RAD_COEFF");
|
|
25537
|
+
const dragArea = _OmmParser.parseOptionalFloat_(kv, "DRAG_AREA");
|
|
25538
|
+
const dragCoeff = _OmmParser.parseOptionalFloat_(kv, "DRAG_COEFF");
|
|
25539
|
+
if (mass === void 0 && solarRadArea === void 0 && solarRadCoeff === void 0 && dragArea === void 0 && dragCoeff === void 0 && comments.length === 0) {
|
|
25540
|
+
return null;
|
|
25541
|
+
}
|
|
25542
|
+
const params = {};
|
|
25543
|
+
if (mass !== void 0) {
|
|
25544
|
+
params.MASS = mass;
|
|
25545
|
+
}
|
|
25546
|
+
if (solarRadArea !== void 0) {
|
|
25547
|
+
params.SOLAR_RAD_AREA = solarRadArea;
|
|
25548
|
+
}
|
|
25549
|
+
if (solarRadCoeff !== void 0) {
|
|
25550
|
+
params.SOLAR_RAD_COEFF = solarRadCoeff;
|
|
25551
|
+
}
|
|
25552
|
+
if (dragArea !== void 0) {
|
|
25553
|
+
params.DRAG_AREA = dragArea;
|
|
25554
|
+
}
|
|
25555
|
+
if (dragCoeff !== void 0) {
|
|
25556
|
+
params.DRAG_COEFF = dragCoeff;
|
|
25557
|
+
}
|
|
25558
|
+
if (comments.length > 0) {
|
|
25559
|
+
params.COMMENT = comments;
|
|
25560
|
+
}
|
|
25561
|
+
return params;
|
|
25562
|
+
}
|
|
25563
|
+
/**
|
|
25564
|
+
* Parse optional TLE-related parameters section.
|
|
25565
|
+
* @see CCSDS 502.0-B-3 Table 4-3
|
|
25566
|
+
*/
|
|
25567
|
+
static parseTleParameters_(kv, comments) {
|
|
25568
|
+
const ephemerisType = _OmmParser.parseOptionalInt_(kv, "EPHEMERIS_TYPE");
|
|
25569
|
+
const classificationType = kv.get("CLASSIFICATION_TYPE");
|
|
25570
|
+
const noradCatId = _OmmParser.parseOptionalInt_(kv, "NORAD_CAT_ID");
|
|
25571
|
+
const elementSetNo = _OmmParser.parseOptionalInt_(kv, "ELEMENT_SET_NO");
|
|
25572
|
+
const revAtEpoch = _OmmParser.parseOptionalInt_(kv, "REV_AT_EPOCH");
|
|
25573
|
+
const bstar = _OmmParser.parseOptionalFloat_(kv, "BSTAR");
|
|
25574
|
+
const bterm = _OmmParser.parseOptionalFloat_(kv, "BTERM");
|
|
25575
|
+
const meanMotionDot = _OmmParser.parseOptionalFloat_(kv, "MEAN_MOTION_DOT");
|
|
25576
|
+
const meanMotionDdot = _OmmParser.parseOptionalFloat_(kv, "MEAN_MOTION_DDOT");
|
|
25577
|
+
const agom = _OmmParser.parseOptionalFloat_(kv, "AGOM");
|
|
25578
|
+
if (ephemerisType === void 0 && classificationType === void 0 && noradCatId === void 0 && elementSetNo === void 0 && revAtEpoch === void 0 && bstar === void 0 && bterm === void 0 && meanMotionDot === void 0 && meanMotionDdot === void 0 && agom === void 0 && comments.length === 0) {
|
|
25579
|
+
return null;
|
|
25580
|
+
}
|
|
25581
|
+
const params = {};
|
|
25582
|
+
if (ephemerisType !== void 0) {
|
|
25583
|
+
params.EPHEMERIS_TYPE = ephemerisType;
|
|
25584
|
+
}
|
|
25585
|
+
if (classificationType !== void 0) {
|
|
25586
|
+
params.CLASSIFICATION_TYPE = classificationType;
|
|
25587
|
+
}
|
|
25588
|
+
if (noradCatId !== void 0) {
|
|
25589
|
+
params.NORAD_CAT_ID = noradCatId;
|
|
25590
|
+
}
|
|
25591
|
+
if (elementSetNo !== void 0) {
|
|
25592
|
+
params.ELEMENT_SET_NO = elementSetNo;
|
|
25593
|
+
}
|
|
25594
|
+
if (revAtEpoch !== void 0) {
|
|
25595
|
+
params.REV_AT_EPOCH = revAtEpoch;
|
|
25596
|
+
}
|
|
25597
|
+
if (bstar !== void 0) {
|
|
25598
|
+
params.BSTAR = bstar;
|
|
25599
|
+
}
|
|
25600
|
+
if (bterm !== void 0) {
|
|
25601
|
+
params.BTERM = bterm;
|
|
25602
|
+
}
|
|
25603
|
+
if (meanMotionDot !== void 0) {
|
|
25604
|
+
params.MEAN_MOTION_DOT = meanMotionDot;
|
|
25605
|
+
}
|
|
25606
|
+
if (meanMotionDdot !== void 0) {
|
|
25607
|
+
params.MEAN_MOTION_DDOT = meanMotionDdot;
|
|
25608
|
+
}
|
|
25609
|
+
if (agom !== void 0) {
|
|
25610
|
+
params.AGOM = agom;
|
|
25611
|
+
}
|
|
25612
|
+
if (comments.length > 0) {
|
|
25613
|
+
params.COMMENT = comments;
|
|
25614
|
+
}
|
|
25615
|
+
return params;
|
|
25616
|
+
}
|
|
25617
|
+
/**
|
|
25618
|
+
* Parse optional covariance matrix section.
|
|
25619
|
+
* @see CCSDS 502.0-B-3 Table 4-3
|
|
25620
|
+
*/
|
|
25621
|
+
static parseCovarianceMatrix_(kv, comments) {
|
|
25622
|
+
const cxX = _OmmParser.parseOptionalFloat_(kv, "CX_X");
|
|
25623
|
+
if (cxX === void 0) {
|
|
25624
|
+
return null;
|
|
25625
|
+
}
|
|
25626
|
+
const cov = {
|
|
25627
|
+
CX_X: cxX,
|
|
25628
|
+
CY_X: _OmmParser.parseOptionalFloat_(kv, "CY_X"),
|
|
25629
|
+
CY_Y: _OmmParser.parseOptionalFloat_(kv, "CY_Y"),
|
|
25630
|
+
CZ_X: _OmmParser.parseOptionalFloat_(kv, "CZ_X"),
|
|
25631
|
+
CZ_Y: _OmmParser.parseOptionalFloat_(kv, "CZ_Y"),
|
|
25632
|
+
CZ_Z: _OmmParser.parseOptionalFloat_(kv, "CZ_Z"),
|
|
25633
|
+
CX_DOT_X: _OmmParser.parseOptionalFloat_(kv, "CX_DOT_X"),
|
|
25634
|
+
CX_DOT_Y: _OmmParser.parseOptionalFloat_(kv, "CX_DOT_Y"),
|
|
25635
|
+
CX_DOT_Z: _OmmParser.parseOptionalFloat_(kv, "CX_DOT_Z"),
|
|
25636
|
+
CX_DOT_X_DOT: _OmmParser.parseOptionalFloat_(kv, "CX_DOT_X_DOT"),
|
|
25637
|
+
CY_DOT_X: _OmmParser.parseOptionalFloat_(kv, "CY_DOT_X"),
|
|
25638
|
+
CY_DOT_Y: _OmmParser.parseOptionalFloat_(kv, "CY_DOT_Y"),
|
|
25639
|
+
CY_DOT_Z: _OmmParser.parseOptionalFloat_(kv, "CY_DOT_Z"),
|
|
25640
|
+
CY_DOT_X_DOT: _OmmParser.parseOptionalFloat_(kv, "CY_DOT_X_DOT"),
|
|
25641
|
+
CY_DOT_Y_DOT: _OmmParser.parseOptionalFloat_(kv, "CY_DOT_Y_DOT"),
|
|
25642
|
+
CZ_DOT_X: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_X"),
|
|
25643
|
+
CZ_DOT_Y: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_Y"),
|
|
25644
|
+
CZ_DOT_Z: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_Z"),
|
|
25645
|
+
CZ_DOT_X_DOT: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_X_DOT"),
|
|
25646
|
+
CZ_DOT_Y_DOT: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_Y_DOT"),
|
|
25647
|
+
CZ_DOT_Z_DOT: _OmmParser.parseOptionalFloat_(kv, "CZ_DOT_Z_DOT")
|
|
25648
|
+
};
|
|
25649
|
+
const covRefFrame = kv.get("COV_REF_FRAME");
|
|
25650
|
+
if (covRefFrame) {
|
|
25651
|
+
cov.COV_REF_FRAME = covRefFrame;
|
|
25652
|
+
}
|
|
25653
|
+
if (comments.length > 0) {
|
|
25654
|
+
cov.COMMENT = comments;
|
|
25655
|
+
}
|
|
25656
|
+
return cov;
|
|
25657
|
+
}
|
|
25658
|
+
/**
|
|
25659
|
+
* Parse user-defined parameters section.
|
|
25660
|
+
*/
|
|
25661
|
+
static parseUserDefined_(kv) {
|
|
25662
|
+
const userDefined = {};
|
|
25663
|
+
let found = false;
|
|
25664
|
+
for (const [key, value] of kv) {
|
|
25665
|
+
if (key.startsWith("USER_DEFINED_")) {
|
|
25666
|
+
userDefined[key] = value;
|
|
25667
|
+
found = true;
|
|
25668
|
+
}
|
|
25669
|
+
}
|
|
25670
|
+
return found ? userDefined : null;
|
|
25671
|
+
}
|
|
25672
|
+
/**
|
|
25673
|
+
* Parse a required float field.
|
|
25674
|
+
* @throws ParseError if the field is missing or not a valid number
|
|
25675
|
+
*/
|
|
25676
|
+
static parseRequiredFloat_(kv, key) {
|
|
25677
|
+
const value = kv.get(key);
|
|
25678
|
+
if (value === void 0) {
|
|
25679
|
+
throw new ParseError(`Missing required ${key} field`, "OMM");
|
|
25680
|
+
}
|
|
25681
|
+
const parsed = parseFloat(value);
|
|
25682
|
+
if (isNaN(parsed)) {
|
|
25683
|
+
throw new ParseError(`Invalid numeric value for ${key}: ${value}`, "OMM");
|
|
25684
|
+
}
|
|
25685
|
+
return parsed;
|
|
25686
|
+
}
|
|
25687
|
+
/**
|
|
25688
|
+
* Parse an optional float field.
|
|
25689
|
+
*/
|
|
25690
|
+
static parseOptionalFloat_(kv, key) {
|
|
25691
|
+
const value = kv.get(key);
|
|
25692
|
+
if (value === void 0) {
|
|
25693
|
+
return void 0;
|
|
25694
|
+
}
|
|
25695
|
+
const parsed = parseFloat(value);
|
|
25696
|
+
return isNaN(parsed) ? void 0 : parsed;
|
|
25697
|
+
}
|
|
25698
|
+
/**
|
|
25699
|
+
* Parse an optional integer field.
|
|
25700
|
+
*/
|
|
25701
|
+
static parseOptionalInt_(kv, key) {
|
|
25702
|
+
const value = kv.get(key);
|
|
25703
|
+
if (value === void 0) {
|
|
25704
|
+
return void 0;
|
|
25705
|
+
}
|
|
25706
|
+
const parsed = parseInt(value, 10);
|
|
25707
|
+
return isNaN(parsed) ? void 0 : parsed;
|
|
25708
|
+
}
|
|
25709
|
+
/**
|
|
25710
|
+
* Validate parsed OMM for required fields and consistency.
|
|
25711
|
+
* @throws ParseError if validation fails
|
|
25712
|
+
*/
|
|
25713
|
+
static validate_(omm) {
|
|
25714
|
+
const errors = [];
|
|
25715
|
+
if (!omm.header.CCSDS_OMM_VERS) {
|
|
25716
|
+
errors.push("Missing CCSDS_OMM_VERS");
|
|
25717
|
+
}
|
|
25718
|
+
if (!omm.header.CREATION_DATE) {
|
|
25719
|
+
errors.push("Missing CREATION_DATE");
|
|
25720
|
+
}
|
|
25721
|
+
if (!omm.header.ORIGINATOR) {
|
|
25722
|
+
errors.push("Missing ORIGINATOR");
|
|
25723
|
+
}
|
|
25724
|
+
if (!omm.metadata.OBJECT_NAME) {
|
|
25725
|
+
errors.push("Missing OBJECT_NAME");
|
|
25726
|
+
}
|
|
25727
|
+
if (!omm.metadata.OBJECT_ID) {
|
|
25728
|
+
errors.push("Missing OBJECT_ID");
|
|
25729
|
+
}
|
|
25730
|
+
if (!omm.metadata.CENTER_NAME) {
|
|
25731
|
+
errors.push("Missing CENTER_NAME");
|
|
25732
|
+
}
|
|
25733
|
+
if (!omm.metadata.REF_FRAME) {
|
|
25734
|
+
errors.push("Missing REF_FRAME");
|
|
25735
|
+
}
|
|
25736
|
+
if (!omm.metadata.TIME_SYSTEM) {
|
|
25737
|
+
errors.push("Missing TIME_SYSTEM");
|
|
25738
|
+
}
|
|
25739
|
+
if (!omm.metadata.MEAN_ELEMENT_THEORY) {
|
|
25740
|
+
errors.push("Missing MEAN_ELEMENT_THEORY");
|
|
25741
|
+
}
|
|
25742
|
+
if (!omm.meanElements.EPOCH) {
|
|
25743
|
+
errors.push("Missing EPOCH");
|
|
25744
|
+
}
|
|
25745
|
+
if (omm.meanElements.SEMI_MAJOR_AXIS === void 0 && omm.meanElements.MEAN_MOTION === void 0) {
|
|
25746
|
+
errors.push("Either SEMI_MAJOR_AXIS or MEAN_MOTION must be provided");
|
|
25747
|
+
}
|
|
25748
|
+
const theory = omm.metadata.MEAN_ELEMENT_THEORY?.toUpperCase();
|
|
25749
|
+
if (theory === "SGP" || theory === "SGP4") {
|
|
25750
|
+
if (omm.meanElements.MEAN_MOTION === void 0) {
|
|
25751
|
+
errors.push("MEAN_MOTION is required when MEAN_ELEMENT_THEORY is SGP/SGP4");
|
|
25752
|
+
}
|
|
25753
|
+
}
|
|
25754
|
+
if (theory === "SGP" || theory === "SGP4" || theory === "SGP4-XP") {
|
|
25755
|
+
if (omm.metadata.CENTER_NAME !== "EARTH") {
|
|
25756
|
+
errors.push("CENTER_NAME must be EARTH for SGP/SGP4/SGP4-XP mean element theory");
|
|
25757
|
+
}
|
|
25758
|
+
if (omm.metadata.REF_FRAME !== "TEME") {
|
|
25759
|
+
errors.push("REF_FRAME must be TEME for SGP/SGP4/SGP4-XP mean element theory");
|
|
25760
|
+
}
|
|
25761
|
+
if (omm.metadata.TIME_SYSTEM !== "UTC") {
|
|
25762
|
+
errors.push("TIME_SYSTEM must be UTC for SGP/SGP4/SGP4-XP mean element theory");
|
|
25763
|
+
}
|
|
25764
|
+
}
|
|
25765
|
+
if (omm.covarianceMatrix) {
|
|
25766
|
+
const covKeys = [
|
|
25767
|
+
"CX_X",
|
|
25768
|
+
"CY_X",
|
|
25769
|
+
"CY_Y",
|
|
25770
|
+
"CZ_X",
|
|
25771
|
+
"CZ_Y",
|
|
25772
|
+
"CZ_Z",
|
|
25773
|
+
"CX_DOT_X",
|
|
25774
|
+
"CX_DOT_Y",
|
|
25775
|
+
"CX_DOT_Z",
|
|
25776
|
+
"CX_DOT_X_DOT",
|
|
25777
|
+
"CY_DOT_X",
|
|
25778
|
+
"CY_DOT_Y",
|
|
25779
|
+
"CY_DOT_Z",
|
|
25780
|
+
"CY_DOT_X_DOT",
|
|
25781
|
+
"CY_DOT_Y_DOT",
|
|
25782
|
+
"CZ_DOT_X",
|
|
25783
|
+
"CZ_DOT_Y",
|
|
25784
|
+
"CZ_DOT_Z",
|
|
25785
|
+
"CZ_DOT_X_DOT",
|
|
25786
|
+
"CZ_DOT_Y_DOT",
|
|
25787
|
+
"CZ_DOT_Z_DOT"
|
|
25788
|
+
];
|
|
25789
|
+
const missing = covKeys.filter((k) => omm.covarianceMatrix[k] === void 0);
|
|
25790
|
+
if (missing.length > 0 && missing.length < covKeys.length) {
|
|
25791
|
+
errors.push(`Incomplete covariance matrix: missing ${missing.join(", ")}`);
|
|
25792
|
+
}
|
|
25793
|
+
}
|
|
25794
|
+
if (errors.length > 0) {
|
|
25795
|
+
throw new ParseError(`OMM validation failed: ${errors.join(", ")}`, "OMM");
|
|
25796
|
+
}
|
|
25797
|
+
}
|
|
25798
|
+
};
|
|
25799
|
+
|
|
25126
25800
|
// src/comm/CommTypes.ts
|
|
25127
25801
|
var ModulationType = /* @__PURE__ */ ((ModulationType3) => {
|
|
25128
25802
|
ModulationType3["BPSK"] = "BPSK";
|
|
@@ -29261,4 +29935,4 @@ astronomy-engine/esm/astronomy.js:
|
|
|
29261
29935
|
*)
|
|
29262
29936
|
*/
|
|
29263
29937
|
|
|
29264
|
-
export { AccessCalculator, AngularDiameterMethod, AngularDistanceMethod, Antenna, AtmosphericDrag, BaseObject, BatchLeastSquaresOD, BatchLeastSquaresResult, Beacon, BoxMuller, CatalogScreener, CatalogSource, CdmExporter, CdmParser, CelestialBody, CelestialBodyType, CenterBody, CenterBodyMu, ChebyshevCoefficients, ChebyshevCompressor, ChebyshevInterpolator, ClassicalElements, CommDeviceType, CommLink, CommunicationDevice, ConjunctionAssessment, ConjunctionEvent, ConstellationGenerator, ContactScheduler, ContactSelectionStrategy, CovarianceFrame, CovarianceRealism, CovarianceSample, CubicSpline, CubicSplineInterpolator, DEFAULT_INTERPOLATOR, DEFAULT_LAGRANGE_ORDER, DEG2RAD, DataHandler, DormandPrince54Propagator, DownhillSimplex, DynamicGroundObject, Earth, EarthGravity, EphemerisBody, EphemerisSatellite, Epoch, EpochGPS, EpochTAI, EpochTDB, EpochTT, EpochUTC, EpochWindow, EquinoctialElements, EulerAngles, FieldInterpolator, FieldOfView, Force, ForceModel, FormatTle, FovFrame, FovShape, Geodetic, GibbsIOD, GoldenSection, GoodingIOD, Gravity, GroundObject, GroundStation, HerrickGibbsIOD, Hill, History, HorizonsParser, ITRF, Interpolator, InterpolatorType, J20002 as J2000, Jupiter, KM_PER_AU, KeplerPropagator, LagrangeInterpolator, LambertIOD, LandObject, LaserRangingSensor, LaunchTrajectoryGenerator, LevenbergMarquardtOD, LevenbergMarquardtResult, MILLISECONDS_PER_DAY, MILLISECONDS_PER_SECOND, MILLISECONDS_TO_DAYS, MINUTES_PER_DAY, MS_PER_DAY, Marker, Mars, Matrix, MechanicalRadar, Mercury, ModifiedGoodingIOD, ModulationType, Moon, MoonBody, Neptune, OdmExporter, OemParser, OotkError, OpticalSensor, OrbitDeterminationError, OrbitFinder, OrbitRegime, PI, ParseError, PassType, PassiveRFSensor, PayloadStatus, PhasedArrayRadar, PlaneChangeBurn, PlanetBody, Pluto, PolynomialRegression, ProbabilityOfCollision, PropagationError, Propagator, PropagatorType, Quaternion, RAD2DEG, RADIUS_OF_EARTH, RAE, RIC, RadarSensor, RadecGeocentric, RadecTopocentric, Random, RandomGaussianSource, Receiver, RelativeState, RepeatGroundTrack, RkCheckpoint, RkResult, RungeKutta4Propagator, RungeKutta89Propagator, RungeKuttaAdaptive, SLR_WAVELENGTHS, SPEED_OF_LIGHT_KM_S, Satellite, Saturn, ScheduledContact, ScreeningFilter, SegmentedLagrangeInterpolator, Sensor, SensorType, Sgp4, Sgp4Error, Sgp4ErrorCode, Sgp4OpsMode, Sgp4Propagator, SimpleLinearRegression, SolarRadiationPressure, SolarSystem, SpaceObject, SpaceObjectType, Star, StateCovariance, StateInterpolator, StateVector2 as StateVector, Sun, SunBody, SunStatus, TAU, TEME, ThirdBodyGravity, Thrust, TimeStamped, Tle, Transmitter, Transponder, TwoBurnOrbitTransfer, Uranus, ValidationError, Vector, Vector3D, Venus, VerletBlendInterpolator, VisualizationHelpers, Waypoint, ZoomValue, acoth, acsch, angularDiameter, angularDistance, angularVelocityOfEarth, array2d, asec2rad, asech, azel2uv, bodyTypeLookup, boresightFrameFromAzElRoll, cKmPerMs, cKmPerSec, cMPerSec, calcGmst, calcIncFromAz, calcInertAz, calculateFspl, calculatePropagationDelay, clamp, concat, copySign, covariance, createCovarianceFromTle, createSampleCovarianceFromTle, createVec, csch, dbmToDbw, dbwToDbm, dbwToWatts, deg2rad, derivative, dopplerFactor, earthGravityParam, ecef2eci, ecef2enu, ecef2rae, ecefRad2rae, eci2ecef, eci2lla, eci2rae, enu2rf, estimateRcs, evalPoly, factorial, gamma, getDayOfYear, getDegLat, getDegLon, getRadLat, getRadLon, halfPi, isLeapYear, jacobian, jday, linearDistance, linearInterpolate, lla2ecef, lla2eci, lla2sez, llaRad2ecef, log10, mag2db, masec2rad, matchHalfPlane, mean, msec2sec, newtonM, newtonNu, normalizeAngle, observationDerivative, observationNoiseFromSigmas, parseCenterBody, rad2deg, radecToPosition, radecToVelocity, rae2ecef, rae2eci, rae2enu, rae2raeOffBoresight, rae2ruv, rae2sez, relativeVelocity, sec2day, sec2deg, sec2min, sech, secondsPerDay, secondsPerSiderealDay, secondsPerWeek, sez2rae, sign, spaceObjType2Str, std, temp4, toPrecision, ttasec2rad, uv2azel, wattsToDbw, wrapAngle, x2o3 };
|
|
29938
|
+
export { AccessCalculator, AngularDiameterMethod, AngularDistanceMethod, Antenna, AtmosphericDrag, BaseObject, BatchLeastSquaresOD, BatchLeastSquaresResult, Beacon, BoxMuller, CatalogScreener, CatalogSource, CdmExporter, CdmParser, CelestialBody, CelestialBodyType, CenterBody, CenterBodyMu, ChebyshevCoefficients, ChebyshevCompressor, ChebyshevInterpolator, ClassicalElements, CommDeviceType, CommLink, CommunicationDevice, ConjunctionAssessment, ConjunctionEvent, ConstellationGenerator, ContactScheduler, ContactSelectionStrategy, CovarianceFrame, CovarianceRealism, CovarianceSample, CubicSpline, CubicSplineInterpolator, DEFAULT_INTERPOLATOR, DEFAULT_LAGRANGE_ORDER, DEG2RAD, DataHandler, DormandPrince54Propagator, DownhillSimplex, DynamicGroundObject, Earth, EarthGravity, EphemerisBody, EphemerisSatellite, Epoch, EpochGPS, EpochTAI, EpochTDB, EpochTT, EpochUTC, EpochWindow, EquinoctialElements, EulerAngles, FieldInterpolator, FieldOfView, Force, ForceModel, FormatTle, FovFrame, FovShape, Geodetic, GibbsIOD, GoldenSection, GoodingIOD, Gravity, GroundObject, GroundStation, HerrickGibbsIOD, Hill, History, HorizonsParser, ITRF, Interpolator, InterpolatorType, J20002 as J2000, Jupiter, KM_PER_AU, KeplerPropagator, LagrangeInterpolator, LambertIOD, LandObject, LaserRangingSensor, LaunchTrajectoryGenerator, LevenbergMarquardtOD, LevenbergMarquardtResult, MILLISECONDS_PER_DAY, MILLISECONDS_PER_SECOND, MILLISECONDS_TO_DAYS, MINUTES_PER_DAY, MS_PER_DAY, Marker, Mars, Matrix, MechanicalRadar, Mercury, ModifiedGoodingIOD, ModulationType, Moon, MoonBody, Neptune, OdmExporter, OemParser, OmmParser, OotkError, OpticalSensor, OrbitDeterminationError, OrbitFinder, OrbitRegime, PI, ParseError, PassType, PassiveRFSensor, PayloadStatus, PhasedArrayRadar, PlaneChangeBurn, PlanetBody, Pluto, PolynomialRegression, ProbabilityOfCollision, PropagationError, Propagator, PropagatorType, Quaternion, RAD2DEG, RADIUS_OF_EARTH, RAE, RIC, RadarSensor, RadecGeocentric, RadecTopocentric, Random, RandomGaussianSource, Receiver, RelativeState, RepeatGroundTrack, RkCheckpoint, RkResult, RungeKutta4Propagator, RungeKutta89Propagator, RungeKuttaAdaptive, SLR_WAVELENGTHS, SPEED_OF_LIGHT_KM_S, Satellite, Saturn, ScheduledContact, ScreeningFilter, SegmentedLagrangeInterpolator, Sensor, SensorType, Sgp4, Sgp4Error, Sgp4ErrorCode, Sgp4OpsMode, Sgp4Propagator, SimpleLinearRegression, SolarRadiationPressure, SolarSystem, SpaceObject, SpaceObjectType, Star, StateCovariance, StateInterpolator, StateVector2 as StateVector, Sun, SunBody, SunStatus, TAU, TEME, ThirdBodyGravity, Thrust, TimeStamped, Tle, Transmitter, Transponder, TwoBurnOrbitTransfer, Uranus, ValidationError, Vector, Vector3D, Venus, VerletBlendInterpolator, VisualizationHelpers, Waypoint, ZoomValue, acoth, acsch, angularDiameter, angularDistance, angularVelocityOfEarth, array2d, asec2rad, asech, azel2uv, bodyTypeLookup, boresightFrameFromAzElRoll, cKmPerMs, cKmPerSec, cMPerSec, calcGmst, calcIncFromAz, calcInertAz, calculateFspl, calculatePropagationDelay, clamp, concat, copySign, covariance, createCovarianceFromTle, createSampleCovarianceFromTle, createVec, csch, dbmToDbw, dbwToDbm, dbwToWatts, deg2rad, derivative, dopplerFactor, earthGravityParam, ecef2eci, ecef2enu, ecef2rae, ecefRad2rae, eci2ecef, eci2lla, eci2rae, enu2rf, estimateRcs, evalPoly, factorial, gamma, getDayOfYear, getDegLat, getDegLon, getRadLat, getRadLon, halfPi, isLeapYear, jacobian, jday, linearDistance, linearInterpolate, lla2ecef, lla2eci, lla2sez, llaRad2ecef, log10, mag2db, masec2rad, matchHalfPlane, mean, msec2sec, newtonM, newtonNu, normalizeAngle, observationDerivative, observationNoiseFromSigmas, parseCenterBody, rad2deg, radecToPosition, radecToVelocity, rae2ecef, rae2eci, rae2enu, rae2raeOffBoresight, rae2ruv, rae2sez, relativeVelocity, sec2day, sec2deg, sec2min, sech, secondsPerDay, secondsPerSiderealDay, secondsPerWeek, sez2rae, sign, spaceObjType2Str, std, temp4, toPrecision, ttasec2rad, uv2azel, wattsToDbw, wrapAngle, x2o3 };
|