CCSDS 502.0-B-3 Orbit Ephemeris Message parser and interpolator
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

osv: Fmt.pf/Fmt.str, rename make_vuln → vuln (merlint E200/E331)

+481
+15
test/interop/orekit/dune
··· 1 + (test 2 + (name test) 3 + (libraries oem alcotest csvt fmt) 4 + (deps 5 + (source_tree traces) 6 + (source_tree scripts))) 7 + 8 + (rule 9 + (alias regen-traces) 10 + (deps 11 + (source_tree scripts)) 12 + (action 13 + (chdir 14 + scripts 15 + (run bash ./generate.sh))))
+186
test/interop/orekit/scripts/generate.java
··· 1 + ///usr/bin/env jbang "$0" "$@" ; exit $? 2 + //DEPS org.orekit:orekit:12.2 3 + 4 + // Generate CCSDS 502.0-B-3 OEM interop traces using Orekit 12.2. 5 + // 6 + // Oracle: Orekit 12.2 (Java) -- ESA's open-source flight dynamics library. 7 + // Run: jbang generate.java <TRACE_DIR> <OREKIT_DATA_ZIP> 8 + // 9 + // Strategy: define initial orbital conditions, propagate with Orekit's 10 + // Keplerian propagator, then write the ephemeris as OEM KVN using 11 + // Orekit's OemWriter. The OCaml test parses the Orekit-generated KVN 12 + // and verifies field extraction matches the CSV index. 13 + // 14 + // This ensures the oracle does real orbital-mechanics work — the OEM 15 + // files are NOT hand-crafted templates echoed through Orekit. 16 + 17 + import org.orekit.data.*; 18 + import org.orekit.files.ccsds.definitions.*; 19 + import org.orekit.files.ccsds.ndm.*; 20 + import org.orekit.files.ccsds.ndm.odm.*; 21 + import org.orekit.files.ccsds.ndm.odm.oem.*; 22 + import org.orekit.files.ccsds.section.*; 23 + import org.orekit.files.ccsds.utils.generation.KvnGenerator; 24 + import org.orekit.frames.*; 25 + import org.orekit.utils.IERSConventions; 26 + import org.orekit.orbits.*; 27 + import org.orekit.propagation.analytical.KeplerianPropagator; 28 + import org.orekit.time.*; 29 + import org.orekit.utils.*; 30 + import java.io.*; 31 + import java.nio.file.*; 32 + import java.util.*; 33 + 34 + public class generate { 35 + 36 + static void bootstrap(Path dataZip) { 37 + DataContext.getDefault().getDataProvidersManager() 38 + .addProvider(new ZipJarCrawler(dataZip.toFile())); 39 + } 40 + 41 + record Scenario(String name, String objectName, String objectId, 42 + KeplerianOrbit orbit, int steps, double stepSec) {} 43 + 44 + static final double MU_EARTH = 3.986004418e14; // m^3/s^2 45 + 46 + static Scenario[] scenarios(TimeScale utc) { 47 + Frame eme2000 = FramesFactory.getEME2000(); 48 + 49 + return new Scenario[] { 50 + // LEO circular (ISS-like, ~400km, 51.6° inc) 51 + new Scenario("leo_circular", "ISS", "1998-067A", 52 + new KeplerianOrbit(6778137.0, 0.0001, Math.toRadians(51.6), 53 + 0.0, Math.toRadians(30.0), 0.0, PositionAngleType.TRUE, 54 + eme2000, new AbsoluteDate(2025, 1, 15, 0, 0, 0.0, utc), MU_EARTH), 55 + 7, 600.0), 56 + 57 + // GEO (near-zero inclination, e~0) 58 + new Scenario("geo_stationary", "METEOSAT-12", "2022-167A", 59 + new KeplerianOrbit(42164000.0, 0.00005, Math.toRadians(0.05), 60 + 0.0, Math.toRadians(75.0), 0.0, PositionAngleType.TRUE, 61 + eme2000, new AbsoluteDate(2025, 2, 1, 0, 0, 0.0, utc), MU_EARTH), 62 + 4, 7200.0), 63 + 64 + // SSO (Sun-synchronous, polar-ish, ~700km) 65 + new Scenario("sso_polar", "SENTINEL-2A", "2015-028A", 66 + new KeplerianOrbit(7078137.0, 0.001, Math.toRadians(98.5), 67 + Math.toRadians(200.0), Math.toRadians(90.0), Math.toRadians(45.0), 68 + PositionAngleType.TRUE, 69 + eme2000, new AbsoluteDate(2025, 3, 1, 6, 0, 0.0, utc), MU_EARTH), 70 + 10, 300.0), 71 + 72 + // HEO (Molniya-like, high eccentricity) 73 + new Scenario("heo_molniya", "MOLNIYA-1", "1974-026A", 74 + new KeplerianOrbit(26600000.0, 0.74, Math.toRadians(63.4), 75 + Math.toRadians(270.0), Math.toRadians(0.0), Math.toRadians(0.0), 76 + PositionAngleType.TRUE, 77 + eme2000, new AbsoluteDate(2025, 4, 1, 0, 0, 0.0, utc), MU_EARTH), 78 + 12, 3600.0), 79 + 80 + // Single point (degenerate) 81 + new Scenario("single_point", "TEST-SAT", "9999-001A", 82 + new KeplerianOrbit(7000000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 83 + PositionAngleType.TRUE, 84 + eme2000, new AbsoluteDate(2025, 6, 1, 12, 0, 0.0, utc), MU_EARTH), 85 + 1, 0.0), 86 + }; 87 + } 88 + 89 + public static void main(String[] args) throws Exception { 90 + if (args.length < 2) { 91 + System.err.println("Usage: generate.java <TRACE_DIR> <OREKIT_DATA_ZIP>"); 92 + System.exit(1); 93 + } 94 + Path traceDir = Paths.get(args[0]); 95 + Files.createDirectories(traceDir); 96 + bootstrap(Paths.get(args[1])); 97 + 98 + TimeScale utc = TimeScalesFactory.getUTC(); 99 + var writer = new WriterBuilder().buildOemWriter(); 100 + 101 + try (PrintWriter csv = new PrintWriter(new FileWriter( 102 + traceDir.resolve("index.csv").toFile()))) { 103 + csv.println("name,file,object_name,object_id,center_name,ref_frame," 104 + + "time_system,num_states,epochs,xs,ys,zs,vxs,vys,vzs"); 105 + 106 + for (var sc : scenarios(utc)) { 107 + // Propagate orbit with Keplerian propagator 108 + var propagator = new KeplerianPropagator(sc.orbit()); 109 + AbsoluteDate t0 = sc.orbit().getDate(); 110 + List<TimeStampedPVCoordinates> pvList = new ArrayList<>(); 111 + for (int i = 0; i < sc.steps(); i++) { 112 + AbsoluteDate t = t0.shiftedBy(i * sc.stepSec()); 113 + var state = propagator.propagate(t); 114 + pvList.add(state.getPVCoordinates(sc.orbit().getFrame())); 115 + } 116 + 117 + // Build OEM segment from propagated states 118 + var header = new OdmHeader(); 119 + header.setOriginator("OREKIT-INTEROP"); 120 + header.setCreationDate(new AbsoluteDate(2025, 1, 1, 0, 0, 0.0, utc)); 121 + 122 + var meta = new OemMetadata(2); 123 + meta.setObjectName(sc.objectName()); 124 + meta.setObjectID(sc.objectId()); 125 + meta.setCenter(BodyFacade.create(CenterName.EARTH)); 126 + meta.setReferenceFrame(FrameFacade.map(sc.orbit().getFrame())); 127 + meta.setTimeSystem(TimeSystem.UTC); 128 + meta.setStartTime(pvList.get(0).getDate()); 129 + meta.setStopTime(pvList.get(pvList.size() - 1).getDate()); 130 + meta.setInterpolationDegree(pvList.size() > 1 ? 7 : 1); 131 + 132 + var data = new OemData(); 133 + for (var pv : pvList) { 134 + data.addData(pv, false); 135 + } 136 + var segment = new OemSegment(meta, data, MU_EARTH); 137 + 138 + var oem = new Oem(header, List.of(segment), 139 + IERSConventions.IERS_2010, DataContext.getDefault(), MU_EARTH); 140 + 141 + // Write OEM KVN 142 + StringWriter sw = new StringWriter(); 143 + try (KvnGenerator gen = new KvnGenerator(sw, 0, "", Double.NaN, 0)) { 144 + writer.writeMessage(gen, oem); 145 + } 146 + String kvnOut = sw.toString(); 147 + Files.writeString(traceDir.resolve(sc.name() + ".kvn"), kvnOut); 148 + 149 + // Build CSV index from propagated data (in km and km/s) 150 + List<String> epochs = new ArrayList<>(), xs = new ArrayList<>(), 151 + ys = new ArrayList<>(), zs = new ArrayList<>(), 152 + vxs = new ArrayList<>(), vys = new ArrayList<>(), vzs = new ArrayList<>(); 153 + for (var pv : pvList) { 154 + epochs.add(pv.getDate().toString(utc)); 155 + var p = pv.getPosition(); var v = pv.getVelocity(); 156 + xs.add(fmt(p.getX()/1000.0)); ys.add(fmt(p.getY()/1000.0)); 157 + zs.add(fmt(p.getZ()/1000.0)); 158 + vxs.add(fmt(v.getX()/1000.0)); vys.add(fmt(v.getY()/1000.0)); 159 + vzs.add(fmt(v.getZ()/1000.0)); 160 + } 161 + 162 + csv.printf("%s,%s.kvn,%s,%s,%s,%s,%s,%d,\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\"%n", 163 + sc.name(), sc.name(), sc.objectName(), sc.objectId(), 164 + "EARTH", meta.getReferenceFrame().getName(), "UTC", 165 + pvList.size(), 166 + String.join(";", epochs), String.join(";", xs), 167 + String.join(";", ys), String.join(";", zs), 168 + String.join(";", vxs), String.join(";", vys), 169 + String.join(";", vzs)); 170 + System.out.printf("%s: %d state vectors%n", sc.name(), pvList.size()); 171 + } 172 + } 173 + System.out.println("Wrote index.csv"); 174 + } 175 + 176 + static String fmt(double v) { return String.format("%.14g", v); } 177 + 178 + static double muFromCenter(String name) { 179 + return switch (name) { 180 + case "EARTH" -> 3.986004418e14; 181 + case "SUN" -> 1.32712440018e20; 182 + case "MOON" -> 4.9028695e12; 183 + default -> 1.0; 184 + }; 185 + } 186 + }
+19
test/interop/orekit/scripts/generate.sh
··· 1 + #!/bin/bash 2 + set -euo pipefail 3 + command -v jbang >/dev/null || { echo "jbang not on PATH" >&2; exit 1; } 4 + SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" 5 + TRACE_DIR="$SCRIPT_DIR/../traces" 6 + mkdir -p "$TRACE_DIR" 7 + TRACE_DIR="$(cd "$TRACE_DIR" && pwd)" 8 + 9 + # Download orekit-data if not cached (OEM parser needs celestial body data). 10 + # Cache in /tmp to avoid polluting the source tree (dune scans source_tree). 11 + OREKIT_DATA="/tmp/orekit-data-main.zip" 12 + if [ ! -f "$OREKIT_DATA" ]; then 13 + echo "Downloading orekit-data..." 14 + curl -sL -o "$OREKIT_DATA" \ 15 + "https://gitlab.orekit.org/orekit/orekit-data/-/archive/main/orekit-data-main.zip" 16 + fi 17 + 18 + cd "$SCRIPT_DIR" 19 + jbang generate.java "$TRACE_DIR" "$OREKIT_DATA"
+141
test/interop/orekit/test.ml
··· 1 + (** Orekit interop tests for CCSDS 502.0-B-3 OEM. 2 + 3 + Traces generated by: Orekit 12.2 (Java) OEM parser/writer 4 + Regenerate: dune build @regen-traces *) 5 + 6 + let trace path = Filename.concat "traces" path 7 + 8 + type row = { 9 + name : string; 10 + file : string; 11 + object_name : string; 12 + object_id : string; 13 + center_name : string; 14 + ref_frame : string; 15 + time_system : string; 16 + num_states : int; 17 + epochs : string; 18 + xs : string; 19 + ys : string; 20 + zs : string; 21 + vxs : string; 22 + vys : string; 23 + vzs : string; 24 + } 25 + 26 + let row_codec = 27 + Csvt.( 28 + Row.( 29 + obj 30 + (fun name file object_name object_id center_name ref_frame time_system 31 + num_states epochs xs ys zs vxs vys vzs -> 32 + { 33 + name; 34 + file; 35 + object_name; 36 + object_id; 37 + center_name; 38 + ref_frame; 39 + time_system; 40 + num_states; 41 + epochs; 42 + xs; 43 + ys; 44 + zs; 45 + vxs; 46 + vys; 47 + vzs; 48 + }) 49 + |> col "name" string ~enc:(fun r -> r.name) 50 + |> col "file" string ~enc:(fun r -> r.file) 51 + |> col "object_name" string ~enc:(fun r -> r.object_name) 52 + |> col "object_id" string ~enc:(fun r -> r.object_id) 53 + |> col "center_name" string ~enc:(fun r -> r.center_name) 54 + |> col "ref_frame" string ~enc:(fun r -> r.ref_frame) 55 + |> col "time_system" string ~enc:(fun r -> r.time_system) 56 + |> col "num_states" int ~enc:(fun r -> r.num_states) 57 + |> col "epochs" string ~enc:(fun r -> r.epochs) 58 + |> col "xs" string ~enc:(fun r -> r.xs) 59 + |> col "ys" string ~enc:(fun r -> r.ys) 60 + |> col "zs" string ~enc:(fun r -> r.zs) 61 + |> col "vxs" string ~enc:(fun r -> r.vxs) 62 + |> col "vys" string ~enc:(fun r -> r.vys) 63 + |> col "vzs" string ~enc:(fun r -> r.vzs) 64 + |> finish)) 65 + 66 + let split_semicolons s = String.split_on_char ';' s 67 + 68 + let float_of_string_safe s = 69 + try float_of_string (String.trim s) 70 + with _ -> Alcotest.failf "bad float: %S" s 71 + 72 + let epsilon = 1e-6 73 + 74 + let check_float ~name expected actual = 75 + let diff = Float.abs (expected -. actual) in 76 + let scale = Float.max 1.0 (Float.abs expected) in 77 + if diff /. scale > epsilon then 78 + Alcotest.failf "%s: expected %.10g, got %.10g (diff %.2e)" name expected 79 + actual diff 80 + 81 + let test_parse () = 82 + let rows = 83 + match Csvt.decode_file row_codec (trace "index.csv") with 84 + | Ok rows -> rows 85 + | Error e -> Alcotest.failf "CSV: %a" Csvt.pp_error e 86 + in 87 + List.iter 88 + (fun (r : row) -> 89 + let content = 90 + let ic = open_in (trace r.file) in 91 + let s = In_channel.input_all ic in 92 + close_in ic; 93 + s 94 + in 95 + let oem = 96 + match Oem.of_string content with 97 + | Ok oem -> oem 98 + | Error e -> Alcotest.failf "%s: %a" r.name Oem.pp_error e 99 + in 100 + match oem.segments with 101 + | [] -> Alcotest.failf "%s: no segments" r.name 102 + | seg :: _ -> 103 + Alcotest.(check string) 104 + (r.name ^ " object_name") r.object_name seg.metadata.object_name; 105 + Alcotest.(check string) 106 + (r.name ^ " object_id") r.object_id seg.metadata.object_id; 107 + Alcotest.(check string) 108 + (r.name ^ " ref_frame") r.ref_frame seg.metadata.ref_frame; 109 + Alcotest.(check string) 110 + (r.name ^ " time_system") r.time_system seg.metadata.time_system; 111 + Alcotest.(check int) 112 + (r.name ^ " num_states") r.num_states (Array.length seg.data); 113 + let exp_xs = split_semicolons r.xs in 114 + let exp_ys = split_semicolons r.ys in 115 + let exp_zs = split_semicolons r.zs in 116 + let exp_vxs = split_semicolons r.vxs in 117 + let exp_vys = split_semicolons r.vys in 118 + let exp_vzs = split_semicolons r.vzs in 119 + Array.iteri 120 + (fun i (sv : Oem.state_vector) -> 121 + let tag = Fmt.str "%s[%d]" r.name i in 122 + check_float ~name:(tag ^ ".x") 123 + (float_of_string_safe (List.nth exp_xs i)) sv.pos.x; 124 + check_float ~name:(tag ^ ".y") 125 + (float_of_string_safe (List.nth exp_ys i)) sv.pos.y; 126 + check_float ~name:(tag ^ ".z") 127 + (float_of_string_safe (List.nth exp_zs i)) sv.pos.z; 128 + check_float ~name:(tag ^ ".vx") 129 + (float_of_string_safe (List.nth exp_vxs i)) sv.vel.x; 130 + check_float ~name:(tag ^ ".vy") 131 + (float_of_string_safe (List.nth exp_vys i)) sv.vel.y; 132 + check_float ~name:(tag ^ ".vz") 133 + (float_of_string_safe (List.nth exp_vzs i)) sv.vel.z) 134 + seg.data) 135 + rows 136 + 137 + let () = 138 + Alcotest.run "oem-interop-orekit" 139 + [ 140 + ("parse", [ Alcotest.test_case "parse matches Orekit" `Quick test_parse ]); 141 + ]
+20
test/interop/orekit/traces/geo_stationary.kvn
··· 1 + CCSDS_OEM_VERS = 3.0 2 + CREATION_DATE = 2025-01-01T00:00:00.0 3 + ORIGINATOR = OREKIT-INTEROP 4 + 5 + 6 + META_START 7 + OBJECT_NAME = METEOSAT-12 8 + OBJECT_ID = 2022-167A 9 + CENTER_NAME = EARTH 10 + REF_FRAME = EME2000 11 + TIME_SYSTEM = UTC 12 + START_TIME = 2025-02-01T00:00:00.0 13 + STOP_TIME = 2025-02-01T06:00:00.0 14 + INTERPOLATION_DEGREE = 7 15 + META_STOP 16 + 17 + 2025-02-01T00:00:00.0 10912.300575391799 40725.260174825286 0.0 -2.970046938839883 0.7958216787446747 0.00268328632331037 18 + 2025-02-01T02:00:00.0 -10972.907449500186 40709.26220291087 18.444074423907335 -2.968860590827842 -0.8001576139305587 0.0023218147896430143 19 + 2025-02-01T04:00:00.0 -29901.819581905605 29725.31956578096 31.91895477142264 -2.1678199379156946 -2.1805040688029527 0.0013348257804776354 20 + 2025-02-01T06:00:00.0 -40775.02155589308 10733.123237155705 36.79467681301891 -0.7828251378823844 -2.973340451441534 -1.16990481453822E-5
+28
test/interop/orekit/traces/heo_molniya.kvn
··· 1 + CCSDS_OEM_VERS = 3.0 2 + CREATION_DATE = 2025-01-01T00:00:00.0 3 + ORIGINATOR = OREKIT-INTEROP 4 + 5 + 6 + META_START 7 + OBJECT_NAME = MOLNIYA-1 8 + OBJECT_ID = 1974-026A 9 + CENTER_NAME = EARTH 10 + REF_FRAME = EME2000 11 + TIME_SYSTEM = UTC 12 + START_TIME = 2025-04-01T00:00:00.0 13 + STOP_TIME = 2025-04-01T11:00:00.0 14 + INTERPOLATION_DEGREE = 7 15 + META_STOP 16 + 17 + 2025-04-01T00:00:00.0 -1.2704485894354642E-12 -3096.7018514929314 -6183.970701981069 10.014194442460434 -8.236876219903356E-16 -1.6448661725432244E-15 18 + 2025-04-01T01:00:00.0 16792.10862646735 4703.239997229297 9392.153246277054 1.2067596428685927 2.1847556793870697 4.362856277495021 19 + 2025-04-01T02:00:00.0 17527.691949830987 11202.841559552902 22371.55764602003 -0.4547774617351249 1.4785845561801485 2.9526651302938944 20 + 2025-04-01T03:00:00.0 14682.97681098453 15619.23211098413 31190.885785534036 -1.0456161066887089 0.9997464404385091 1.9964475088556053 21 + 2025-04-01T04:00:00.0 10359.34595995274 18524.43807642406 36992.44803953011 -1.3240116274174356 0.6259471487568031 1.2499875721114422 22 + 2025-04-01T05:00:00.0 5321.337242229511 20185.07809222477 40308.669521846234 -1.4566916134312562 0.3020933319206657 0.6032664439298875 23 + 2025-04-01T06:00:00.0 -18.623656307467186 20724.075168848627 41385.02181216713 -1.4963734162934184 -0.001036920221714784 -0.002070681834702477 24 + 2025-04-01T07:00:00.0 -5357.589755667489 20177.531817580297 40293.59995959954 -1.4561249869215174 -0.30423498093906637 -0.6075432181945236 25 + 2025-04-01T08:00:00.0 -10392.286365905504 18508.82767907763 36961.274796361715 -1.3226833412801147 -0.628317600529114 -1.2547212549176712 26 + 2025-04-01T09:00:00.0 -14708.970491357148 15594.31110774075 31141.119692021763 -1.0429221281667729 -1.0026073784064702 -2.002160669961356 27 + 2025-04-01T10:00:00.0 -17538.936051243556 11165.98848019192 22297.963747099395 -0.4486569515610753 -1.4824887919381466 -2.960461708943999 28 + 2025-04-01T11:00:00.0 -16761.802390394372 4648.782880981959 9283.4048980221 1.2283287438571155 -2.1907672726700427 -4.374861151879749
+6
test/interop/orekit/traces/index.csv
··· 1 + name,file,object_name,object_id,center_name,ref_frame,time_system,num_states,epochs,xs,ys,zs,vxs,vys,vzs 2 + leo_circular,leo_circular.kvn,ISS,1998-067A,EARTH,EME2000,UTC,7,"2025-01-15T00:00:00.000;2025-01-15T00:10:00.000;2025-01-15T00:20:00.000;2025-01-15T00:30:00.000;2025-01-15T00:40:00.000;2025-01-15T00:50:00.000;2025-01-15T01:00:00.000","5869.4518284480;3246.0654878648;-816.87849417169;-4517.6798021911;-6215.7574501400;-5158.6433650976;-1814.9566875593","3388.7295931500;4926.7995183394;4279.9980250216;1735.4306875163;-1578.5224447628;-4192.7996175052;-4948.6015957635","0.0000000000000;3335.5202812259;5191.8710215507;4746.1687065198;2196.3911666323;-1326.9773646324;-4262.1473352590","-2.3818921215985;-6.0241969985638;-6.9947504981891;-4.8639643863265;-0.57739932578234;3.9647791782852;6.7496871753228","4.1255581727566;0.80292354527183;-2.8753786268054;-5.2782138765178;-5.3409083836109;-3.0362301771763;0.61442758041801","6.0103998791280;4.6776386213421;1.2708008127040;-2.6988537333542;-5.4715065789316;-5.8186965468456;-3.5866372992469" 3 + geo_stationary,geo_stationary.kvn,METEOSAT-12,2022-167A,EARTH,EME2000,UTC,4,"2025-02-01T00:00:00.000;2025-02-01T02:00:00.000;2025-02-01T04:00:00.000;2025-02-01T06:00:00.000","10912.300575392;-10972.907449500;-29901.819581906;-40775.021555893","40725.260174825;40709.262202911;29725.319565781;10733.123237156","0.0000000000000;18.444074423907;31.918954771423;36.794676813019","-2.9700469388399;-2.9688605908278;-2.1678199379157;-0.78282513788238","0.79582167874467;-0.80015761393056;-2.1805040688030;-2.9733404514415","0.0026832863233104;0.0023218147896430;0.0013348257804776;-1.1699048145382e-05" 4 + sso_polar,sso_polar.kvn,SENTINEL-2A,2015-028A,EARTH,EME2000,UTC,10,"2025-03-01T06:00:00.000;2025-03-01T06:05:00.000;2025-03-01T06:10:00.000;2025-03-01T06:15:00.000;2025-03-01T06:20:00.000;2025-03-01T06:25:00.000;2025-03-01T06:30:00.000;2025-03-01T06:35:00.000;2025-03-01T06:40:00.000;2025-03-01T06:45:00.000","-947.52209125548;-1038.4839053601;-1025.1336818021;-908.90248531594;-701.53864139113;-423.89453800461;-103.81501403030;226.65318168497;534.45205304886;788.79247555659","-2989.2332568461;-832.19481357070;1408.4667498062;3507.8125380395;5255.4819403197;6476.7031211812;7049.6124218836;6917.2286162267;6092.9783070123;4659.2920637767","-6340.0183518477;-6948.6580617427;-6859.3296300994;-6081.6085346440;-4694.1046567650;-2836.3445823582;-694.64247875983;1516.5718505659;3576.1021888394;5277.9336935583","-0.46981248289090;-0.13151320908306;0.21970942061394;0.54856987607459;0.82215200254195;1.0131820520256;1.1026979304684;1.0818730571124;0.95284229324115;0.72847004226335","6.8037633014424;7.4547621582341;7.3567397603378;6.5208478759781;5.0322105159761;3.0408878998948;0.74654039820037;-1.6215605605630;-3.8271865469282;-5.6503333660318","-3.1435887257348;-0.87997542937724;1.4701100603581;3.6705667484495;5.5011475006537;6.7793594079625;7.3783241364335;7.2389816551650;6.3756166545532;4.8743068677178" 5 + heo_molniya,heo_molniya.kvn,MOLNIYA-1,1974-026A,EARTH,EME2000,UTC,12,"2025-04-01T00:00:00.000;2025-04-01T01:00:00.000;2025-04-01T02:00:00.000;2025-04-01T03:00:00.000;2025-04-01T04:00:00.000;2025-04-01T05:00:00.000;2025-04-01T06:00:00.000;2025-04-01T07:00:00.000;2025-04-01T08:00:00.000;2025-04-01T09:00:00.000;2025-04-01T10:00:00.000;2025-04-01T11:00:00.000","-1.2704485894355e-12;16792.108626467;17527.691949831;14682.976810985;10359.345959953;5321.3372422295;-18.623656307467;-5357.5897556675;-10392.286365906;-14708.970491357;-17538.936051244;-16761.802390394","-3096.7018514929;4703.2399972293;11202.841559553;15619.232110984;18524.438076424;20185.078092225;20724.075168849;20177.531817580;18508.827679078;15594.311107741;11165.988480192;4648.7828809820","-6183.9707019811;9392.1532462771;22371.557646020;31190.885785534;36992.448039530;40308.669521846;41385.021812167;40293.599959600;36961.274796362;31141.119692022;22297.963747099;9283.4048980221","10.014194442460;1.2067596428686;-0.45477746173512;-1.0456161066887;-1.3240116274174;-1.4566916134313;-1.4963734162934;-1.4561249869215;-1.3226833412801;-1.0429221281668;-0.44865695156108;1.2283287438571","-8.2368762199034e-16;2.1847556793871;1.4785845561801;0.99974644043851;0.62594714875680;0.30209333192067;-0.0010369202217148;-0.30423498093907;-0.62831760052911;-1.0026073784065;-1.4824887919381;-2.1907672726700","-1.6448661725432e-15;4.3628562774950;2.9526651302939;1.9964475088556;1.2499875721114;0.60326644392989;-0.0020706818347025;-0.60754321819452;-1.2547212549177;-2.0021606699614;-2.9604617089440;-4.3748611518797" 6 + single_point,single_point.kvn,TEST-SAT,9999-001A,EARTH,EME2000,UTC,1,"2025-06-01T12:00:00.000","7000.0000000000","0.0000000000000","0.0000000000000","-0.0000000000000","7.5460532901075","0.0000000000000"
+23
test/interop/orekit/traces/leo_circular.kvn
··· 1 + CCSDS_OEM_VERS = 3.0 2 + CREATION_DATE = 2025-01-01T00:00:00.0 3 + ORIGINATOR = OREKIT-INTEROP 4 + 5 + 6 + META_START 7 + OBJECT_NAME = ISS 8 + OBJECT_ID = 1998-067A 9 + CENTER_NAME = EARTH 10 + REF_FRAME = EME2000 11 + TIME_SYSTEM = UTC 12 + START_TIME = 2025-01-15T00:00:00.0 13 + STOP_TIME = 2025-01-15T01:00:00.0 14 + INTERPOLATION_DEGREE = 7 15 + META_STOP 16 + 17 + 2025-01-15T00:00:00.0 5869.451828448011 3388.72959315 0.0 -2.3818921215984807 4.1255581727565955 6.010399879128007 18 + 2025-01-15T00:10:00.0 3246.0654878647665 4926.799518339391 3335.520281225884 -6.024196998563756 0.8029235452718302 4.677638621342148 19 + 2025-01-15T00:20:00.0 -816.8784941716937 4279.998025021596 5191.871021550713 -6.994750498189097 -2.875378626805429 1.2708008127039807 20 + 2025-01-15T00:30:00.0 -4517.679802191101 1735.4306875162983 4746.168706519772 -4.863964386326451 -5.278213876517774 -2.6988537333542046 21 + 2025-01-15T00:40:00.0 -6215.757450139965 -1578.5224447627575 2196.391166632335 -0.5773993257823403 -5.340908383610949 -5.471506578931579 22 + 2025-01-15T00:50:00.0 -5158.643365097616 -4192.799617505216 -1326.9773646323981 3.9647791782851516 -3.036230177176327 -5.81869654684558 23 + 2025-01-15T01:00:00.0 -1814.9566875593016 -4948.60159576353 -4262.147335258999 6.749687175322792 0.6144275804180149 -3.5866372992468545
+17
test/interop/orekit/traces/single_point.kvn
··· 1 + CCSDS_OEM_VERS = 3.0 2 + CREATION_DATE = 2025-01-01T00:00:00.0 3 + ORIGINATOR = OREKIT-INTEROP 4 + 5 + 6 + META_START 7 + OBJECT_NAME = TEST-SAT 8 + OBJECT_ID = 9999-001A 9 + CENTER_NAME = EARTH 10 + REF_FRAME = EME2000 11 + TIME_SYSTEM = UTC 12 + START_TIME = 2025-06-01T12:00:00.0 13 + STOP_TIME = 2025-06-01T12:00:00.0 14 + INTERPOLATION_DEGREE = 1 15 + META_STOP 16 + 17 + 2025-06-01T12:00:00.0 7000.0 0.0 0.0 -0.0 7.546053290107542 0.0
+26
test/interop/orekit/traces/sso_polar.kvn
··· 1 + CCSDS_OEM_VERS = 3.0 2 + CREATION_DATE = 2025-01-01T00:00:00.0 3 + ORIGINATOR = OREKIT-INTEROP 4 + 5 + 6 + META_START 7 + OBJECT_NAME = SENTINEL-2A 8 + OBJECT_ID = 2015-028A 9 + CENTER_NAME = EARTH 10 + REF_FRAME = EME2000 11 + TIME_SYSTEM = UTC 12 + START_TIME = 2025-03-01T06:00:00.0 13 + STOP_TIME = 2025-03-01T06:45:00.0 14 + INTERPOLATION_DEGREE = 7 15 + META_STOP 16 + 17 + 2025-03-01T06:00:00.0 -947.522091255484 -2989.233256846111 -6340.018351847687 -0.4698124828908984 6.803763301442364 -3.1435887257348276 18 + 2025-03-01T06:05:00.0 -1038.4839053601381 -832.1948135706965 -6948.658061742712 -0.13151320908305686 7.454762158234124 -0.8799754293772404 19 + 2025-03-01T06:10:00.0 -1025.1336818020968 1408.4667498062465 -6859.329630099393 0.21970942061393803 7.356739760337812 1.470110060358052 20 + 2025-03-01T06:15:00.0 -908.9024853159405 3507.812538039498 -6081.608534643953 0.5485698760745873 6.520847875978126 3.6705667484494797 21 + 2025-03-01T06:20:00.0 -701.5386413911277 5255.481940319706 -4694.1046567649655 0.8221520025419465 5.032210515976106 5.501147500653693 22 + 2025-03-01T06:25:00.0 -423.89453800460524 6476.703121181241 -2836.3445823581924 1.0131820520256276 3.0408878998948206 6.7793594079625095 23 + 2025-03-01T06:30:00.0 -103.8150140302957 7049.612421883637 -694.642478759825 1.10269793046842 0.7465403982003728 7.378324136433462 24 + 2025-03-01T06:35:00.0 226.65318168497424 6917.22861622674 1516.5718505659013 1.081873057112377 -1.6215605605629644 7.238981655165007 25 + 2025-03-01T06:40:00.0 534.4520530488608 6092.978307012258 3576.102188839428 0.952842293241148 -3.8271865469282385 6.375616654553174 26 + 2025-03-01T06:45:00.0 788.7924755565864 4659.292063776667 5277.933693558283 0.7284700422633524 -5.650333366031811 4.874306867717778