CCSDS 502.0-B Orbit Parameter Message parser and serializer
0
fork

Configure Feed

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

opm: rename find_epoch/find_float/test_parse (merlint E331/E330)

+505 -45
+45 -45
lib/opm.ml
··· 155 155 156 156 let find key pairs = List.assoc_opt key pairs 157 157 158 - let find_epoch key pairs = 158 + let epoch key pairs = 159 159 match find key pairs with 160 160 | Some v -> ( 161 161 match Kvn.parse_epoch v with Some t -> t | None -> Ptime.epoch) 162 162 | None -> Ptime.epoch 163 163 164 - let find_float key pairs = 164 + let float_val key pairs = 165 165 match find key pairs with Some v -> float_of v | None -> None 166 166 167 - let find_float_or key default pairs = 168 - match find_float key pairs with Some f -> f | None -> default 167 + let float_or key default pairs = 168 + match float_val key pairs with Some f -> f | None -> default 169 169 170 170 let parse_header pairs = 171 171 { ··· 194 194 195 195 let parse_keplerian pairs = 196 196 { 197 - semi_major_axis = find_float_or "SEMI_MAJOR_AXIS" 0.0 pairs; 198 - eccentricity = find_float_or "ECCENTRICITY" 0.0 pairs; 199 - inclination = find_float_or "INCLINATION" 0.0 pairs; 200 - ra_of_asc_node = find_float_or "RA_OF_ASC_NODE" 0.0 pairs; 201 - arg_of_pericenter = find_float_or "ARG_OF_PERICENTER" 0.0 pairs; 202 - true_anomaly = find_float "TRUE_ANOMALY" pairs; 203 - mean_anomaly = find_float "MEAN_ANOMALY" pairs; 204 - gm = find_float "GM" pairs; 197 + semi_major_axis = float_or "SEMI_MAJOR_AXIS" 0.0 pairs; 198 + eccentricity = float_or "ECCENTRICITY" 0.0 pairs; 199 + inclination = float_or "INCLINATION" 0.0 pairs; 200 + ra_of_asc_node = float_or "RA_OF_ASC_NODE" 0.0 pairs; 201 + arg_of_pericenter = float_or "ARG_OF_PERICENTER" 0.0 pairs; 202 + true_anomaly = float_val "TRUE_ANOMALY" pairs; 203 + mean_anomaly = float_val "MEAN_ANOMALY" pairs; 204 + gm = float_val "GM" pairs; 205 205 } 206 206 207 207 let parse_cartesian pairs epoch = 208 208 { 209 209 epoch; 210 - x = find_float_or "X" 0.0 pairs; 211 - y = find_float_or "Y" 0.0 pairs; 212 - z = find_float_or "Z" 0.0 pairs; 213 - x_dot = find_float_or "X_DOT" 0.0 pairs; 214 - y_dot = find_float_or "Y_DOT" 0.0 pairs; 215 - z_dot = find_float_or "Z_DOT" 0.0 pairs; 210 + x = float_or "X" 0.0 pairs; 211 + y = float_or "Y" 0.0 pairs; 212 + z = float_or "Z" 0.0 pairs; 213 + x_dot = float_or "X_DOT" 0.0 pairs; 214 + y_dot = float_or "Y_DOT" 0.0 pairs; 215 + z_dot = float_or "Z_DOT" 0.0 pairs; 216 216 } 217 217 218 218 let parse_spacecraft pairs = 219 - let mass = find_float "MASS" pairs in 220 - let solar_rad_area = find_float "SOLAR_RAD_AREA" pairs in 221 - let solar_rad_coeff = find_float "SOLAR_RAD_COEFF" pairs in 222 - let drag_area = find_float "DRAG_AREA" pairs in 223 - let drag_coeff = find_float "DRAG_COEFF" pairs in 219 + let mass = float_val "MASS" pairs in 220 + let solar_rad_area = float_val "SOLAR_RAD_AREA" pairs in 221 + let solar_rad_coeff = float_val "SOLAR_RAD_COEFF" pairs in 222 + let drag_area = float_val "DRAG_AREA" pairs in 223 + let drag_coeff = float_val "DRAG_COEFF" pairs in 224 224 match (mass, solar_rad_area, solar_rad_coeff, drag_area, drag_coeff) with 225 225 | None, None, None, None, None -> None 226 226 | _ -> Some { mass; solar_rad_area; solar_rad_coeff; drag_area; drag_coeff } ··· 231 231 Some 232 232 { 233 233 cov_ref_frame = find "COV_REF_FRAME" pairs; 234 - cx_x = find_float_or "CX_X" 0.0 pairs; 235 - cy_x = find_float_or "CY_X" 0.0 pairs; 236 - cy_y = find_float_or "CY_Y" 0.0 pairs; 237 - cz_x = find_float_or "CZ_X" 0.0 pairs; 238 - cz_y = find_float_or "CZ_Y" 0.0 pairs; 239 - cz_z = find_float_or "CZ_Z" 0.0 pairs; 240 - cx_dot_x = find_float_or "CX_DOT_X" 0.0 pairs; 241 - cx_dot_y = find_float_or "CX_DOT_Y" 0.0 pairs; 242 - cx_dot_z = find_float_or "CX_DOT_Z" 0.0 pairs; 243 - cx_dot_x_dot = find_float_or "CX_DOT_X_DOT" 0.0 pairs; 244 - cy_dot_x = find_float_or "CY_DOT_X" 0.0 pairs; 245 - cy_dot_y = find_float_or "CY_DOT_Y" 0.0 pairs; 246 - cy_dot_z = find_float_or "CY_DOT_Z" 0.0 pairs; 247 - cy_dot_x_dot = find_float_or "CY_DOT_X_DOT" 0.0 pairs; 248 - cy_dot_y_dot = find_float_or "CY_DOT_Y_DOT" 0.0 pairs; 249 - cz_dot_x = find_float_or "CZ_DOT_X" 0.0 pairs; 250 - cz_dot_y = find_float_or "CZ_DOT_Y" 0.0 pairs; 251 - cz_dot_z = find_float_or "CZ_DOT_Z" 0.0 pairs; 252 - cz_dot_x_dot = find_float_or "CZ_DOT_X_DOT" 0.0 pairs; 253 - cz_dot_y_dot = find_float_or "CZ_DOT_Y_DOT" 0.0 pairs; 254 - cz_dot_z_dot = find_float_or "CZ_DOT_Z_DOT" 0.0 pairs; 234 + cx_x = float_or "CX_X" 0.0 pairs; 235 + cy_x = float_or "CY_X" 0.0 pairs; 236 + cy_y = float_or "CY_Y" 0.0 pairs; 237 + cz_x = float_or "CZ_X" 0.0 pairs; 238 + cz_y = float_or "CZ_Y" 0.0 pairs; 239 + cz_z = float_or "CZ_Z" 0.0 pairs; 240 + cx_dot_x = float_or "CX_DOT_X" 0.0 pairs; 241 + cx_dot_y = float_or "CX_DOT_Y" 0.0 pairs; 242 + cx_dot_z = float_or "CX_DOT_Z" 0.0 pairs; 243 + cx_dot_x_dot = float_or "CX_DOT_X_DOT" 0.0 pairs; 244 + cy_dot_x = float_or "CY_DOT_X" 0.0 pairs; 245 + cy_dot_y = float_or "CY_DOT_Y" 0.0 pairs; 246 + cy_dot_z = float_or "CY_DOT_Z" 0.0 pairs; 247 + cy_dot_x_dot = float_or "CY_DOT_X_DOT" 0.0 pairs; 248 + cy_dot_y_dot = float_or "CY_DOT_Y_DOT" 0.0 pairs; 249 + cz_dot_x = float_or "CZ_DOT_X" 0.0 pairs; 250 + cz_dot_y = float_or "CZ_DOT_Y" 0.0 pairs; 251 + cz_dot_z = float_or "CZ_DOT_Z" 0.0 pairs; 252 + cz_dot_x_dot = float_or "CZ_DOT_X_DOT" 0.0 pairs; 253 + cz_dot_y_dot = float_or "CZ_DOT_Y_DOT" 0.0 pairs; 254 + cz_dot_z_dot = float_or "CZ_DOT_Z_DOT" 0.0 pairs; 255 255 } 256 256 257 257 let parse_maneuvers pairs = ··· 298 298 let pairs = parse_kvn_pairs s in 299 299 let header = parse_header pairs in 300 300 let metadata = parse_metadata pairs in 301 - let epoch = find_epoch "EPOCH" pairs in 301 + let epoch = epoch "EPOCH" pairs in 302 302 let state = 303 303 if has_keplerian pairs then Keplerian (parse_keplerian pairs) 304 304 else Cartesian (parse_cartesian pairs epoch)
+15
test/interop/orekit/dune
··· 1 + (test 2 + (name test) 3 + (libraries opm 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))))
+198
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 OPM interop traces using Orekit 12.2. 5 + // Run: jbang generate.java <TRACE_DIR> <OREKIT_DATA_ZIP> 6 + 7 + import org.orekit.data.*; 8 + import org.orekit.files.ccsds.ndm.*; 9 + import org.orekit.files.ccsds.ndm.odm.opm.*; 10 + import org.orekit.files.ccsds.utils.generation.KvnGenerator; 11 + import java.io.*; 12 + import java.nio.charset.StandardCharsets; 13 + import java.nio.file.*; 14 + import java.util.*; 15 + 16 + public class generate { 17 + 18 + static void bootstrap(Path dataZip) { 19 + DataContext.getDefault().getDataProvidersManager() 20 + .addProvider(new ZipJarCrawler(dataZip.toFile())); 21 + } 22 + 23 + record Scenario(String name, String kvn) {} 24 + 25 + static Scenario[] scenarios() { 26 + return new Scenario[] { 27 + new Scenario("cartesian_leo", """ 28 + CCSDS_OPM_VERS = 2.0 29 + CREATION_DATE = 2025-01-15T00:00:00 30 + ORIGINATOR = NASA/JSC 31 + 32 + OBJECT_NAME = ISS 33 + OBJECT_ID = 1998-067A 34 + CENTER_NAME = EARTH 35 + REF_FRAME = EME2000 36 + TIME_SYSTEM = UTC 37 + 38 + EPOCH = 2025-01-15T12:00:00 39 + X = 4453.783586 40 + Y = 5038.203756 41 + Z = -3568.142901 42 + X_DOT = -3.457328 43 + Y_DOT = -5.103621 44 + Z_DOT = -2.848721 45 + """), 46 + new Scenario("geo_cartesian", """ 47 + CCSDS_OPM_VERS = 2.0 48 + CREATION_DATE = 2025-02-01T00:00:00 49 + ORIGINATOR = EUMETSAT 50 + 51 + OBJECT_NAME = METEOSAT-12 52 + OBJECT_ID = 2022-167A 53 + CENTER_NAME = EARTH 54 + REF_FRAME = EME2000 55 + TIME_SYSTEM = UTC 56 + 57 + EPOCH = 2025-02-01T00:00:00 58 + X = 42164.0 59 + Y = 0.0 60 + Z = 0.0 61 + X_DOT = 0.0 62 + Y_DOT = 3.07466 63 + Z_DOT = 0.0 64 + """), 65 + new Scenario("with_maneuver", """ 66 + CCSDS_OPM_VERS = 2.0 67 + CREATION_DATE = 2025-03-01T00:00:00 68 + ORIGINATOR = ESA/ESOC 69 + 70 + OBJECT_NAME = SENTINEL-2A 71 + OBJECT_ID = 2015-028A 72 + CENTER_NAME = EARTH 73 + REF_FRAME = EME2000 74 + TIME_SYSTEM = UTC 75 + 76 + EPOCH = 2025-03-01T06:00:00 77 + X = -2345.678 78 + Y = 6789.012 79 + Z = 123.456 80 + X_DOT = -7.234567 81 + Y_DOT = -1.567890 82 + Z_DOT = 1.234567 83 + MAN_EPOCH_IGNITION = 2025-03-01T12:00:00 84 + MAN_DURATION = 120.0 85 + MAN_DELTA_MASS = -5.0 86 + MAN_REF_FRAME = EME2000 87 + MAN_DV_1 = 0.001 88 + MAN_DV_2 = 0.0 89 + MAN_DV_3 = 0.0 90 + """), 91 + new Scenario("deep_space_sun", """ 92 + CCSDS_OPM_VERS = 2.0 93 + CREATION_DATE = 2025-04-01T00:00:00 94 + ORIGINATOR = NASA/JPL 95 + 96 + OBJECT_NAME = PARKER SOLAR PROBE 97 + OBJECT_ID = 2018-065A 98 + CENTER_NAME = SUN 99 + REF_FRAME = ICRF 100 + TIME_SYSTEM = TDB 101 + 102 + EPOCH = 2025-04-01T00:00:00 103 + X = -92345678.123 104 + Y = 134567890.456 105 + Z = 58345678.901 106 + X_DOT = -28.456789 107 + Y_DOT = -18.234567 108 + Z_DOT = -7.890123 109 + """), 110 + new Scenario("with_spacecraft_params", """ 111 + CCSDS_OPM_VERS = 2.0 112 + CREATION_DATE = 2025-05-01T00:00:00 113 + ORIGINATOR = CNES 114 + 115 + OBJECT_NAME = JASON-3 116 + OBJECT_ID = 2016-002A 117 + CENTER_NAME = EARTH 118 + REF_FRAME = EME2000 119 + TIME_SYSTEM = UTC 120 + 121 + EPOCH = 2025-05-01T00:00:00 122 + X = 7100.0 123 + Y = 0.0 124 + Z = 0.0 125 + X_DOT = 0.0 126 + Y_DOT = 7.5 127 + Z_DOT = 0.0 128 + MASS = 525.0 129 + SOLAR_RAD_AREA = 12.5 130 + SOLAR_RAD_COEFF = 1.3 131 + DRAG_AREA = 8.0 132 + DRAG_COEFF = 2.2 133 + """), 134 + new Scenario("negative_values", """ 135 + CCSDS_OPM_VERS = 2.0 136 + CREATION_DATE = 2025-06-01T00:00:00 137 + ORIGINATOR = DLR 138 + 139 + OBJECT_NAME = TERRASAR-X 140 + OBJECT_ID = 2007-026A 141 + CENTER_NAME = EARTH 142 + REF_FRAME = EME2000 143 + TIME_SYSTEM = UTC 144 + 145 + EPOCH = 2025-06-01T12:00:00 146 + X = -6178.912345 147 + Y = -567.234567 148 + Z = -4198.123456 149 + X_DOT = 1.123456 150 + Y_DOT = -7.012345 151 + Z_DOT = -0.234567 152 + """), 153 + }; 154 + } 155 + 156 + public static void main(String[] args) throws Exception { 157 + if (args.length < 2) { System.err.println("Usage: generate.java <TRACE_DIR> <OREKIT_DATA_ZIP>"); System.exit(1); } 158 + Path traceDir = Paths.get(args[0]); 159 + Files.createDirectories(traceDir); 160 + bootstrap(Paths.get(args[1])); 161 + 162 + var parser = new ParserBuilder().buildOpmParser(); 163 + var writer = new WriterBuilder().buildOpmWriter(); 164 + 165 + try (PrintWriter csv = new PrintWriter(new FileWriter(traceDir.resolve("index.csv").toFile()))) { 166 + csv.println("name,file,object_name,object_id,center_name,ref_frame,time_system,epoch,x,y,z,x_dot,y_dot,z_dot"); 167 + 168 + for (var sc : scenarios()) { 169 + var source = new DataSource("<inline>", 170 + () -> new ByteArrayInputStream(sc.kvn().getBytes(StandardCharsets.UTF_8))); 171 + Opm opm = parser.parseMessage(source); 172 + 173 + StringWriter sw = new StringWriter(); 174 + try (KvnGenerator gen = new KvnGenerator(sw, 0, "", Double.NaN, 0)) { 175 + writer.writeMessage(gen, opm); 176 + } 177 + String kvnOut = sw.toString(); 178 + Files.writeString(traceDir.resolve(sc.name() + ".kvn"), kvnOut); 179 + 180 + var meta = opm.getMetadata(); 181 + var pv = opm.getData().getStateVectorBlock().toTimeStampedPVCoordinates(); 182 + var pos = pv.getPosition(); 183 + var vel = pv.getVelocity(); 184 + String epoch = pv.getDate().toString( 185 + org.orekit.time.TimeScalesFactory.getUTC()); 186 + 187 + csv.printf("%s,%s.kvn,%s,%s,%s,%s,%s,%s,%.14g,%.14g,%.14g,%.14g,%.14g,%.14g%n", 188 + sc.name(), sc.name(), meta.getObjectName(), meta.getObjectID(), 189 + meta.getCenter().getName(), meta.getReferenceFrame().getName(), 190 + meta.getTimeSystem().name(), epoch, 191 + pos.getX()/1000.0, pos.getY()/1000.0, pos.getZ()/1000.0, 192 + vel.getX()/1000.0, vel.getY()/1000.0, vel.getZ()/1000.0); 193 + System.out.printf("%s: ok%n", sc.name()); 194 + } 195 + } 196 + System.out.println("Wrote index.csv"); 197 + } 198 + }
+17
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 + OREKIT_DATA="/tmp/orekit-data-main.zip" 10 + if [ ! -f "$OREKIT_DATA" ]; then 11 + echo "Downloading orekit-data..." 12 + curl -sL -o "$OREKIT_DATA" \ 13 + "https://gitlab.orekit.org/orekit/orekit-data/-/archive/main/orekit-data-main.zip" 14 + fi 15 + 16 + cd "$SCRIPT_DIR" 17 + jbang generate.java "$TRACE_DIR" "$OREKIT_DATA"
+115
test/interop/orekit/test.ml
··· 1 + (** Orekit interop tests for CCSDS 502.0-B OPM. 2 + 3 + Traces generated by: Orekit 12.2 (Java) OPM 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 + epoch : string; 17 + x : float; 18 + y : float; 19 + z : float; 20 + x_dot : float; 21 + y_dot : float; 22 + z_dot : float; 23 + } 24 + 25 + let row_codec = 26 + Csvt.( 27 + Row.( 28 + obj 29 + (fun name file object_name object_id center_name ref_frame time_system 30 + epoch x y z x_dot y_dot z_dot -> 31 + { 32 + name; 33 + file; 34 + object_name; 35 + object_id; 36 + center_name; 37 + ref_frame; 38 + time_system; 39 + epoch; 40 + x; 41 + y; 42 + z; 43 + x_dot; 44 + y_dot; 45 + z_dot; 46 + }) 47 + |> col "name" string ~enc:(fun r -> r.name) 48 + |> col "file" string ~enc:(fun r -> r.file) 49 + |> col "object_name" string ~enc:(fun r -> r.object_name) 50 + |> col "object_id" string ~enc:(fun r -> r.object_id) 51 + |> col "center_name" string ~enc:(fun r -> r.center_name) 52 + |> col "ref_frame" string ~enc:(fun r -> r.ref_frame) 53 + |> col "time_system" string ~enc:(fun r -> r.time_system) 54 + |> col "epoch" string ~enc:(fun r -> r.epoch) 55 + |> col "x" float ~enc:(fun r -> r.x) 56 + |> col "y" float ~enc:(fun r -> r.y) 57 + |> col "z" float ~enc:(fun r -> r.z) 58 + |> col "x_dot" float ~enc:(fun r -> r.x_dot) 59 + |> col "y_dot" float ~enc:(fun r -> r.y_dot) 60 + |> col "z_dot" float ~enc:(fun r -> r.z_dot) 61 + |> finish)) 62 + 63 + let epsilon = 1e-6 64 + 65 + let check_float ~name expected actual = 66 + let diff = Float.abs (expected -. actual) in 67 + let scale = Float.max 1.0 (Float.abs expected) in 68 + if diff /. scale > epsilon then 69 + Alcotest.failf "%s: expected %.10g, got %.10g (diff %.2e)" name expected 70 + actual diff 71 + 72 + let parse () = 73 + let rows = 74 + match Csvt.decode_file row_codec (trace "index.csv") with 75 + | Ok rows -> rows 76 + | Error e -> Alcotest.failf "CSV: %a" Csvt.pp_error e 77 + in 78 + List.iter 79 + (fun (r : row) -> 80 + let content = 81 + let ic = open_in (trace r.file) in 82 + let s = In_channel.input_all ic in 83 + close_in ic; 84 + s 85 + in 86 + let opm = 87 + match Opm.of_string content with 88 + | Ok opm -> opm 89 + | Error e -> Alcotest.failf "%s: %a" r.name Opm.pp_error e 90 + in 91 + Alcotest.(check string) 92 + (r.name ^ " object_name") r.object_name opm.metadata.object_name; 93 + Alcotest.(check string) 94 + (r.name ^ " object_id") r.object_id opm.metadata.object_id; 95 + Alcotest.(check string) 96 + (r.name ^ " ref_frame") r.ref_frame opm.metadata.ref_frame; 97 + Alcotest.(check string) 98 + (r.name ^ " time_system") r.time_system opm.metadata.time_system; 99 + match opm.state with 100 + | Opm.Cartesian c -> 101 + check_float ~name:(r.name ^ ".x") r.x c.x; 102 + check_float ~name:(r.name ^ ".y") r.y c.y; 103 + check_float ~name:(r.name ^ ".z") r.z c.z; 104 + check_float ~name:(r.name ^ ".x_dot") r.x_dot c.x_dot; 105 + check_float ~name:(r.name ^ ".y_dot") r.y_dot c.y_dot; 106 + check_float ~name:(r.name ^ ".z_dot") r.z_dot c.z_dot 107 + | Opm.Keplerian _ -> 108 + Alcotest.failf "%s: expected Cartesian state" r.name) 109 + rows 110 + 111 + let () = 112 + Alcotest.run "opm-interop-orekit" 113 + [ 114 + ("parse", [ Alcotest.test_case "parse matches Orekit" `Quick parse ]); 115 + ]
+16
test/interop/orekit/traces/cartesian_leo.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-01-15T00:00:00.0 3 + ORIGINATOR = NASA/JSC 4 + 5 + OBJECT_NAME = ISS 6 + OBJECT_ID = 1998-067A 7 + CENTER_NAME = EARTH 8 + REF_FRAME = EME2000 9 + TIME_SYSTEM = UTC 10 + EPOCH = 2025-01-15T12:00:00.0 11 + X = 4453.783586 12 + Y = 5038.203756 13 + Z = -3568.142901 14 + X_DOT = -3.457328 15 + Y_DOT = -5.103621 16 + Z_DOT = -2.848721
+16
test/interop/orekit/traces/deep_space_sun.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-04-01T00:00:00.0 3 + ORIGINATOR = NASA/JPL 4 + 5 + OBJECT_NAME = PARKER SOLAR PROBE 6 + OBJECT_ID = 2018-065A 7 + CENTER_NAME = SUN 8 + REF_FRAME = ICRF 9 + TIME_SYSTEM = TDB 10 + EPOCH = 2025-04-01T00:00:00.0 11 + X = -9.2345678123E7 12 + Y = 1.34567890456E8 13 + Z = 5.8345678901E7 14 + X_DOT = -28.456789 15 + Y_DOT = -18.234567 16 + Z_DOT = -7.890123
+16
test/interop/orekit/traces/geo_cartesian.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-02-01T00:00:00.0 3 + ORIGINATOR = EUMETSAT 4 + 5 + OBJECT_NAME = METEOSAT-12 6 + OBJECT_ID = 2022-167A 7 + CENTER_NAME = EARTH 8 + REF_FRAME = EME2000 9 + TIME_SYSTEM = UTC 10 + EPOCH = 2025-02-01T00:00:00.0 11 + X = 42164.0 12 + Y = 0.0 13 + Z = 0.0 14 + X_DOT = 0.0 15 + Y_DOT = 3.07466 16 + Z_DOT = 0.0
+7
test/interop/orekit/traces/index.csv
··· 1 + name,file,object_name,object_id,center_name,ref_frame,time_system,epoch,x,y,z,x_dot,y_dot,z_dot 2 + cartesian_leo,cartesian_leo.kvn,ISS,1998-067A,EARTH,EME2000,UTC,2025-01-15T12:00:00.000,4453.7835860000,5038.2037560000,-3568.1429010000,-3.4573280000000,-5.1036210000000,-2.8487210000000 3 + geo_cartesian,geo_cartesian.kvn,METEOSAT-12,2022-167A,EARTH,EME2000,UTC,2025-02-01T00:00:00.000,42164.000000000,0.0000000000000,0.0000000000000,0.0000000000000,3.0746600000000,0.0000000000000 4 + with_maneuver,with_maneuver.kvn,SENTINEL-2A,2015-028A,EARTH,EME2000,UTC,2025-03-01T06:00:00.000,-2345.6780000000,6789.0120000000,123.45600000000,-7.2345670000000,-1.5678900000000,1.2345670000000 5 + deep_space_sun,deep_space_sun.kvn,PARKER SOLAR PROBE,2018-065A,SUN,ICRF,TDB,2025-03-31T23:58:50.81434373217272,-92345678.123000,134567890.45600,58345678.901000,-28.456789000000,-18.234567000000,-7.8901230000000 6 + with_spacecraft_params,with_spacecraft_params.kvn,JASON-3,2016-002A,EARTH,EME2000,UTC,2025-05-01T00:00:00.000,7100.0000000000,0.0000000000000,0.0000000000000,0.0000000000000,7.5000000000000,0.0000000000000 7 + negative_values,negative_values.kvn,TERRASAR-X,2007-026A,EARTH,EME2000,UTC,2025-06-01T12:00:00.000,-6178.9123450000,-567.23456700000,-4198.1234560000,1.1234560000000,-7.0123450000000,-0.23456700000000
+16
test/interop/orekit/traces/negative_values.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-06-01T00:00:00.0 3 + ORIGINATOR = DLR 4 + 5 + OBJECT_NAME = TERRASAR-X 6 + OBJECT_ID = 2007-026A 7 + CENTER_NAME = EARTH 8 + REF_FRAME = EME2000 9 + TIME_SYSTEM = UTC 10 + EPOCH = 2025-06-01T12:00:00.0 11 + X = -6178.912345 12 + Y = -567.234567 13 + Z = -4198.123456 14 + X_DOT = 1.123456 15 + Y_DOT = -7.012345 16 + Z_DOT = -0.234567
+23
test/interop/orekit/traces/with_maneuver.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-03-01T00:00:00.0 3 + ORIGINATOR = ESA/ESOC 4 + 5 + OBJECT_NAME = SENTINEL-2A 6 + OBJECT_ID = 2015-028A 7 + CENTER_NAME = EARTH 8 + REF_FRAME = EME2000 9 + TIME_SYSTEM = UTC 10 + EPOCH = 2025-03-01T06:00:00.0 11 + X = -2345.678 12 + Y = 6789.012 13 + Z = 123.456 14 + X_DOT = -7.234567 15 + Y_DOT = -1.56789 16 + Z_DOT = 1.234567 17 + MAN_EPOCH_IGNITION = 2025-03-01T12:00:00.0 18 + MAN_DURATION = 120.0 19 + MAN_DELTA_MASS = -5.0 20 + MAN_REF_FRAME = EME2000 21 + MAN_DV_1 = 0.001 22 + MAN_DV_2 = 0.0 23 + MAN_DV_3 = 0.0
+21
test/interop/orekit/traces/with_spacecraft_params.kvn
··· 1 + CCSDS_OPM_VERS = 2.0 2 + CREATION_DATE = 2025-05-01T00:00:00.0 3 + ORIGINATOR = CNES 4 + 5 + OBJECT_NAME = JASON-3 6 + OBJECT_ID = 2016-002A 7 + CENTER_NAME = EARTH 8 + REF_FRAME = EME2000 9 + TIME_SYSTEM = UTC 10 + EPOCH = 2025-05-01T00:00:00.0 11 + X = 7100.0 12 + Y = 0.0 13 + Z = 0.0 14 + X_DOT = 0.0 15 + Y_DOT = 7.5 16 + Z_DOT = 0.0 17 + MASS = 525.0 18 + SOLAR_RAD_AREA = 12.5 19 + SOLAR_RAD_COEFF = 1.3 20 + DRAG_AREA = 8.0 21 + DRAG_COEFF = 2.2