From 945784a7cf8609a722f44bf12b8bfa9e22ba6126 Mon Sep 17 00:00:00 2001 From: Leon Liu Date: Fri, 15 Aug 2025 08:50:02 +0900 Subject: [PATCH] update --- Cargo.lock | 1239 +++++++++- Cargo.toml | 10 + assets/jpl_horizon/bodies/Ariel.txt | 115 + assets/jpl_horizon/bodies/Callisto.txt | 114 + assets/jpl_horizon/bodies/Deimos.txt | 115 + assets/jpl_horizon/bodies/Dione.txt | 117 + assets/jpl_horizon/bodies/Earth.txt | 131 + assets/jpl_horizon/bodies/Enceladus.txt | 117 + assets/jpl_horizon/bodies/Europa.txt | 114 + assets/jpl_horizon/bodies/Ganymede.txt | 114 + assets/jpl_horizon/bodies/Iapetus.txt | 117 + assets/jpl_horizon/bodies/Io.txt | 114 + assets/jpl_horizon/bodies/Jupiter.txt | 125 + assets/jpl_horizon/bodies/Mars.txt | 126 + assets/jpl_horizon/bodies/Mercury.txt | 124 + assets/jpl_horizon/bodies/Mimas.txt | 117 + assets/jpl_horizon/bodies/Miranda.txt | 115 + assets/jpl_horizon/bodies/Moon.txt | 125 + assets/jpl_horizon/bodies/Neptune.txt | 125 + assets/jpl_horizon/bodies/Oberon.txt | 115 + assets/jpl_horizon/bodies/Phobos.txt | 115 + assets/jpl_horizon/bodies/Pluto.txt | 124 + assets/jpl_horizon/bodies/Rhea.txt | 117 + assets/jpl_horizon/bodies/Saturn.txt | 125 + assets/jpl_horizon/bodies/Sun.txt | 124 + assets/jpl_horizon/bodies/Tethys.txt | 117 + assets/jpl_horizon/bodies/Titan.txt | 117 + assets/jpl_horizon/bodies/Titania.txt | 115 + assets/jpl_horizon/bodies/Triton.txt | 117 + assets/jpl_horizon/bodies/Umbriel.txt | 115 + assets/jpl_horizon/bodies/Uranus.txt | 125 + assets/jpl_horizon/bodies/Venus.txt | 124 + assets/jpl_horizon/initial_state.ron | 219 ++ assets/jpl_horizon/major_bodies.ron | 2992 +++++++++++++++++++++++ assets/moon.txt | 2 +- src/jpl_horizon.rs | 2328 ++++++++++++++++++ src/lib.rs | 1 + src/main.rs | 110 +- 38 files changed, 10423 insertions(+), 53 deletions(-) create mode 100644 assets/jpl_horizon/bodies/Ariel.txt create mode 100644 assets/jpl_horizon/bodies/Callisto.txt create mode 100644 assets/jpl_horizon/bodies/Deimos.txt create mode 100644 assets/jpl_horizon/bodies/Dione.txt create mode 100644 assets/jpl_horizon/bodies/Earth.txt create mode 100644 assets/jpl_horizon/bodies/Enceladus.txt create mode 100644 assets/jpl_horizon/bodies/Europa.txt create mode 100644 assets/jpl_horizon/bodies/Ganymede.txt create mode 100644 assets/jpl_horizon/bodies/Iapetus.txt create mode 100644 assets/jpl_horizon/bodies/Io.txt create mode 100644 assets/jpl_horizon/bodies/Jupiter.txt create mode 100644 assets/jpl_horizon/bodies/Mars.txt create mode 100644 assets/jpl_horizon/bodies/Mercury.txt create mode 100644 assets/jpl_horizon/bodies/Mimas.txt create mode 100644 assets/jpl_horizon/bodies/Miranda.txt create mode 100644 assets/jpl_horizon/bodies/Moon.txt create mode 100644 assets/jpl_horizon/bodies/Neptune.txt create mode 100644 assets/jpl_horizon/bodies/Oberon.txt create mode 100644 assets/jpl_horizon/bodies/Phobos.txt create mode 100644 assets/jpl_horizon/bodies/Pluto.txt create mode 100644 assets/jpl_horizon/bodies/Rhea.txt create mode 100644 assets/jpl_horizon/bodies/Saturn.txt create mode 100644 assets/jpl_horizon/bodies/Sun.txt create mode 100644 assets/jpl_horizon/bodies/Tethys.txt create mode 100644 assets/jpl_horizon/bodies/Titan.txt create mode 100644 assets/jpl_horizon/bodies/Titania.txt create mode 100644 assets/jpl_horizon/bodies/Triton.txt create mode 100644 assets/jpl_horizon/bodies/Umbriel.txt create mode 100644 assets/jpl_horizon/bodies/Uranus.txt create mode 100644 assets/jpl_horizon/bodies/Venus.txt create mode 100644 assets/jpl_horizon/initial_state.ron create mode 100644 assets/jpl_horizon/major_bodies.ron create mode 100644 src/jpl_horizon.rs create mode 100644 src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6e6e490..86f00a4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,6 +77,15 @@ dependencies = [ "winit", ] +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + [[package]] name = "adler2" version = "2.0.1" @@ -336,6 +345,21 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + [[package]] name = "base64" version = "0.21.7" @@ -441,7 +465,7 @@ dependencies = [ "downcast-rs 2.0.1", "either", "petgraph", - "ron", + "ron 0.8.1", "serde", "smallvec", "thiserror 2.0.14", @@ -502,7 +526,7 @@ dependencies = [ "futures-lite", "js-sys", "parking_lot", - "ron", + "ron 0.8.1", "serde", "stackfuture", "thiserror 2.0.14", @@ -1718,7 +1742,9 @@ checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", + "js-sys", "num-traits", + "wasm-bindgen", "windows-link", ] @@ -1853,7 +1879,7 @@ dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] @@ -2044,6 +2070,17 @@ dependencies = [ "objc2 0.6.1", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "disqualified" version = "1.0.0" @@ -2159,6 +2196,15 @@ dependencies = [ "syn", ] +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "epaint" version = "0.32.0" @@ -2319,6 +2365,15 @@ dependencies = [ "ttf-parser 0.20.0", ] +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared 0.1.1", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -2326,7 +2381,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared", + "foreign-types-shared 0.3.1", ] [[package]] @@ -2340,12 +2395,42 @@ dependencies = [ "syn", ] +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "foreign-types-shared" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -2353,6 +2438,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -2361,6 +2447,17 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.31" @@ -2380,6 +2477,47 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "fuzzy-matcher" version = "0.3.7" @@ -2458,6 +2596,12 @@ dependencies = [ "windows 0.61.3", ] +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + [[package]] name = "gl_generator" version = "0.14.0" @@ -2611,6 +2755,44 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "h2" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.12", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + [[package]] name = "half" version = "2.6.0" @@ -2681,6 +2863,189 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.5.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.6.0", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper 0.14.32", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper 1.6.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.6.0", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2 0.6.0", + "system-configuration 0.6.1", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + [[package]] name = "iana-time-zone" version = "0.1.63" @@ -2705,6 +3070,113 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + [[package]] name = "image" version = "0.25.6" @@ -2774,6 +3246,33 @@ dependencies = [ "mach2", ] +[[package]] +name = "io-uring" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "itertools" version = "0.13.0" @@ -2955,6 +3454,12 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + [[package]] name = "litrs" version = "0.4.2" @@ -3028,12 +3533,18 @@ dependencies = [ "bitflags 2.9.1", "block", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "log", "objc", "paste", ] +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3050,6 +3561,17 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + [[package]] name = "naga" version = "24.0.0" @@ -3093,6 +3615,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + [[package]] name = "ndk" version = "0.8.0" @@ -3533,6 +4072,15 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + [[package]] name = "oboe" version = "0.6.1" @@ -3581,6 +4129,50 @@ version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "foreign-types 0.3.2", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "orbclient" version = "0.3.48" @@ -3693,6 +4285,12 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "piper" version = "0.2.4" @@ -3752,6 +4350,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + [[package]] name = "pp-rs" version = "0.2.1" @@ -3982,6 +4589,114 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.3.27", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-tls 0.5.0", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 0.1.2", + "system-configuration 0.5.1", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64 0.22.1", + "bytes", + "encoding_rs", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-rustls", + "hyper-tls 0.6.0", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rhorizons" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad2ca98f406184b4e8c64424477f974e34c77b2c024effd0140810bba04c69b" +dependencies = [ + "chrono", + "log", + "reqwest 0.11.27", + "serde", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + [[package]] name = "rodio" version = "0.20.1" @@ -4004,12 +4719,31 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "ron" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" +dependencies = [ + "base64 0.22.1", + "bitflags 2.9.1", + "serde", + "serde_derive", + "unicode-ident", +] + [[package]] name = "roxmltree" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -4048,6 +4782,48 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -4095,6 +4871,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -4120,6 +4905,29 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.2.0" @@ -4164,6 +4972,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + [[package]] name = "sharded-slab" version = "0.1.7" @@ -4179,6 +4999,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" +dependencies = [ + "libc", +] + [[package]] name = "simd-adler32" version = "0.3.7" @@ -4250,6 +5079,26 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "solar-sim" version = "0.1.0" @@ -4257,7 +5106,17 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_panorbit_camera", + "chrono", + "futures", "iyes_perf_ui", + "regex", + "reqwest 0.12.23", + "rhorizons", + "ron 0.10.1", + "serde", + "serde_json", + "thiserror 2.0.14", + "tokio", ] [[package]] @@ -4324,6 +5183,12 @@ dependencies = [ "syn", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -4352,6 +5217,32 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sys-locale" version = "0.3.2" @@ -4374,6 +5265,48 @@ dependencies = [ "windows 0.57.0", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.9.4", + "system-configuration-sys 0.6.0", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "taffy" version = "0.7.7" @@ -4386,6 +5319,19 @@ dependencies = [ "slotmap", ] +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.0.8", + "windows-sys 0.59.0", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -4480,6 +5426,16 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinyvec" version = "1.9.0" @@ -4495,6 +5451,70 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "slab", + "socket2 0.6.0", + "tokio-macros", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -4512,6 +5532,51 @@ dependencies = [ "winnow", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + [[package]] name = "tracing" version = "0.1.41" @@ -4599,6 +5664,12 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + [[package]] name = "ttf-parser" version = "0.20.0" @@ -4695,6 +5766,29 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" version = "1.18.0" @@ -4724,6 +5818,12 @@ dependencies = [ "syn", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "vec_map" version = "0.8.2" @@ -4746,6 +5846,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -5301,6 +6410,17 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -5356,6 +6476,15 @@ dependencies = [ "windows-targets 0.42.2", ] +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -5696,6 +6825,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + [[package]] name = "wit-bindgen-rt" version = "0.39.0" @@ -5705,6 +6844,12 @@ dependencies = [ "bitflags 2.9.1", ] +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + [[package]] name = "x11-dl" version = "2.21.0" @@ -5774,6 +6919,30 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeno" version = "0.3.3" @@ -5799,3 +6968,63 @@ dependencies = [ "quote", "syn", ] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml index 0584c5d..2916f7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,7 +7,17 @@ edition = "2024" bevy = "0.16" bevy-inspector-egui = "0.33.1" bevy_panorbit_camera = "0.26" +chrono = "0.4.41" +futures = "0.3.31" iyes_perf_ui = "0.5.0" +regex = "1.11.1" +reqwest = { version = "0.12", features = ["json"] } +rhorizons = "0.5.0" +ron = "0.10.1" +serde = { version = "1.0", features = ["derive"] } +serde_json = "1.0" +thiserror = "2.0" +tokio = { version = "1.47.1", features = ["full"] } # Enable a small amount of optimization in the dev profile. [profile.dev] diff --git a/assets/jpl_horizon/bodies/Ariel.txt b/assets/jpl_horizon/bodies/Ariel.txt new file mode 100644 index 0000000..d7dbdae --- /dev/null +++ b/assets/jpl_horizon/bodies/Ariel.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 29, 2025 Ariel / (Uranus) 701 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 581.1x577.9x577.7 Density (g cm^-3) = 1.54 +- 0.026 + GM (km^3/s^2) = 83.43 +- 1.40 Geometric Albedo = 0.34 + V(1,0) = +1.45 + + SATELLITE ORBITAL DATA (mean elements referred to equatorial plane & IAU pole) + Semi-major axis, a (km) = 191.2 (10^3) Orbital period = 2.520 d + Eccentricity, e = 0.0034 Rotational period = Synchronous + Inclination, i (deg) = 179.69 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:46 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Ariel (701) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110453239435098E+01 Y = 1.609416926126415E+01 Z =-8.504238243640228E-02 + VX=-5.417334967749265E-03 VY= 2.196892645955784E-03 VZ=-2.298152372242362E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110452863095813E+01 Y = 1.609417078735579E+01 Z =-8.504397710872791E-02 + VX=-5.421235378195795E-03 VY= 2.198251211682732E-03 VZ=-2.294502747948997E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Callisto.txt b/assets/jpl_horizon/bodies/Callisto.txt new file mode 100644 index 0000000..d25cdd5 --- /dev/null +++ b/assets/jpl_horizon/bodies/Callisto.txt @@ -0,0 +1,114 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Mar 12, 2021 Callisto / (Jupiter) 504 + + SATELLITE PHYSICAL PROPERTIES: + Mean radius (km) = 2410.3 +- 1.5 Density (g cm^-3)= 1.834 +- 0.004 + GM (km^3/s^2) = 7179.2834 +- 0.0097 Geometric Albedo = 0.17 +- 0.02 + + SATELLITE ORBIT (at J2000.0 epoch, 2000-Jan-1.5): + Semi-major axis, a (km)~ 1,883,000 Orbital period ~ 16.691 d + Eccentricity, e ~ 0.00744 Rotational period= Synchronous + Inclination, i (deg) ~ 0.200 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:34 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Callisto (504) {source: jup365_merged} +Center body name: Sun (10) {source: jup365_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.046927187861326E+00 Y = 4.980213520221207E+00 Z =-4.412635447845523E-02 + VX=-1.076662893789138E-02 VY=-1.453153071657253E-03 VZ= 9.400054299331563E-06 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.046919711342476E+00 Y = 4.980212510788754E+00 Z =-4.412634795573506E-02 + VX=-1.076574531183088E-02 VY=-1.454012353275114E-03 VZ= 9.385381807833990E-06 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Deimos.txt b/assets/jpl_horizon/bodies/Deimos.txt new file mode 100644 index 0000000..75965a8 --- /dev/null +++ b/assets/jpl_horizon/bodies/Deimos.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jun 02, 2025 Deimos / (Mars) 402 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 7.8 x 6.0 x 5.1 Density (g cm^-3) = 1.76 +- 0.30 + Mass (10^20 kg ) = 1.80 (10^-5) Geometric Albedo = 0.06 + (+- 0.15) V(1,0) = +12.89 + + SATELLITE ORBITAL DATA: + Semi-major axis, a (km) = 23.4632(10^3) Orbital period = 1.263 d + Eccentricity, e = 0.00033 Rotational period = Synchronous + Inclination, i (deg) = 1.791 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:28 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Deimos (402) {source: mar099} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-5.215476623931578E-01 Y = 1.525280501692070E+00 Z = 4.469744727198185E-02 + VX=-1.290124900899404E-02 VY=-2.594527535740538E-03 VZ= 3.799855876623048E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-5.215566224100128E-01 Y = 1.525278699635617E+00 Z = 4.469771149715475E-02 + VX=-1.290359915493358E-02 VY=-2.595396531058469E-03 VZ= 3.809826346570343E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Dione.txt b/assets/jpl_horizon/bodies/Dione.txt new file mode 100644 index 0000000..9dd49ef --- /dev/null +++ b/assets/jpl_horizon/bodies/Dione.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Dione / (Saturn) 604 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 562.5 +- 5 Density (g/cm^3) = 1.469 +- 0.012 + Mass (10^19 kg) = 109.572 Geometric Albedo = 0.6 + GM (km^3/s^2) = 73.116 +- 0.02 V(1,0) = +0.8 + + SATELLITE ORBITAL DATA (mean values referred to local Laplace plane): + Semi-major axis, a (km) = 377.42(10^3) Orbital period = 2.736915 d + Eccentricity, e = 0.0022 Rotational period = Synchronous + Inclination, i (deg) = 0.028 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:39 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Dione (604) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.460669031566509E+00 Y =-1.762393870120674E+00 Z =-3.470001695782450E-01 + VX=-4.995042476514132E-03 VY= 4.898468069198046E-03 VZ= 7.315317142172153E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.460665563295446E+00 Y =-1.762390471236195E+00 Z =-3.469996601384587E-01 + VX=-4.993575760054306E-03 VY= 4.890319489938703E-03 VZ= 7.356544990270154E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Earth.txt b/assets/jpl_horizon/bodies/Earth.txt new file mode 100644 index 0000000..155b896 --- /dev/null +++ b/assets/jpl_horizon/bodies/Earth.txt @@ -0,0 +1,131 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 12, 2021 Earth 399 + + GEOPHYSICAL PROPERTIES (revised May 9, 2022): + Vol. Mean Radius (km) = 6371.01+-0.02 Mass x10^24 (kg)= 5.97219+-0.0006 + Equ. radius, km = 6378.137 Mass layers: + Polar axis, km = 6356.752 Atmos = 5.1 x 10^18 kg + Flattening = 1/298.257223563 oceans = 1.4 x 10^21 kg + Density, g/cm^3 = 5.51 crust = 2.6 x 10^22 kg + J2 (IERS 2010) = 0.00108262545 mantle = 4.043 x 10^24 kg + g_p, m/s^2 (polar) = 9.8321863685 outer core = 1.835 x 10^24 kg + g_e, m/s^2 (equatorial) = 9.7803267715 inner core = 9.675 x 10^22 kg + g_o, m/s^2 = 9.82022 Fluid core rad = 3480 km + GM, km^3/s^2 = 398600.435436 Inner core rad = 1215 km + GM 1-sigma, km^3/s^2 = 0.0014 Escape velocity = 11.186 km/s + Rot. Rate (rad/s) = 0.00007292115 Surface area: + Mean sidereal day, hr = 23.9344695944 land = 1.48 x 10^8 km + Mean solar day 2000.0, s = 86400.002 sea = 3.62 x 10^8 km + Mean solar day 1820.0, s = 86400.0 Love no., k2 = 0.299 + Moment of inertia = 0.3308 Atm. pressure = 1.0 bar + Mean surface temp (Ts), K= 287.6 Volume, km^3 = 1.08321 x 10^12 + Mean effect. temp (Te), K= 255 Magnetic moment = 0.61 gauss Rp^3 + Geometric albedo = 0.367 Vis. mag. V(1,0)= -3.86 + Solar Constant (W/m^2) = 1367.6 (mean), 1414 (perihelion), 1322 (aphelion) + HELIOCENTRIC ORBIT CHARACTERISTICS: + Obliquity to orbit, deg = 23.4392911 Sidereal orb period = 1.0000174 y + Orbital speed, km/s = 29.79 Sidereal orb period = 365.25636 d + Mean daily motion, deg/d = 0.9856474 Hill's sphere radius = 234.9 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:50 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Earth (399) {source: DE441} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-1.786834409731047E-01 Y = 9.669827953774551E-01 Z =-5.109423915082682E-05 + VX=-1.720473858166942E-02 VY=-3.193533189307208E-03 VZ= 5.457174067040888E-09 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-1.786953886946605E-01 Y = 9.669805775731443E-01 Z =-5.109423538992340E-05 + VX=-1.720469949887746E-02 VY=-3.193743226004856E-03 VZ= 5.374519991317428E-09 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Enceladus.txt b/assets/jpl_horizon/bodies/Enceladus.txt new file mode 100644 index 0000000..77e5c52 --- /dev/null +++ b/assets/jpl_horizon/bodies/Enceladus.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Enceladus / (Saturn) 602 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 252.3 +- 0.6 Density (g/cm^3) = 1.606 +- 0.012 + Mass (10^19 kg) = 10.805 Geometric Albedo = 1.04 + GM (km^3/s^2) = 7.210367 V(1,0) = +2.2 + + SATELLITE ORBITAL DATA (mean elements referred to local Laplace plane): + Semi-major axis, a (km) = 238.04(10^3) Orbital period = 1.370218 d + Eccentricity, e = 0.0047 Rotational period = Synchronous + Inclination, i (deg) = 0.009 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:41 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Enceladus (602) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.462107070733344E+00 Y =-1.763590731315564E+00 Z =-3.465134777458668E-01 + VX=-4.799068161710644E-03 VY= 9.904458072213898E-03 VZ=-1.910803547584920E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.462103732792631E+00 Y =-1.763583858405023E+00 Z =-3.465148014677353E-01 + VX=-4.814191894040593E-03 VY= 9.889516719170488E-03 VZ=-1.901512359359666E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Europa.txt b/assets/jpl_horizon/bodies/Europa.txt new file mode 100644 index 0000000..a913762 --- /dev/null +++ b/assets/jpl_horizon/bodies/Europa.txt @@ -0,0 +1,114 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Mar 12, 2021 Europa / (Jupiter) 502 + + SATELLITE PHYSICAL PROPERTIES: + Mean radius (km) = 1560.8 +- 0.3 Density (g cm^-3)= 3.013 +- 0.005 + GM (km^3/s^2) = 3202.7121+- 0.0054 Geometric Albedo = 0.67 +/- 0.03 + + SATELLITE ORBIT (at J2000.0 epoch, 2000-Jan-1.5): + Semi-major axis, a (km) ~ 671,000 Orbital period ~ 3.55 d + Eccentricity, e ~ 0.00981 Rotational period = Synchronous + Inclination, i (deg) ~ 0.462 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:31 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Europa (502) {source: jup365_merged} +Center body name: Sun (10) {source: jup365_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.060479105966296E+00 Y = 4.971193788432235E+00 Z =-4.418907806556983E-02 + VX=-6.967074192246404E-03 VY= 9.896683771810605E-03 VZ= 4.296001484155991E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.060474264291992E+00 Y = 4.971200661324026E+00 Z =-4.418877980080166E-02 + VX=-6.976947895835117E-03 VY= 9.897242536020881E-03 VZ= 4.294023144406136E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Ganymede.txt b/assets/jpl_horizon/bodies/Ganymede.txt new file mode 100644 index 0000000..56faed5 --- /dev/null +++ b/assets/jpl_horizon/bodies/Ganymede.txt @@ -0,0 +1,114 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Mar 12, 2021 Ganymede / (Jupiter) 503 + + SATELLITE PHYSICAL PROPERTIES: + Mean radius (km) = 2631.2 +- 1.7 Density (g cm^-3)= 1.942 +- 0.005 + GM (km^3/s^2) = 9887.8328+- 0.0074 Geometric Albedo = 0.43 +- 0.02 + + SATELLITE ORBIT (at J2000.0 epoch, 2000-Jan-1.5): + Semi-major axis, a (km) ~ 1,070,000 Orbital period ~ 7.155 d + Eccentricity, e ~ 0.00146 Rotational period= Synchronous + Inclination, i (deg) ~ 0.207 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:32 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Ganymede (503) {source: jup365_merged} +Center body name: Sun (10) {source: jup365_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.062520398626604E+00 Y = 4.968458682597362E+00 Z =-4.429967587277176E-02 + VX=-4.841408463186764E-03 VY= 7.634290231598638E-03 VZ= 4.147177169244575E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.062517035324768E+00 Y = 4.968463984744183E+00 Z =-4.429938787030207E-02 + VX=-4.844900988782714E-03 VY= 7.635892259759473E-03 VZ= 4.147293801627869E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Iapetus.txt b/assets/jpl_horizon/bodies/Iapetus.txt new file mode 100644 index 0000000..9deba34 --- /dev/null +++ b/assets/jpl_horizon/bodies/Iapetus.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Iapetus / (Saturn) 608 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 734.5 +- 4.0 Density (g/cm^3)= 1.088 +- 0.018 + Mass (10^19 kg) = 180.59 Geometric Albedo= 0.6 + GM (km^3/s^2) = 120.52 +- 0.03 V(1,0) = +1.5 (.7-2.5) + + SATELLITE ORBITAL DATA (mean values with respect to local Laplace plane): + Semi-major axis, a (km)= 3560.84 (10^3) Orbital period = 79.33 d + Eccentricity, e = 0.0283 Rotational period = Synchronous + Inclination, i (deg) = 7.489 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:37 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Iapetus (608) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.454548058738080E+00 Y =-1.786906158368561E+00 Z =-3.394196336672040E-01 + VX= 2.477125925502744E-03 VY= 4.942920731685813E-03 VZ=-3.564738618756286E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.454549778973153E+00 Y =-1.786902725752121E+00 Z =-3.394198812278713E-01 + VX= 2.477151084385878E-03 VY= 4.943014616239762E-03 VZ=-3.565008602876317E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Io.txt b/assets/jpl_horizon/bodies/Io.txt new file mode 100644 index 0000000..f4c70c2 --- /dev/null +++ b/assets/jpl_horizon/bodies/Io.txt @@ -0,0 +1,114 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Mar 12, 2021 Io / (Jupiter) 501 + + SATELLITE PHYSICAL PROPERTIES: + Mean radius (km) = 1821.49 Density (g cm^-3) = 3.528 +- 0.006 + GM (km^3/s^2) = 5959.9155+- 0.004 Geometric Albedo = 0.63 +- 0.02 + + SATELLITE ORBIT (at J2000.0 epoch, 2000-Jan-1.5): + Semi-major axis, a (km)~ 422,000 Orbital period ~ 1.77 d + Eccentricity, e ~ 0.00472 Rotational period = Synchronous + Inclination, i (deg) ~ 0.0375 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:30 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Io (501) {source: jup365_merged} +Center body name: Sun (10) {source: jup365_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.053815818667817E+00 Y = 4.969715993299296E+00 Z =-4.437108516416628E-02 + VX=-1.329530996368361E-03 VY=-5.983335980023409E-03 VZ=-3.295420474951598E-05 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.053814902131768E+00 Y = 4.969711843495328E+00 Z =-4.437110776557460E-02 + VX=-1.310099171031782E-03 VY=-5.968091504155077E-03 VZ=-3.213765991234832E-05 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Jupiter.txt b/assets/jpl_horizon/bodies/Jupiter.txt new file mode 100644 index 0000000..ad62eaa --- /dev/null +++ b/assets/jpl_horizon/bodies/Jupiter.txt @@ -0,0 +1,125 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 12, 2021 Jupiter 599 + + PHYSICAL DATA (revised 2025-Jan-30): + Mass x 10^26 (kg) = 18.9819 Density (g/cm^3) = 1.3262 +- .0003 + Equat. radius (1 bar) = 71492+-4 km Polar radius (km) = 66854+-10 + Vol. Mean Radius (km) = 69911+-6 Flattening = 0.06487 + Geometric Albedo = 0.52 Rocky core mass (Mc/M)= 0.0261 + Sid. rot. period (III)= 9h 55m 29.711 s Sid. rot. rate (rad/s)= 0.00017585 + Mean solar day, hrs = ~9.9259 + GM (km^3/s^2) = 126686531.900 GM 1-sigma (km^3/s^2) = +- 1.2732 + Equ. grav, ge (m/s^2) = 24.79 Pol. grav, gp (m/s^2) = 28.34 + Vis. magnitude V(1,0) = -9.40 + Vis. mag. (opposition)= -2.70 Obliquity to orbit = 3.13 deg + Sidereal orbit period = 11.861982204 y Sidereal orbit period = 4332.589 d + Mean daily motion = 0.0831294 deg/d Mean orbit speed, km/s= 13.0697 + Atmos. temp. (1 bar) = 165+-5 K Escape speed, km/s = 59.5 + A_roche(ice)/Rp = 2.76 Hill's sphere rad. Rp = 740 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 56 46 51 + Maximum Planetary IR (W/m^2) 13.7 13.4 13.6 + Minimum Planetary IR (W/m^2) 13.7 13.4 13.6 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:54 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Jupiter (599) {source: jup365_merged} +Center body name: Sun (10) {source: jup365_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.056033545576702E+00 Y = 4.971452162023883E+00 Z =-4.427806378454757E-02 + VX=-7.476272400979211E-03 VY= 1.924466075080766E-03 VZ= 1.592575331437652E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.056028353720140E+00 Y = 4.971453498455673E+00 Z =-4.427795318902549E-02 + VX=-7.476274498134918E-03 VY= 1.924457475706055E-03 VZ= 1.592575690535828E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Mars.txt b/assets/jpl_horizon/bodies/Mars.txt new file mode 100644 index 0000000..1627ca3 --- /dev/null +++ b/assets/jpl_horizon/bodies/Mars.txt @@ -0,0 +1,126 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: June 02, 2025 Mars 499 / 4 + + PHYSICAL DATA (updated 2025-Jun-02): + Vol. mean radius (km) = 3389.92+-0.04 Density (g/cm^3) = 3.933(5+-4) + Mass x10^23 (kg) = 6.4171 Flattening, f = 1/169.779 + Volume (x10^10 km^3) = 16.318 Equatorial radius (km)= 3396.19 + Sidereal rot. period = 24.622962 hr Sid. rot. rate, rad/s = 0.0000708822 + Mean solar day (sol) = 88775.24415 s Polar gravity m/s^2 = 3.758 + Core radius (km) = ~1700 Equ. gravity m/s^2 = 3.71 + Geometric Albedo = 0.150 + + GM (km^3/s^2) = 42828.375662 Mass ratio (Sun/Mars) = 3098703.59 + GM 1-sigma (km^3/s^2) = +- 0.00028 Mass of atmosphere, kg= ~ 2.5 x 10^16 + Mean temperature (K) = 210 Atmos. pressure (bar) = 0.0056 + Obliquity to orbit = 25.19 deg Max. angular diam. = 17.9" + Mean sidereal orb per = 1.88081578 y Visual mag. V(1,0) = -1.52 + Mean sidereal orb per = 686.98 d Orbital speed, km/s = 24.13 + Hill's sphere rad. Rp = 319.8 Escape speed, km/s = 5.027 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 717 493 589 + Maximum Planetary IR (W/m^2) 470 315 390 + Minimum Planetary IR (W/m^2) 30 30 30 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:53 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Mars (499) {source: mar099} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-5.216858665681381E-01 Y = 1.525234576802456E+00 Z = 4.475559803760917E-02 + VX=-1.271183490340250E-02 VY=-3.338839586395265E-03 VZ= 2.417788175776839E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-5.216946942223875E-01 Y = 1.525232258137904E+00 Z = 4.475576593880412E-02 + VX=-1.271180933472031E-02 VY=-3.338914323653169E-03 VZ= 2.417766240577524E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Mercury.txt b/assets/jpl_horizon/bodies/Mercury.txt new file mode 100644 index 0000000..0df283f --- /dev/null +++ b/assets/jpl_horizon/bodies/Mercury.txt @@ -0,0 +1,124 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 12, 2021 Mercury 199 / 1 + + PHYSICAL DATA (updated 2024-Mar-04): + Vol. Mean Radius (km) = 2439.4+-0.1 Density (g cm^-3) = 5.427 + Mass x10^23 (kg) = 3.302 Volume (x10^10 km^3) = 6.085 + Sidereal rot. period = 58.6463 d Sid. rot. rate (rad/s)= 0.00000124001 + Mean solar day = 175.9421 d Core radius (km) = ~1600 + Geometric Albedo = 0.106 Surface emissivity = 0.77+-0.06 + GM (km^3/s^2) = 22031.86855 Equatorial radius, Re = 2440.53 km + GM 1-sigma (km^3/s^2) = Mass ratio (Sun/plnt) = 6023682 + Mom. of Inertia = 0.33 Equ. gravity m/s^2 = 3.701 + Atmos. pressure (bar) = < 5x10^-15 Max. angular diam. = 11.0" + Mean Temperature (K) = 440 Visual mag. V(1,0) = -0.42 + Obliquity to orbit[1] = 2.11' +/- 0.1' Hill's sphere rad. Rp = 94.4 + Sidereal orb. per. = 0.2408467 y Mean Orbit vel. km/s = 47.362 + Sidereal orb. per. = 87.969257 d Escape vel. km/s = 4.435 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 14462 6278 9126 + Maximum Planetary IR (W/m^2) 12700 5500 8000 + Minimum Planetary IR (W/m^2) 6 6 6 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:24 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Mercury (199) {source: DE441} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-3.873030085256687E-01 Y =-1.617241946342014E-01 Z = 2.230772540124238E-02 + VX= 5.024430196457658E-03 VY=-2.474345331076241E-02 VZ=-2.482923861184285E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-3.872995189658449E-01 Y =-1.617413774324715E-01 Z = 2.230600112712438E-02 + VX= 5.025502090388155E-03 VY=-2.474300570104969E-02 VZ=-2.482985597610005E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Mimas.txt b/assets/jpl_horizon/bodies/Mimas.txt new file mode 100644 index 0000000..c47d32b --- /dev/null +++ b/assets/jpl_horizon/bodies/Mimas.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Mimas / (Saturn) 601 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 198.8 +- 1.5 Density (g/cm^3) = 1.152 +- 0.027 + Mass (10^19 kg) = 3.75 Geometric Albedo = 0.6 + GM (km^3/s^2) = 2.503489 V(1,0) = +3.3 + + SATELLITE ORBITAL DATA (mean elements referred to local Laplace plane): + Semi-major axis, a (km) = 185.54(10^3) Orbital period = 0.9424218 d + Eccentricity, e = 0.0196 Rotational period = Synchronous + Inclination, i (deg) = 1.572 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:43 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Mimas (601) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.462113317387443E+00 Y =-1.764120396234732E+00 Z =-3.462575454806998E-01 + VX=-3.600569225193193E-03 VY= 1.195945377622506E-02 VZ=-3.321658418910402E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.462110805168413E+00 Y =-1.764112096667343E+00 Z =-3.462598478664664E-01 + VX=-3.634605921905340E-03 VY= 1.194327556531391E-02 VZ=-3.309200303182580E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Miranda.txt b/assets/jpl_horizon/bodies/Miranda.txt new file mode 100644 index 0000000..1646f12 --- /dev/null +++ b/assets/jpl_horizon/bodies/Miranda.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 29, 2025 Miranda / (Uranus) 705 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 240x234.2x232.9 Density (g cm^-3) = 1.18 +- 0.05 + GM (km^3/s^2) = 4.3 +- 0.2 Geometric Albedo = 0.27 + V(1,0) = +3.6 + + SATELLITE ORBITAL DATA (mean elements referred to equatorial plane & IAU pole) + Semi-major axis, a (km) = 129.8 (10^3) Orbital period = 1.413 d + Eccentricity, e = 0.0027 Rotational period = Synchronous + Inclination, i (deg) = 175.78 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:49 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Miranda (705) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110338075481133E+01 Y = 1.609470886437212E+01 Z =-8.339848717695617E-02 + VX= 2.787135511093017E-04 VY= 1.302160355796409E-03 VZ= 1.366210183434322E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110338094954377E+01 Y = 1.609470976757570E+01 Z =-8.339754224366069E-02 + VX= 2.821101872080506E-04 VY= 1.299067156991778E-03 VZ= 1.355195633050134E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Moon.txt b/assets/jpl_horizon/bodies/Moon.txt new file mode 100644 index 0000000..8149d9d --- /dev/null +++ b/assets/jpl_horizon/bodies/Moon.txt @@ -0,0 +1,125 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: July 31, 2013 Moon / (Earth) 301 + + GEOPHYSICAL DATA (updated 2018-Aug-15): + Vol. mean radius, km = 1737.53+-0.03 Mass, x10^22 kg = 7.349 + Radius (gravity), km = 1738.0 Surface emissivity = 0.92 + Radius (IAU), km = 1737.4 GM, km^3/s^2 = 4902.800066 + Density, g/cm^3 = 3.3437 GM 1-sigma, km^3/s^2 = +-0.0001 + V(1,0) = +0.21 Surface accel., m/s^2 = 1.62 + Earth/Moon mass ratio = 81.3005690769 Farside crust. thick. = ~80 - 90 km + Mean crustal density = 2.97+-.07 g/cm^3 Nearside crust. thick.= 58+-8 km + Heat flow, Apollo 15 = 3.1+-.6 mW/m^2 Mean angular diameter = 31'05.2" + Heat flow, Apollo 17 = 2.2+-.5 mW/m^2 Sid. rot. rate, rad/s = 0.0000026617 + Geometric Albedo = 0.12 Mean solar day = 29.5306 d + Obliquity to orbit = 6.67 deg Orbit period = 27.321582 d + Semi-major axis, a = 384400 km Eccentricity = 0.05490 + Mean motion, rad/s = 2.6616995x10^-6 Inclination = 5.145 deg + Apsidal period = 3231.50 d Nodal period = 6798.38 d + Perihelion Aphelion Mean + Solar Constant (W/m^2) 1414+-7 1323+-7 1368+-7 + Maximum Planetary IR (W/m^2) 1314 1226 1268 + Minimum Planetary IR (W/m^2) 5.2 5.2 5.2 +******************************************************************************** + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:51 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Moon (301) {source: DE441} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-1.776670337217189E-01 Y = 9.646511868801392E-01 Z =-2.560710414773878E-04 + VX=-1.666610342674751E-02 VY=-2.935662211368250E-03 VZ= 2.214641479437884E-05 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-1.776786074043311E-01 Y = 9.646491481829632E-01 Z =-2.560556593596988E-04 + VX=-1.666610249864482E-02 VY=-2.935785656373790E-03 VZ= 2.215408427478499E-05 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Neptune.txt b/assets/jpl_horizon/bodies/Neptune.txt new file mode 100644 index 0000000..b65f4a6 --- /dev/null +++ b/assets/jpl_horizon/bodies/Neptune.txt @@ -0,0 +1,125 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 22, 2021 Neptune 899 + + PHYSICAL DATA (update 2021-May-03): + Mass x10^24 (kg) = 102.409 Density (g/cm^3) = 1.638 + Equat. radius (1 bar) = 24766+-15 km Volume, 10^10 km^3 = 6254 + Vol. mean radius (km) = 24624+-21 Polar radius (km) = 24342+-30 + Geometric Albedo = 0.41 Flattening = 0.0171 + Sid. rot. period (III)= 16.11+-0.01 hr Sid. rot. rate (rad/s) = 0.000108338 + Mean solar day, h =~16.11 h + GM (km^3/s^2) = 6835099.97 GM 1-sigma (km^3/s^2) = +-10 + Equ. grav, ge (m/s^2) = 11.15 Pol. grav, gp (m/s^2) = 11.41+-0.03 + Visual magnitude V(1,0)= -6.87 + Vis. mag. (opposition)= +7.84 Obliquity to orbit = 28.32 deg + Sidereal orbit period = 164.788501027 y Sidereal orbit period = 60189 d + Mean daily motion = 0.006020076dg/d Mean orbit velocity = 5.43 km/s + Atmos. temp. (1 bar) = 72+-2 K Escape speed (1 bar) = 23.5 km/s + Aroche(ice)/Rp = 2.98 Hill's sphere rad., Rp = 4700 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 1.54 1.49 1.51 + Maximum Planetary IR (W/m^2) 0.52 0.52 0.52 + Minimum Planetary IR (W/m^2) 0.52 0.52 0.52 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:58 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Neptune (899) {source: nep097_merged} +Center body name: Sun (10) {source: nep097_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 2.987992735576156E+01 Y =-6.341879950443392E-01 Z =-6.754997950415415E-01 + VX= 3.941595250081164E-05 VY= 3.160389775728832E-03 VZ=-6.636996572427530E-05 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 2.987992738313355E+01 Y =-6.341858003292957E-01 Z =-6.754998411317725E-01 + VX= 3.941539715732043E-05 VY= 3.160389549672231E-03 VZ=-6.636990015457822E-05 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Oberon.txt b/assets/jpl_horizon/bodies/Oberon.txt new file mode 100644 index 0000000..e486bd8 --- /dev/null +++ b/assets/jpl_horizon/bodies/Oberon.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 29, 2025 Oberon / (Uranus) 704 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 761.4 +- 2.6 Density (g cm^-3) = 1.66 +- 0.05 + GM (km^3/s^2) = 205.34 +- 5.8 Geometric Albedo = 0.24 + V(1,0) = +1.23 + + SATELLITE ORBITAL DATA (mean elements referred to equatorial plane & IAU pole) + Semi-major axis, a (km) = 582.6 (10^3) Orbital period = 13.463 d + Eccentricity, e = 0.0008 Rotational period = Synchronous + Inclination, i (deg) = 179.90 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:45 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Oberon (704) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110301190463219E+01 Y = 1.609515778477002E+01 Z =-8.040210462613612E-02 + VX=-1.519780917379062E-03 VY= 1.720169702110850E-03 VZ= 3.926675849694972E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110301084926093E+01 Y = 1.609515897929689E+01 Z =-8.040183213898029E-02 + VX=-1.519688343927354E-03 VY= 1.720067705450287E-03 VZ= 3.920954185698925E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Phobos.txt b/assets/jpl_horizon/bodies/Phobos.txt new file mode 100644 index 0000000..e7b298f --- /dev/null +++ b/assets/jpl_horizon/bodies/Phobos.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jun 02, 2025 Phobos / (Mars) 401 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 13.1 x11.1 x9.3 Density (g cm^-3) = 1.90 +- 0.08 + Mass (10^20 kg ) = 1.08 (10^-4) Geometric Albedo = 0.06 + (+- 0.1) V(1,0) = +11.8 + + SATELLITE ORBITAL DATA: + Semi-major axis, a (km) = 9.3772(10^3) Orbital period = 0.319 d + Eccentricity, e = 0.0151 Rotational period = Synchronous + Inclination, i (deg) = 1.082 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:27 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Phobos (401) {source: mar099} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X =-5.216607506283159E-01 Y = 1.525290094552813E+00 Z = 4.474552444674667E-02 + VX=-1.371531677510715E-02 VY=-2.797359927923991E-03 VZ= 7.604209362929195E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X =-5.216702775783473E-01 Y = 1.525288146474805E+00 Z = 4.474605348954465E-02 + VX=-1.372226672058481E-02 VY=-2.813122639161171E-03 VZ= 7.632054629505637E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Pluto.txt b/assets/jpl_horizon/bodies/Pluto.txt new file mode 100644 index 0000000..95e23b6 --- /dev/null +++ b/assets/jpl_horizon/bodies/Pluto.txt @@ -0,0 +1,124 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Apr 03, 2024 134340 Pluto 999 + + Pre-computed solution PLU060/DE440. Fit to post New Horizons encounter and + Gaia data through 2023. For discussion, see ... + + M. Brozovic, R. A. Jacobson (2024) "Post-New Horizons orbits and masses + for the satellites of Pluto". AJ (in press) + + PHYSICAL DATA (updated 2021-Jun-07; Mc= Charon mass, radius is IAU 2015): + Mass x10^22 (kg) = 1.307+-0.018 Volume, 10^10 km^3 = 0.697 + GM (planet) km^3/s^2 = 869.326 Density (R=1195 km) = 1.86 g/cm^3 + GM 1-sigma, km^3/s^2 = 0.4 Surface gravity = 0.611 m/s^2 + Vol. mean radius (km) = 1188.3+-1.6 Mass ratio (Mc/Mp) = 0.122 + Sidereal rot. period = 153.29335198 h Sid. rot. rat, rad/s = 0.0000113856 + Mean solar day, h = 153.2820 Mean orbit velocity = 4.67 km/s + Sidereal orbit period = 249.58932 yr Escape speed, km/s = 1.21 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 1.56 0.56 0.88 + Maximum Planetary IR (W/m^2) 0.8 0.3 0.5 + Minimum Planetary IR (W/m^2) 0.8 0.3 0.5 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:59 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Pluto (999) {source: plu060_merged} +Center body name: Sun (10) {source: plu060_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.822881632666475E+01 Y =-3.000801293901950E+01 Z =-2.059815785829023E+00 + VX= 2.758977855246929E-03 VY= 9.457264850164455E-04 VZ=-8.880815395819214E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.822881824262399E+01 Y =-3.000801228226284E+01 Z =-2.059816402553139E+00 + VX= 2.758984750779286E-03 VY= 9.457327203036255E-04 VZ=-8.880839212592113E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Rhea.txt b/assets/jpl_horizon/bodies/Rhea.txt new file mode 100644 index 0000000..53c46be --- /dev/null +++ b/assets/jpl_horizon/bodies/Rhea.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Rhea / (Saturn) 605 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 764.5 +- 2 Density (g/cm^3) = 1.233 +- 0.010 + Mass (10^19 kg) = 230.9 Geometric Albedo = 0.6 + GM (km^3/s^2) = 153.94 +- 0.16 V(1,0) = +0.1 + + SATELLITE ORBITAL DATA (mean values referred to local Laplace plane): + Semi-major axis, a (km) = 527.07(10^3) Orbital period = 4.518 d + Eccentricity, e = 0.001 Rotational period = Synchronous + Inclination, i (deg) = 0.331 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:36 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Rhea (605) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.463441058546145E+00 Y =-1.766997606737125E+00 Z =-3.448366300385151E-01 + VX= 4.307393238751094E-03 VY= 8.273257376182423E-03 VZ=-1.932435874857194E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.463444048680545E+00 Y =-1.766991860305545E+00 Z =-3.448379724938126E-01 + VX= 4.304193275713166E-03 VY= 8.276465140546280E-03 VZ=-1.933835100794230E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Saturn.txt b/assets/jpl_horizon/bodies/Saturn.txt new file mode 100644 index 0000000..478f7c2 --- /dev/null +++ b/assets/jpl_horizon/bodies/Saturn.txt @@ -0,0 +1,125 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: January 26, 2022 Saturn 699 + + PHYSICAL DATA: + Mass x10^26 (kg) = 5.6834 Density (g/cm^3) = 0.687+-.001 + Equat. radius (1 bar) = 60268+-4 km Polar radius (km) = 54364+-10 + Vol. Mean Radius (km) = 58232+-6 Flattening = 0.09796 + Geometric Albedo = 0.47 Rocky core mass (Mc/M) = 0.1027 + Sid. rot. period (III)= 10h 39m 22.4s Sid. rot. rate (rad/s) = 0.000163785 + Mean solar day, hrs =~10.656 + GM (km^3/s^2) = 37931206.234 GM 1-sigma (km^3/s^2) = +- 98 + Equ. grav, ge (m/s^2) = 10.44 Pol. grav, gp (m/s^2) = 12.14+-0.01 + Vis. magnitude V(1,0) = -8.88 + Vis. mag. (opposition)= +0.67 Obliquity to orbit = 26.73 deg + Sidereal orbit period = 29.447498 yr Sidereal orbit period = 10755.698 d + Mean daily motion = 0.0334979 deg/d Mean orbit velocity = 9.68 km/s + Atmos. temp. (1 bar) = 134+-4 K Escape speed, km/s = 35.5 + Aroche(ice)/Rp = 2.71 Hill's sphere rad. Rp = 1100 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 16.8 13.6 15.1 + Maximum Planetary IR (W/m^2) 4.7 4.5 4.6 + Minimum Planetary IR (W/m^2) 4.7 4.5 4.6 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:55 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Saturn (699) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.461067271500818E+00 Y =-1.764614720843175E+00 Z =-3.458764004169705E-01 + VX= 7.093807804551229E-04 VY= 5.475097536527790E-03 VZ=-1.232345969963958E-04 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.461067764125684E+00 Y =-1.764610918691946E+00 Z =-3.458764859965446E-01 + VX= 7.093788338554797E-04 VY= 5.475098004312488E-03 VZ=-1.232345764512067E-04 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Sun.txt b/assets/jpl_horizon/bodies/Sun.txt new file mode 100644 index 0000000..52e5d16 --- /dev/null +++ b/assets/jpl_horizon/bodies/Sun.txt @@ -0,0 +1,124 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: July 31, 2013 Sun 10 + + PHYSICAL PROPERTIES (updated 2024-Oct-30): + GM, km^3/s^2 = 132712440041.93938 Mass, 10^24 kg = ~1988410 + Vol. mean radius, km = 695700 Volume, 10^12 km^3 = 1412000 + Solar radius (IAU2015)= 695700 km Mean density, g/cm^3 = 1.408 + Radius (photosphere) = 696500 km Angular diam at 1 AU = 1919.3" + Photosphere temp., K = 6600 (bottom) Photosphere temp., K = 4400(top) + Photospheric depth = ~500 km Chromospheric depth = ~2500 km + Flatness, f = 0.00005 Adopted sid. rot. per.= 25.38 d + Surface gravity = 274.0 m/s^2 Escape speed, km/s = 617.7 + Pole (RA,DEC), deg. = (286.13, 63.87) Obliquity to ecliptic = 7.25 deg. + Solar constant (1 AU) = 1367.6 W/m^2 Luminosity, 10^24 J/s = 382.8 + Mass-energy conv rate = 4.260 x 10^9 kg/s Effective temp, K = 5772 + Sunspot cycle = 11.4 yr Cycle 24 sunspot min. = 2008 A.D. + + Motion relative to nearby stars = apex : R.A.= 271 deg.; DEC.= +30 deg. + speed: 19.4 km/s (0.0112 au/day) + Motion relative to 2.73K BB/CBR = apex : l= 264.7 +- 0.8; b= 48.2 +- 0.5 deg. + speed: 369 +-11 km/s +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:49 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Sun (10) {source: DE441} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 0.000000000000000E+00 Y = 0.000000000000000E+00 Z = 0.000000000000000E+00 + VX= 0.000000000000000E+00 VY= 0.000000000000000E+00 VZ= 0.000000000000000E+00 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 0.000000000000000E+00 Y = 0.000000000000000E+00 Z = 0.000000000000000E+00 + VX= 0.000000000000000E+00 VY= 0.000000000000000E+00 VZ= 0.000000000000000E+00 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Tethys.txt b/assets/jpl_horizon/bodies/Tethys.txt new file mode 100644 index 0000000..350667a --- /dev/null +++ b/assets/jpl_horizon/bodies/Tethys.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Tethys / (Saturn) 603 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 536.3 +- 1.5 Density (g/cm^3) = 0.956+- 0.008 + Mass (10^19 kg) = 61.76 +- 0.11 Geometric Albedo = 0.80 + GM (km^3/s^2) = 41.21 +- 0.007 V(1,0) = +0.7 + + SATELLITE ORBITAL DATA (mean values with respect to local Laplace plane): + Semi-major axis, a (km)= 294.670(10^3) Orbital period = 1.888 d + Eccentricity, e = 0.0001 Rotational period = Synchronous + Inclination, i (deg) = 1.091 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:40 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Tethys (603) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.463028141754283E+00 Y =-1.764725184828637E+00 Z =-3.460263238634043E-01 + VX= 8.124741088132637E-04 VY= 1.132977234261396E-02 VZ=-3.072248079372077E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.463028700733389E+00 Y =-1.764717316639481E+00 Z =-3.460284569666105E-01 + VX= 7.973856311297915E-04 VY= 1.133060721568177E-02 VZ=-3.071086528742641E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Titan.txt b/assets/jpl_horizon/bodies/Titan.txt new file mode 100644 index 0000000..1ef3572 --- /dev/null +++ b/assets/jpl_horizon/bodies/Titan.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 26, 2022 Titan / (Saturn) 606 + http://ssd.jpl.nasa.gov/?sat_phys_par + http://ssd.jpl.nasa.gov/?sat_elem + + SATELLITE PHYSICAL PROPERTIES: + Mean Radius (km) = 2575.5 +- 2.0 Density (g/cm^3) = 1.880 +- 0.004 + Mass (10^19 kg) = 13455.3 Geometric Albedo = 0.2 + GM (km^3/s^2) = 8978.14 +- 0.06 V(1,0) = -1.2 + + SATELLITE ORBITAL DATA: + Semi-major axis, a (km)= 1221.87 (10^3) Orbital period = 15.945421 d + Eccentricity, e = 0.0288 Rotational period = + Inclination, i (deg) = 0.28 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:35 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Titan (606) {source: sat441l} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 9.468440328490537E+00 Y =-1.762284834421733E+00 Z =-3.478122131916790E-01 + VX=-4.611400435334967E-04 VY= 8.260265884102586E-03 VZ=-1.443082816825538E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 9.468440007956742E+00 Y =-1.762279098219692E+00 Z =-3.478132152545299E-01 + VX=-4.619972666944876E-04 VY= 8.259995958078317E-03 VZ=-1.442858176376882E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Titania.txt b/assets/jpl_horizon/bodies/Titania.txt new file mode 100644 index 0000000..40aa09c --- /dev/null +++ b/assets/jpl_horizon/bodies/Titania.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 29, 2025 Titania / (Uranus) 703 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 788.9 +- 1.8 Density (g cm^-3) = 1.65 +- 0.03 + GM (km^3/s^2) = 222.8 +- 4.1 Geometric Albedo = 0.27 + V(1,0) = +1.02 + + SATELLITE ORBITAL DATA (mean elements referred to equatorial plane & IAU pole) + Semi-major axis, a (km) = 435.8 (10^3) Orbital period = 8.706 d + Eccentricity, e = 0.0022 Rotational period = Synchronous + Inclination, i (deg) = 179.90 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:44 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Titania (703) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110510884778205E+01 Y = 1.609382177197045E+01 Z =-8.661833178512783E-02 + VX=-5.032495225759578E-03 VY= 2.280002002691279E-03 VZ=-1.088327315015861E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110510535280710E+01 Y = 1.609382335538846E+01 Z =-8.661908726294103E-02 + VX=-5.033032537876168E-03 VY= 2.280241869921879E-03 VZ=-1.087448734649130E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Triton.txt b/assets/jpl_horizon/bodies/Triton.txt new file mode 100644 index 0000000..ecea89f --- /dev/null +++ b/assets/jpl_horizon/bodies/Triton.txt @@ -0,0 +1,117 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Apr 22, 2021 Triton / (Neptune) 801 + + SATELLITE PHYSICAL PROPERTIES: + Mean radius (km) = 1352.6 +- 2.4 Mean dens (g cm^-3)= 2.065 +-0.011 + GM (km^3/s^2) = 1428.495 +- 0.62 Geometric Albedo = 0.7 + V(1,0) = -1.24 + + SATELLITE ORBITAL DATA (mean values wrt Laplace plane): + Semi-major axis, a (km) = 354800 Orbital period = 5.876994 d + Eccentricity, e = 0.000 Rotational period = Synchronous + Inclination, i (deg) = 157.3 + + Fit to all reported measurements through 2020 (Voyager 2, ground, HST) +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:50 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Triton (801) {source: nep097_merged} +Center body name: Sun (10) {source: nep097_merged} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 2.987802053077272E+01 Y =-6.355569689698364E-01 Z =-6.751627943073906E-01 + VX=-6.787804924900204E-04 VY= 4.636375429506899E-03 VZ= 1.865945736548040E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 2.987802005992279E+01 Y =-6.355537488875286E-01 Z =-6.751614986047274E-01 + VX=-6.772672129266950E-04 VY= 4.637461481841197E-03 VZ= 1.865677756098451E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Umbriel.txt b/assets/jpl_horizon/bodies/Umbriel.txt new file mode 100644 index 0000000..9b336a4 --- /dev/null +++ b/assets/jpl_horizon/bodies/Umbriel.txt @@ -0,0 +1,115 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: Jan 29, 2025 Umbriel / (Uranus) 702 + + SATELLITE PHYSICAL PROPERTIES: + Radius (km) = 584.7 +- 2.8 Density (g cm^-3) = 1.52 +- 0.04 + GM (km^3/s^2) = 85.40 +- 1.9 Geometric Albedo = 0.18 + V(1,0) = +2.10 + + SATELLITE ORBITAL DATA (mean elements referred to equatorial plane & IAU pole): + Semi-major axis, a (km) = 266.0 (10^3) Orbital period = 4.144 d + Eccentricity, e = 0.0050 Rotational period = Synchronous + Inclination, i (deg) = 179.64 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:48 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Umbriel (702) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110253678329407E+01 Y = 1.609490555702174E+01 Z =-8.286998450094619E-02 + VX=-1.219602563560983E-03 VY= 1.849034126664038E-03 VZ= 1.801100761916168E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110253593696041E+01 Y = 1.609490684083643E+01 Z =-8.286873448230965E-02 + VX=-1.217838766094139E-03 VY= 1.848352214682835E-03 VZ= 1.798952584612123E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Uranus.txt b/assets/jpl_horizon/bodies/Uranus.txt new file mode 100644 index 0000000..90061e8 --- /dev/null +++ b/assets/jpl_horizon/bodies/Uranus.txt @@ -0,0 +1,125 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: January 29, 2025 Uranus 799 + + PHYSICAL DATA: + Mass x10^24 (kg) = 86.813 Density (g/cm^3) = 1.271 + Equat. radius (1 bar) = 25559+-4 km Polar radius (km) = 24973+-20 + Vol. Mean Radius (km) = 25362+-12 Flattening = 0.02293 + Geometric Albedo = 0.51 + Sid. rot. period (III)= 17.24+-0.01 h Sid. rot. rate (rad/s) = -0.000101237 + Mean solar day, h =~17.24 Rocky core mass (Mc/M) = 0.0012 + GM (km^3/s^2) = 5793950.6103 GM 1-sigma (km^3/s^2) = +-4.3 + Equ. grav, ge (m/s^2) = 8.87 Pol. grav, gp (m/s^2) = 9.19+-0.02 + Visual magnitude V(1,0)= -7.11 + Vis. mag. (opposition)= +5.52 Obliquity to orbit = 97.77 deg + Sidereal orbit period = 84.0120465 y Sidereal orbit period = 30685.4 d + Mean daily motion = 0.01176904 dg/d Mean orbit velocity = 6.8 km/s + Atmos. temp. (1 bar) = 76+-2 K Escape speed, km/s = 21.3 + Aroche(ice)/Rp = 2.20 Hill's sphere rad., Rp = 2700 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 4.09 3.39 3.71 + Maximum Planetary IR (W/m^2) 0.72 0.55 0.63 + Minimum Planetary IR (W/m^2) 0.72 0.55 0.63 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 15:51:56 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Uranus (799) {source: ura183_merged} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 1.110362881512566E+01 Y = 1.609448391218202E+01 Z =-8.419833258524990E-02 + VX=-3.273728238819980E-03 VY= 2.053528328895527E-03 VZ= 5.008589052969062E-05 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 1.110362654170318E+01 Y = 1.609448533824320E+01 Z =-8.419829780338954E-02 + VX=-3.273728502372206E-03 VY= 2.053527864185684E-03 VZ= 5.008586714126605E-05 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/bodies/Venus.txt b/assets/jpl_horizon/bodies/Venus.txt new file mode 100644 index 0000000..7ddb023 --- /dev/null +++ b/assets/jpl_horizon/bodies/Venus.txt @@ -0,0 +1,124 @@ +API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 12, 2021 Venus 299 / 2 + + PHYSICAL DATA (updated 2020-Oct-19): + Vol. Mean Radius (km) = 6051.84+-0.01 Density (g/cm^3) = 5.204 + Mass x10^23 (kg) = 48.685 Volume (x10^10 km^3) = 92.843 + Sidereal rot. period = 243.018484 d Sid. Rot. Rate (rad/s)= -0.00000029924 + Mean solar day = 116.7490 d Equ. gravity m/s^2 = 8.870 + Mom. of Inertia = 0.33 Core radius (km) = ~3200 + Geometric Albedo = 0.65 Potential Love # k2 = ~0.25 + GM (km^3/s^2) = 324858.592 Equatorial Radius, Re = 6051.893 km + GM 1-sigma (km^3/s^2) = +-0.006 Mass ratio (Sun/Venus)= 408523.72 + Atmos. pressure (bar) = 90 Max. angular diam. = 60.2" + Mean Temperature (K) = 735 Visual mag. V(1,0) = -4.40 + Obliquity to orbit = 177.3 deg Hill's sphere rad.,Rp = 167.1 + Sidereal orb. per., y = 0.61519726 Orbit speed, km/s = 35.021 + Sidereal orb. per., d = 224.70079922 Escape speed, km/s = 10.361 + Perihelion Aphelion Mean + Solar Constant (W/m^2) 2759 2614 2650 + Maximum Planetary IR (W/m^2) 153 153 153 + Minimum Planetary IR (W/m^2) 153 153 153 +******************************************************************************* + + +******************************************************************************* +Ephemeris / API_USER Thu Aug 14 16:19:26 2025 Pasadena, USA / Horizons +******************************************************************************* +Target body name: Venus (299) {source: DE441} +Center body name: Sun (10) {source: DE441} +Center-site name: BODY CENTER +******************************************************************************* +Start time : A.D. 2025-Jan-01 00:00:00.0000 TDB +Stop time : A.D. 2025-Jan-01 00:01:00.0000 TDB +Step-size : 1 minutes +******************************************************************************* +Center geodetic : 0.0, 0.0, 0.0 {E-lon(deg),Lat(deg),Alt(km)} +Center cylindric: 0.0, 0.0, 0.0 {E-lon(deg),Dxy(km),Dz(km)} +Center radii : 695700.0, 695700.0, 695700.0 km {Equator_a, b, pole_c} +Output units : AU-D +Calendar mode : Mixed Julian/Gregorian +Output type : GEOMETRIC cartesian states +Output format : 2 (position and velocity) +Reference frame : Ecliptic of J2000.0 +******************************************************************************* +JDTDB + X Y Z + VX VY VZ +******************************************************************************* +$$SOE +2460676.500000000 = A.D. 2025-Jan-01 00:00:00.0000 TDB + X = 4.534187654737982E-01 Y = 5.622160792960551E-01 Z =-1.844136025242647E-02 + VX=-1.580627428004959E-02 VY= 1.261006264179427E-02 VZ= 1.085217883057661E-03 +2460676.500694444 = A.D. 2025-Jan-01 00:01:00.0000 TDB + X = 4.534077888086579E-01 Y = 5.622248361776391E-01 Z =-1.844060662540785E-02 + VX=-1.580652132279067E-02 VY= 1.260975631877725E-02 VZ= 1.085227930639264E-03 +$$EOE +******************************************************************************* + +TIME + + Barycentric Dynamical Time ("TDB" or T_eph) output was requested. This +continuous coordinate time is equivalent to the relativistic proper time +of a clock at rest in a reference frame co-moving with the solar system +barycenter but outside the system's gravity well. It is the independent +variable in the solar system relativistic equations of motion. + + TDB runs at a uniform rate of one SI second per second and is independent +of irregularities in Earth's rotation. + +CALENDAR SYSTEM + + Mixed calendar mode was active such that calendar dates after AD 1582-Oct-15 +(if any) are in the modern Gregorian system. Dates prior to 1582-Oct-5 (if any) +are in the Julian calendar system, which is automatically extended for dates +prior to its adoption on 45-Jan-1 BC. The Julian calendar is useful for +matching historical dates. The Gregorian calendar more accurately corresponds +to the Earth's orbital motion and seasons. A "Gregorian-only" calendar mode is +available if such physical events are the primary interest. + +REFERENCE FRAME AND COORDINATES + + Ecliptic at the standard reference epoch + + Reference epoch: J2000.0 + X-Y plane: adopted Earth orbital plane at the reference epoch + Note: IAU76 obliquity of 84381.448 arcseconds wrt ICRF X-Y plane + X-axis : ICRF + Z-axis : perpendicular to the X-Y plane in the directional (+ or -) sense + of Earth's north pole at the reference epoch. + + Symbol meaning [1 au= 149597870.700 km, 1 day= 86400.0 s]: + + JDTDB Julian Day Number, Barycentric Dynamical Time + X X-component of position vector (au) + Y Y-component of position vector (au) + Z Z-component of position vector (au) + VX X-component of velocity vector (au/day) + VY Y-component of velocity vector (au/day) + VZ Z-component of velocity vector (au/day) + +ABERRATIONS AND CORRECTIONS + + Geometric state vectors have NO corrections or aberrations applied. + +Computations by ... + + Solar System Dynamics Group, Horizons On-Line Ephemeris System + 4800 Oak Grove Drive, Jet Propulsion Laboratory + Pasadena, CA 91109 USA + + General site: https://ssd.jpl.nasa.gov/ + Mailing list: https://ssd.jpl.nasa.gov/email_list.html + System news : https://ssd.jpl.nasa.gov/horizons/news.html + User Guide : https://ssd.jpl.nasa.gov/horizons/manual.html + Connect : browser https://ssd.jpl.nasa.gov/horizons/app.html#/x + API https://ssd-api.jpl.nasa.gov/doc/horizons.html + command-line telnet ssd.jpl.nasa.gov 6775 + e-mail/batch https://ssd.jpl.nasa.gov/ftp/ssd/horizons_batch.txt + scripts https://ssd.jpl.nasa.gov/ftp/ssd/SCRIPTS + Author : Jon.D.Giorgini@jpl.nasa.gov +******************************************************************************* diff --git a/assets/jpl_horizon/initial_state.ron b/assets/jpl_horizon/initial_state.ron new file mode 100644 index 0000000..c3adaed --- /dev/null +++ b/assets/jpl_horizon/initial_state.ron @@ -0,0 +1,219 @@ +// mass kg f64 +// radius km f64 +// position au f64 +// velocity au/day f64 + +{ + bodies: [ + { + name: "Sun", + mass: 1.98841e30, + radius: 695700.0, + position: [0.0, 0.0, 0.0], + velocity: [0.0, 0.0, 0.0], + }, + { + name: "Mercury", + mass: 3.302e23, + radius: 2439.4, + position: [-3.873030085256687e-01, -1.617241946342014e-01, 2.230772540124238e-02], + velocity: [5.024430196457658e-03, -2.474345331076241e-02, -2.482923861184285e-03], + }, + { + name: "Venus", + mass: 4.8685e24, + radius: 6051.84, + position: [4.534187654737982e-01, 5.622160792960551e-01, -1.844136025242647e-02], + velocity: [-1.580627428004959e-02, 1.261006264179427e-02, 1.085217883057661e-03], + }, + { + name: "Earth", + mass: 5.97219e24, + radius: 6371.01, + position: [-1.786834409731047e-01, 9.669827953774551e-01, -5.109423915082682e-05], + velocity: [-1.720473858166942e-02, -3.193533189307208e-03, 5.457174067040888e-09], + }, + { + name: "Mars", + mass: 6.4171e23, + radius: 3389.92, + position: [-5.216858665681381e-01, 1.525234576802456e+00, 4.475559803760917e-02], + velocity: [-1.271183490340250e-02, -3.338839586395265e-03, 2.417788175776839e-04], + }, + { + name: "Jupiter", + mass: 1.89819e27, + radius: 69911.0, + position: [1.056033545576702e+00, 4.971452162023883e+00, -4.427806378454757e-02], + velocity: [-7.476272400979211e-03, 1.924466075080766e-03, 1.592575331437652e-04], + }, + { + name: "Saturn", + mass: 5.6834e26, + radius: 58232.0, + position: [9.461067271500818e+00, -1.764614720843175e+00, -3.458764004169705e-01], + velocity: [7.093807804551229e-04, 5.475097536527790e-03, -1.232345969963958e-04], + }, + { + name: "Uranus", + mass: 8.6813e25, + radius: 25362.0, + position: [1.110362881512566e+01, 1.609448391218202e+01, -8.419833258524990e-02], + velocity: [-3.273728238819980e-03, 2.053528328895527e-03, 5.008589052969062e-05], + }, + { + name: "Neptune", + mass: 1.02409e26, + radius: 24624.0, + position: [2.987992735576156e+01, -6.341879950443392e-01, -6.754997950415415e-01], + velocity: [3.941595250081164e-05, 3.160389775728832e-03, -6.636996572427530e-05], + }, + { + name: "Pluto", + mass: 1.307e22, + radius: 1188.3, + position: [1.822881632666475e+01, -3.000801293901950e+01, -2.059815785829023e+00], + velocity: [2.758977855246929e-03, 9.457264850164455e-04, -8.880815395819214e-04], + }, + { + name: "Moon", + mass: 7.349e22, + radius: 1737.53, + position: [-1.776670337217189e-01, 9.646511868801392e-01, -2.560710414773878e-04], + velocity: [-1.666610342674751e-02, -2.935662211368250e-03, 2.214641479437884e-05], + }, + { + name: "Phobos", + mass: 1.08e16, + radius: 11.1, + position: [-5.216607506283159e-01, 1.525290094552813e+00, 4.474552444674667e-02], + velocity: [-1.371531677510715e-02, -2.797359927923991e-03, 7.604209362929195e-04], + }, + { + name: "Deimos", + mass: 1.80e15, + radius: 6.2, + position: [-5.215476623931578e-01, 1.525280501692070e+00, 4.469744727198185e-02], + velocity: [-1.290124900899404e-02, -2.594527535740538e-03, 3.799855876623048e-04], + }, + { + name: "Io", + mass: 8.93e22, + radius: 1821.49, + position: [1.053815818667817e+00, 4.969715993299296e+00, -4.437108516416628e-02], + velocity: [-1.329530996368361e-03, -5.983335980023409e-03, -3.295420474951598e-05], + }, + { + name: "Europa", + mass: 4.80e22, + radius: 1560.8, + position: [1.060479105966296e+00, 4.971193788432235e+00, -4.418907806556983e-02], + velocity: [-6.967074192246404e-03, 9.896683771810605e-03, 4.296001484155991e-04], + }, + { + name: "Ganymede", + mass: 1.48e23, + radius: 2631.2, + position: [1.062520398626604e+00, 4.968458682597362e+00, -4.429967587277176e-02], + velocity: [-4.841408463186764e-03, 7.634290231598638e-03, 4.147177169244575e-04], + }, + { + name: "Callisto", + mass: 1.08e23, + radius: 2410.3, + position: [1.046927187861326e+00, 4.980213520221207e+00, -4.412635447845523e-02], + velocity: [-1.076662893789138e-02, -1.453153071657253e-03, 9.400054299331563e-06], + }, + { + name: "Mimas", + mass: 3.75e19, + radius: 198.8, + position: [9.462113317387443e+00, -1.764120396234732e+00, -3.462575454806998e-01], + velocity: [-3.600569225193193e-03, 1.195945377622506e-02, -3.321658418910402e-03], + }, + { + name: "Enceladus", + mass: 1.0805e20, + radius: 252.3, + position: [9.462107070733344e+00, -1.763590731315564e+00, -3.465134777458668e-01], + velocity: [-4.799068161710644e-03, 9.904458072213898e-03, -1.910803547584920e-03], + }, + { + name: "Tethys", + mass: 6.176e20, + radius: 536.3, + position: [9.463028141754283e+00, -1.764725184828637e+00, -3.460263238634043e-01], + velocity: [8.124741088132637e-04, 1.132977234261396e-02, -3.072248079372077e-03], + }, + { + name: "Dione", + mass: 1.09572e21, + radius: 562.5, + position: [9.460669031566509e+00, -1.762393870120674e+00, -3.470001695782450e-01], + velocity: [-4.995042476514132e-03, 4.898468069198046e-03, 7.315317142172153e-04], + }, + { + name: "Rhea", + mass: 2.309e21, + radius: 764.5, + position: [9.463441058546145e+00, -1.766997606737125e+00, -3.448366300385151e-01], + velocity: [4.307393238751094e-03, 8.273257376182423e-03, -1.932435874857194e-03], + }, + { + name: "Titan", + mass: 1.34553e23, + radius: 2575.5, + position: [9.468440328490537e+00, -1.762284834421733e+00, -3.478122131916790e-01], + velocity: [-4.611400435334967e-04, 8.260265884102586e-03, -1.443082816825538e-03], + }, + { + name: "Iapetus", + mass: 1.8059e21, + radius: 734.5, + position: [9.454548058738080e+00, -1.786906158368561e+00, -3.394196336672040e-01], + velocity: [2.477125925502744e-03, 4.942920731685813e-03, -3.564738618756286e-04], + }, + { + name: "Miranda", + mass: 6.59e19, + radius: 235.8, + position: [1.110338075481133e+01, 1.609470886437212e+01, -8.339848717695617e-02], + velocity: [2.787135511093017e-04, 1.302160355796409e-03, 1.366210183434322e-03], + }, + { + name: "Ariel", + mass: 1.25e21, + radius: 578.9, + position: [1.110453239435098e+01, 1.609416926126415e+01, -8.504238243640228e-02], + velocity: [-5.417334967749265e-03, 2.196892645955784e-03, -2.298152372242362e-03], + }, + { + name: "Umbriel", + mass: 1.28e21, + radius: 584.7, + position: [1.110253678329407e+01, 1.609490555702174e+01, -8.286998450094619e-02], + velocity: [-1.219602563560983e-03, 1.849034126664038e-03, 1.801100761916168e-03], + }, + { + name: "Titania", + mass: 3.34e21, + radius: 788.9, + position: [1.110510884778205e+01, 1.609382177197045e+01, -8.661833178512783e-02], + velocity: [-5.032495225759578e-03, 2.280002002691279e-03, -1.088327315015861e-03], + }, + { + name: "Oberon", + mass: 3.08e21, + radius: 761.4, + position: [1.110301190463219e+01, 1.609515778477002e+01, -8.040210462613612e-02], + velocity: [-1.519780917379062e-03, 1.720169702110850e-03, 3.926675849694972e-04], + }, + { + name: "Triton", + mass: 2.14e22, + radius: 1352.6, + position: [2.987802053077272e+01, -6.355569689698364e-01, -6.751627943073906e-01], + velocity: [-6.787804924900204e-04, 4.636375429506899e-03, 1.865945736548040e-03], + }, + ], +} \ No newline at end of file diff --git a/assets/jpl_horizon/major_bodies.ron b/assets/jpl_horizon/major_bodies.ron new file mode 100644 index 0000000..b9888f3 --- /dev/null +++ b/assets/jpl_horizon/major_bodies.ron @@ -0,0 +1,2992 @@ +( + bodies: [ + ( + id: "0", + name: "Solar System Barycenter", + designation: None, + aliases: None, + ), + ( + id: "1", + name: "Mercury Barycenter", + designation: None, + aliases: None, + ), + ( + id: "2", + name: "Venus Barycenter", + designation: None, + aliases: None, + ), + ( + id: "3", + name: "Earth-Moon Barycenter", + designation: None, + aliases: None, + ), + ( + id: "4", + name: "Mars Barycenter", + designation: None, + aliases: None, + ), + ( + id: "5", + name: "Jupiter Barycenter", + designation: None, + aliases: None, + ), + ( + id: "6", + name: "Saturn Barycenter", + designation: None, + aliases: None, + ), + ( + id: "7", + name: "Uranus Barycenter", + designation: None, + aliases: None, + ), + ( + id: "8", + name: "Neptune Barycenter", + designation: None, + aliases: None, + ), + ( + id: "9", + name: "Pluto Barycenter", + designation: None, + aliases: None, + ), + ( + id: "10", + name: "Sun", + designation: None, + aliases: None, + ), + ( + id: "31", + name: "SEMB-L1", + designation: None, + aliases: None, + ), + ( + id: "32", + name: "SEMB-L2", + designation: None, + aliases: None, + ), + ( + id: "34", + name: "SEMB-L4", + designation: None, + aliases: None, + ), + ( + id: "35", + name: "SEMB-L5", + designation: None, + aliases: None, + ), + ( + id: "199", + name: "Mercury", + designation: None, + aliases: None, + ), + ( + id: "299", + name: "Venus", + designation: None, + aliases: None, + ), + ( + id: "301", + name: "Moon", + designation: None, + aliases: None, + ), + ( + id: "399", + name: "Earth", + designation: None, + aliases: None, + ), + ( + id: "401", + name: "Phobos", + designation: None, + aliases: None, + ), + ( + id: "402", + name: "Deimos", + designation: None, + aliases: None, + ), + ( + id: "501", + name: "Io", + designation: None, + aliases: None, + ), + ( + id: "502", + name: "Europa", + designation: None, + aliases: None, + ), + ( + id: "503", + name: "Ganymede", + designation: None, + aliases: None, + ), + ( + id: "504", + name: "Callisto", + designation: None, + aliases: None, + ), + ( + id: "505", + name: "Amalthea", + designation: None, + aliases: None, + ), + ( + id: "506", + name: "Himalia", + designation: None, + aliases: None, + ), + ( + id: "507", + name: "Elara", + designation: None, + aliases: None, + ), + ( + id: "508", + name: "Pasiphae", + designation: None, + aliases: None, + ), + ( + id: "509", + name: "Sinope", + designation: None, + aliases: None, + ), + ( + id: "510", + name: "Lysithea", + designation: None, + aliases: None, + ), + ( + id: "511", + name: "Carme", + designation: None, + aliases: None, + ), + ( + id: "512", + name: "Ananke", + designation: None, + aliases: None, + ), + ( + id: "513", + name: "Leda", + designation: None, + aliases: None, + ), + ( + id: "514", + name: "Thebe", + designation: None, + aliases: None, + ), + ( + id: "515", + name: "Adrastea", + designation: None, + aliases: None, + ), + ( + id: "516", + name: "Metis", + designation: None, + aliases: None, + ), + ( + id: "517", + name: "Callirrhoe", + designation: None, + aliases: None, + ), + ( + id: "518", + name: "Themisto", + designation: None, + aliases: None, + ), + ( + id: "519", + name: "Megaclite", + designation: None, + aliases: None, + ), + ( + id: "520", + name: "Taygete", + designation: None, + aliases: None, + ), + ( + id: "521", + name: "Chaldene", + designation: None, + aliases: None, + ), + ( + id: "522", + name: "Harpalyke", + designation: None, + aliases: None, + ), + ( + id: "523", + name: "Kalyke", + designation: None, + aliases: None, + ), + ( + id: "524", + name: "Iocaste", + designation: None, + aliases: None, + ), + ( + id: "525", + name: "Erinome", + designation: None, + aliases: None, + ), + ( + id: "526", + name: "Isonoe", + designation: None, + aliases: None, + ), + ( + id: "527", + name: "Praxidike", + designation: None, + aliases: None, + ), + ( + id: "528", + name: "Autonoe", + designation: None, + aliases: None, + ), + ( + id: "529", + name: "Thyone", + designation: None, + aliases: None, + ), + ( + id: "530", + name: "Hermippe", + designation: None, + aliases: None, + ), + ( + id: "531", + name: "Aitne", + designation: None, + aliases: None, + ), + ( + id: "532", + name: "Eurydome", + designation: None, + aliases: None, + ), + ( + id: "533", + name: "Euanthe", + designation: None, + aliases: None, + ), + ( + id: "534", + name: "Euporie", + designation: None, + aliases: None, + ), + ( + id: "535", + name: "Orthosie", + designation: None, + aliases: None, + ), + ( + id: "536", + name: "Sponde", + designation: None, + aliases: None, + ), + ( + id: "537", + name: "Kale", + designation: None, + aliases: None, + ), + ( + id: "538", + name: "Pasithee", + designation: None, + aliases: None, + ), + ( + id: "539", + name: "Hegemone", + designation: None, + aliases: None, + ), + ( + id: "540", + name: "Mneme", + designation: None, + aliases: None, + ), + ( + id: "541", + name: "Aoede", + designation: None, + aliases: None, + ), + ( + id: "542", + name: "Thelxinoe", + designation: None, + aliases: None, + ), + ( + id: "543", + name: "Arche", + designation: None, + aliases: None, + ), + ( + id: "544", + name: "Kallichore", + designation: None, + aliases: None, + ), + ( + id: "545", + name: "Helike", + designation: None, + aliases: None, + ), + ( + id: "546", + name: "Carpo", + designation: None, + aliases: None, + ), + ( + id: "547", + name: "Eukelade", + designation: None, + aliases: None, + ), + ( + id: "548", + name: "Cyllene", + designation: None, + aliases: None, + ), + ( + id: "549", + name: "Kore", + designation: None, + aliases: None, + ), + ( + id: "550", + name: "Herse", + designation: None, + aliases: None, + ), + ( + id: "551", + name: "2010J1", + designation: None, + aliases: None, + ), + ( + id: "552", + name: "2010J2", + designation: None, + aliases: None, + ), + ( + id: "553", + name: "Dia", + designation: None, + aliases: None, + ), + ( + id: "554", + name: "2016J1", + designation: None, + aliases: None, + ), + ( + id: "555", + name: "2003J18", + designation: None, + aliases: None, + ), + ( + id: "556", + name: "2011J2", + designation: None, + aliases: None, + ), + ( + id: "557", + name: "Eirene", + designation: None, + aliases: None, + ), + ( + id: "558", + name: "Philophrosyne", + designation: None, + aliases: None, + ), + ( + id: "559", + name: "2017J1", + designation: None, + aliases: None, + ), + ( + id: "560", + name: "Eupheme", + designation: None, + aliases: None, + ), + ( + id: "561", + name: "2003J19", + designation: None, + aliases: None, + ), + ( + id: "562", + name: "Valetudo", + designation: None, + aliases: None, + ), + ( + id: "563", + name: "2017J2", + designation: None, + aliases: None, + ), + ( + id: "564", + name: "2017J3", + designation: None, + aliases: None, + ), + ( + id: "565", + name: "Pandia", + designation: None, + aliases: None, + ), + ( + id: "566", + name: "2017J5", + designation: None, + aliases: None, + ), + ( + id: "567", + name: "2017J6", + designation: None, + aliases: None, + ), + ( + id: "568", + name: "2017J7", + designation: None, + aliases: None, + ), + ( + id: "569", + name: "2017J8", + designation: None, + aliases: None, + ), + ( + id: "570", + name: "2017J9", + designation: None, + aliases: None, + ), + ( + id: "571", + name: "Ersa", + designation: None, + aliases: None, + ), + ( + id: "572", + name: "2011J1", + designation: None, + aliases: None, + ), + ( + id: "55501", + name: "2003J2", + designation: None, + aliases: None, + ), + ( + id: "55502", + name: "2003J4", + designation: None, + aliases: None, + ), + ( + id: "55503", + name: "2003J9", + designation: None, + aliases: None, + ), + ( + id: "55504", + name: "2003J10", + designation: None, + aliases: None, + ), + ( + id: "55505", + name: "2003J12", + designation: None, + aliases: None, + ), + ( + id: "55506", + name: "2003J16", + designation: None, + aliases: None, + ), + ( + id: "55507", + name: "2003J23", + designation: None, + aliases: None, + ), + ( + id: "55508", + name: "2003J24", + designation: None, + aliases: None, + ), + ( + id: "55509", + name: "2011J3", + designation: None, + aliases: None, + ), + ( + id: "55510", + name: "2018J2", + designation: None, + aliases: None, + ), + ( + id: "55511", + name: "2018J3", + designation: None, + aliases: None, + ), + ( + id: "55512", + name: "2021J1", + designation: None, + aliases: None, + ), + ( + id: "55513", + name: "2021J2", + designation: None, + aliases: None, + ), + ( + id: "55514", + name: "2021J3", + designation: None, + aliases: None, + ), + ( + id: "55515", + name: "2021J4", + designation: None, + aliases: None, + ), + ( + id: "55516", + name: "2021J5", + designation: None, + aliases: None, + ), + ( + id: "55517", + name: "2021J6", + designation: None, + aliases: None, + ), + ( + id: "55518", + name: "2016J3", + designation: None, + aliases: None, + ), + ( + id: "55519", + name: "2016J4", + designation: None, + aliases: None, + ), + ( + id: "55520", + name: "2018J4", + designation: None, + aliases: None, + ), + ( + id: "55521", + name: "2022J1", + designation: None, + aliases: None, + ), + ( + id: "55522", + name: "2022J2", + designation: None, + aliases: None, + ), + ( + id: "55523", + name: "2022J3", + designation: None, + aliases: None, + ), + ( + id: "55525", + name: "2017J10", + designation: None, + aliases: None, + ), + ( + id: "55526", + name: "2017J11", + designation: None, + aliases: None, + ), + ( + id: "599", + name: "Jupiter", + designation: None, + aliases: None, + ), + ( + id: "601", + name: "Mimas", + designation: None, + aliases: None, + ), + ( + id: "602", + name: "Enceladus", + designation: None, + aliases: None, + ), + ( + id: "603", + name: "Tethys", + designation: None, + aliases: None, + ), + ( + id: "604", + name: "Dione", + designation: None, + aliases: None, + ), + ( + id: "605", + name: "Rhea", + designation: None, + aliases: None, + ), + ( + id: "606", + name: "Titan", + designation: None, + aliases: None, + ), + ( + id: "607", + name: "Hyperion", + designation: None, + aliases: None, + ), + ( + id: "608", + name: "Iapetus", + designation: None, + aliases: None, + ), + ( + id: "609", + name: "Phoebe", + designation: None, + aliases: None, + ), + ( + id: "610", + name: "Janus", + designation: None, + aliases: None, + ), + ( + id: "611", + name: "Epimetheus", + designation: None, + aliases: None, + ), + ( + id: "612", + name: "Helene", + designation: None, + aliases: None, + ), + ( + id: "613", + name: "Telesto", + designation: None, + aliases: None, + ), + ( + id: "614", + name: "Calypso", + designation: None, + aliases: None, + ), + ( + id: "615", + name: "Atlas", + designation: None, + aliases: None, + ), + ( + id: "616", + name: "Prometheus", + designation: None, + aliases: None, + ), + ( + id: "617", + name: "Pandora", + designation: None, + aliases: None, + ), + ( + id: "618", + name: "Pan", + designation: None, + aliases: None, + ), + ( + id: "619", + name: "Ymir", + designation: None, + aliases: None, + ), + ( + id: "620", + name: "Paaliaq", + designation: None, + aliases: None, + ), + ( + id: "621", + name: "Tarvos", + designation: None, + aliases: None, + ), + ( + id: "622", + name: "Ijiraq", + designation: None, + aliases: None, + ), + ( + id: "623", + name: "Suttungr", + designation: None, + aliases: None, + ), + ( + id: "624", + name: "Kiviuq", + designation: None, + aliases: None, + ), + ( + id: "625", + name: "Mundilfari", + designation: None, + aliases: None, + ), + ( + id: "626", + name: "Albiorix", + designation: None, + aliases: None, + ), + ( + id: "627", + name: "Skathi", + designation: None, + aliases: None, + ), + ( + id: "628", + name: "Erriapus", + designation: None, + aliases: None, + ), + ( + id: "629", + name: "Siarnaq", + designation: None, + aliases: None, + ), + ( + id: "630", + name: "Thrymr", + designation: None, + aliases: None, + ), + ( + id: "631", + name: "Narvi", + designation: None, + aliases: None, + ), + ( + id: "632", + name: "Methone", + designation: None, + aliases: None, + ), + ( + id: "633", + name: "Pallene", + designation: None, + aliases: None, + ), + ( + id: "634", + name: "Polydeuces", + designation: None, + aliases: None, + ), + ( + id: "635", + name: "Daphnis", + designation: None, + aliases: None, + ), + ( + id: "636", + name: "Aegir", + designation: None, + aliases: None, + ), + ( + id: "637", + name: "Bebhionn", + designation: None, + aliases: None, + ), + ( + id: "638", + name: "Bergelmir", + designation: None, + aliases: None, + ), + ( + id: "639", + name: "Bestla", + designation: None, + aliases: None, + ), + ( + id: "640", + name: "Farbauti", + designation: None, + aliases: None, + ), + ( + id: "641", + name: "Fenrir", + designation: None, + aliases: None, + ), + ( + id: "642", + name: "Fornjot", + designation: None, + aliases: None, + ), + ( + id: "643", + name: "Hati", + designation: None, + aliases: None, + ), + ( + id: "644", + name: "Hyrrokkin", + designation: None, + aliases: None, + ), + ( + id: "645", + name: "Kari", + designation: None, + aliases: None, + ), + ( + id: "646", + name: "Loge", + designation: None, + aliases: None, + ), + ( + id: "647", + name: "Skoll", + designation: None, + aliases: None, + ), + ( + id: "648", + name: "Surtur", + designation: None, + aliases: None, + ), + ( + id: "649", + name: "Anthe", + designation: None, + aliases: None, + ), + ( + id: "650", + name: "Jarnsaxa", + designation: None, + aliases: None, + ), + ( + id: "651", + name: "Greip", + designation: None, + aliases: None, + ), + ( + id: "652", + name: "Tarqeq", + designation: None, + aliases: None, + ), + ( + id: "653", + name: "Aegaeon", + designation: None, + aliases: None, + ), + ( + id: "654", + name: "Gridr", + designation: None, + aliases: None, + ), + ( + id: "655", + name: "Angrboda", + designation: None, + aliases: None, + ), + ( + id: "656", + name: "Skrymir", + designation: None, + aliases: None, + ), + ( + id: "657", + name: "Gerd", + designation: None, + aliases: None, + ), + ( + id: "658", + name: "2004S26", + designation: None, + aliases: None, + ), + ( + id: "659", + name: "Eggther", + designation: None, + aliases: None, + ), + ( + id: "660", + name: "2004S29", + designation: None, + aliases: None, + ), + ( + id: "661", + name: "Beli", + designation: None, + aliases: None, + ), + ( + id: "662", + name: "Gunnlod", + designation: None, + aliases: None, + ), + ( + id: "663", + name: "Thiazzi", + designation: None, + aliases: None, + ), + ( + id: "664", + name: "2004S34", + designation: None, + aliases: None, + ), + ( + id: "665", + name: "Alvaldi", + designation: None, + aliases: None, + ), + ( + id: "666", + name: "Geirrod", + designation: None, + aliases: None, + ), + ( + id: "65067", + name: "2004S31", + designation: None, + aliases: None, + ), + ( + id: "65070", + name: "2004S24", + designation: None, + aliases: None, + ), + ( + id: "65077", + name: "2004S28", + designation: None, + aliases: None, + ), + ( + id: "65079", + name: "2004S21", + designation: None, + aliases: None, + ), + ( + id: "65081", + name: "2004S36", + designation: None, + aliases: None, + ), + ( + id: "65082", + name: "2004S37", + designation: None, + aliases: None, + ), + ( + id: "65084", + name: "2004S39", + designation: None, + aliases: None, + ), + ( + id: "65085", + name: "2004S7", + designation: None, + aliases: None, + ), + ( + id: "65086", + name: "2004S12", + designation: None, + aliases: None, + ), + ( + id: "65087", + name: "2004S13", + designation: None, + aliases: None, + ), + ( + id: "65088", + name: "2004S17", + designation: None, + aliases: None, + ), + ( + id: "65089", + name: "2006S1", + designation: None, + aliases: None, + ), + ( + id: "65090", + name: "2006S3", + designation: None, + aliases: None, + ), + ( + id: "65091", + name: "2007S2", + designation: None, + aliases: None, + ), + ( + id: "65092", + name: "2007S3", + designation: None, + aliases: None, + ), + ( + id: "65093", + name: "2019S1", + designation: None, + aliases: None, + ), + ( + id: "65094", + name: "2019S2", + designation: None, + aliases: None, + ), + ( + id: "65095", + name: "2019S3", + designation: None, + aliases: None, + ), + ( + id: "65096", + name: "2020S1", + designation: None, + aliases: None, + ), + ( + id: "65097", + name: "2020S2", + designation: None, + aliases: None, + ), + ( + id: "65098", + name: "2004S40", + designation: None, + aliases: None, + ), + ( + id: "65100", + name: "2006S9", + designation: None, + aliases: None, + ), + ( + id: "65101", + name: "2007S5", + designation: None, + aliases: None, + ), + ( + id: "65102", + name: "2020S3", + designation: None, + aliases: None, + ), + ( + id: "65103", + name: "2019S4", + designation: None, + aliases: None, + ), + ( + id: "65104", + name: "2004S41", + designation: None, + aliases: None, + ), + ( + id: "65105", + name: "2020S4", + designation: None, + aliases: None, + ), + ( + id: "65106", + name: "2020S5", + designation: None, + aliases: None, + ), + ( + id: "65107", + name: "2007S6", + designation: None, + aliases: None, + ), + ( + id: "65108", + name: "2004S42", + designation: None, + aliases: None, + ), + ( + id: "65109", + name: "2006S10", + designation: None, + aliases: None, + ), + ( + id: "65110", + name: "2019S5", + designation: None, + aliases: None, + ), + ( + id: "65111", + name: "2004S43", + designation: None, + aliases: None, + ), + ( + id: "65112", + name: "2004S44", + designation: None, + aliases: None, + ), + ( + id: "65113", + name: "2004S45", + designation: None, + aliases: None, + ), + ( + id: "65114", + name: "2006S11", + designation: None, + aliases: None, + ), + ( + id: "65115", + name: "2006S12", + designation: None, + aliases: None, + ), + ( + id: "65116", + name: "2019S6", + designation: None, + aliases: None, + ), + ( + id: "65117", + name: "2006S13", + designation: None, + aliases: None, + ), + ( + id: "65118", + name: "2019S7", + designation: None, + aliases: None, + ), + ( + id: "65119", + name: "2019S8", + designation: None, + aliases: None, + ), + ( + id: "65120", + name: "2019S9", + designation: None, + aliases: None, + ), + ( + id: "65121", + name: "2004S46", + designation: None, + aliases: None, + ), + ( + id: "65122", + name: "2019S10", + designation: None, + aliases: None, + ), + ( + id: "65123", + name: "2004S47", + designation: None, + aliases: None, + ), + ( + id: "65124", + name: "2019S11", + designation: None, + aliases: None, + ), + ( + id: "65125", + name: "2006S14", + designation: None, + aliases: None, + ), + ( + id: "65126", + name: "2019S12", + designation: None, + aliases: None, + ), + ( + id: "65127", + name: "2020S6", + designation: None, + aliases: None, + ), + ( + id: "65128", + name: "2019S13", + designation: None, + aliases: None, + ), + ( + id: "65129", + name: "2005S4", + designation: None, + aliases: None, + ), + ( + id: "65130", + name: "2007S7", + designation: None, + aliases: None, + ), + ( + id: "65131", + name: "2007S8", + designation: None, + aliases: None, + ), + ( + id: "65132", + name: "2020S7", + designation: None, + aliases: None, + ), + ( + id: "65133", + name: "2019S14", + designation: None, + aliases: None, + ), + ( + id: "65134", + name: "2019S15", + designation: None, + aliases: None, + ), + ( + id: "65135", + name: "2005S5", + designation: None, + aliases: None, + ), + ( + id: "65136", + name: "2006S15", + designation: None, + aliases: None, + ), + ( + id: "65137", + name: "2006S16", + designation: None, + aliases: None, + ), + ( + id: "65138", + name: "2006S17", + designation: None, + aliases: None, + ), + ( + id: "65139", + name: "2004S48", + designation: None, + aliases: None, + ), + ( + id: "65140", + name: "2020S8", + designation: None, + aliases: None, + ), + ( + id: "65141", + name: "2004S49", + designation: None, + aliases: None, + ), + ( + id: "65142", + name: "2004S50", + designation: None, + aliases: None, + ), + ( + id: "65143", + name: "2006S18", + designation: None, + aliases: None, + ), + ( + id: "65144", + name: "2019S16", + designation: None, + aliases: None, + ), + ( + id: "65145", + name: "2019S17", + designation: None, + aliases: None, + ), + ( + id: "65146", + name: "2019S18", + designation: None, + aliases: None, + ), + ( + id: "65147", + name: "2019S19", + designation: None, + aliases: None, + ), + ( + id: "65148", + name: "2019S20", + designation: None, + aliases: None, + ), + ( + id: "65149", + name: "2006S19", + designation: None, + aliases: None, + ), + ( + id: "65150", + name: "2004S51", + designation: None, + aliases: None, + ), + ( + id: "65151", + name: "2020S9", + designation: None, + aliases: None, + ), + ( + id: "65152", + name: "2004S52", + designation: None, + aliases: None, + ), + ( + id: "65153", + name: "2007S9", + designation: None, + aliases: None, + ), + ( + id: "65154", + name: "2004S53", + designation: None, + aliases: None, + ), + ( + id: "65155", + name: "2020S10", + designation: None, + aliases: None, + ), + ( + id: "65156", + name: "2019S21", + designation: None, + aliases: None, + ), + ( + id: "65157", + name: "2006S20", + designation: None, + aliases: None, + ), + ( + id: "65158", + name: "2004S54", + designation: None, + aliases: None, + ), + ( + id: "65159", + name: "2004S55", + designation: None, + aliases: None, + ), + ( + id: "65160", + name: "2004S56", + designation: None, + aliases: None, + ), + ( + id: "65161", + name: "2004S57", + designation: None, + aliases: None, + ), + ( + id: "65162", + name: "2004S58", + designation: None, + aliases: None, + ), + ( + id: "65163", + name: "2004S59", + designation: None, + aliases: None, + ), + ( + id: "65164", + name: "2004S60", + designation: None, + aliases: None, + ), + ( + id: "65165", + name: "2004S61", + designation: None, + aliases: None, + ), + ( + id: "65166", + name: "2005S06", + designation: None, + aliases: None, + ), + ( + id: "65167", + name: "2005S07", + designation: None, + aliases: None, + ), + ( + id: "65168", + name: "2006S21", + designation: None, + aliases: None, + ), + ( + id: "65169", + name: "2006S22", + designation: None, + aliases: None, + ), + ( + id: "65170", + name: "2006S23", + designation: None, + aliases: None, + ), + ( + id: "65171", + name: "2006S24", + designation: None, + aliases: None, + ), + ( + id: "65172", + name: "2006S25", + designation: None, + aliases: None, + ), + ( + id: "65173", + name: "2006S26", + designation: None, + aliases: None, + ), + ( + id: "65174", + name: "2006S27", + designation: None, + aliases: None, + ), + ( + id: "65175", + name: "2006S28", + designation: None, + aliases: None, + ), + ( + id: "65176", + name: "2006S29", + designation: None, + aliases: None, + ), + ( + id: "65177", + name: "2007S10", + designation: None, + aliases: None, + ), + ( + id: "65178", + name: "2007S11", + designation: None, + aliases: None, + ), + ( + id: "65179", + name: "2019S22", + designation: None, + aliases: None, + ), + ( + id: "65180", + name: "2019S23", + designation: None, + aliases: None, + ), + ( + id: "65181", + name: "2019S24", + designation: None, + aliases: None, + ), + ( + id: "65182", + name: "2019S25", + designation: None, + aliases: None, + ), + ( + id: "65183", + name: "2019S26", + designation: None, + aliases: None, + ), + ( + id: "65184", + name: "2019S27", + designation: None, + aliases: None, + ), + ( + id: "65185", + name: "2019S28", + designation: None, + aliases: None, + ), + ( + id: "65186", + name: "2019S29", + designation: None, + aliases: None, + ), + ( + id: "65187", + name: "2019S30", + designation: None, + aliases: None, + ), + ( + id: "65188", + name: "2019S31", + designation: None, + aliases: None, + ), + ( + id: "65189", + name: "2019S32", + designation: None, + aliases: None, + ), + ( + id: "65190", + name: "2019S33", + designation: None, + aliases: None, + ), + ( + id: "65191", + name: "2019S34", + designation: None, + aliases: None, + ), + ( + id: "65192", + name: "2019S35", + designation: None, + aliases: None, + ), + ( + id: "65193", + name: "2019S36", + designation: None, + aliases: None, + ), + ( + id: "65194", + name: "2019S37", + designation: None, + aliases: None, + ), + ( + id: "65195", + name: "2019S38", + designation: None, + aliases: None, + ), + ( + id: "65196", + name: "2019S39", + designation: None, + aliases: None, + ), + ( + id: "65197", + name: "2019S40", + designation: None, + aliases: None, + ), + ( + id: "65198", + name: "2019S41", + designation: None, + aliases: None, + ), + ( + id: "65199", + name: "2019S42", + designation: None, + aliases: None, + ), + ( + id: "65200", + name: "2019S43", + designation: None, + aliases: None, + ), + ( + id: "65201", + name: "2019S44", + designation: None, + aliases: None, + ), + ( + id: "65202", + name: "2020S11", + designation: None, + aliases: None, + ), + ( + id: "65203", + name: "2020S12", + designation: None, + aliases: None, + ), + ( + id: "65204", + name: "2020S13", + designation: None, + aliases: None, + ), + ( + id: "65205", + name: "2020S14", + designation: None, + aliases: None, + ), + ( + id: "65206", + name: "2020S15", + designation: None, + aliases: None, + ), + ( + id: "65207", + name: "2020S16", + designation: None, + aliases: None, + ), + ( + id: "65208", + name: "2020S17", + designation: None, + aliases: None, + ), + ( + id: "65209", + name: "2020S18", + designation: None, + aliases: None, + ), + ( + id: "65210", + name: "2020S19", + designation: None, + aliases: None, + ), + ( + id: "65211", + name: "2020S20", + designation: None, + aliases: None, + ), + ( + id: "65212", + name: "2020S21", + designation: None, + aliases: None, + ), + ( + id: "65213", + name: "2020S22", + designation: None, + aliases: None, + ), + ( + id: "65214", + name: "2020S23", + designation: None, + aliases: None, + ), + ( + id: "65215", + name: "2020S24", + designation: None, + aliases: None, + ), + ( + id: "65216", + name: "2020S25", + designation: None, + aliases: None, + ), + ( + id: "65217", + name: "2020S26", + designation: None, + aliases: None, + ), + ( + id: "65218", + name: "2020S27", + designation: None, + aliases: None, + ), + ( + id: "65219", + name: "2020S28", + designation: None, + aliases: None, + ), + ( + id: "65220", + name: "2020S29", + designation: None, + aliases: None, + ), + ( + id: "65221", + name: "2020S30", + designation: None, + aliases: None, + ), + ( + id: "65222", + name: "2020S31", + designation: None, + aliases: None, + ), + ( + id: "65223", + name: "2020S32", + designation: None, + aliases: None, + ), + ( + id: "65224", + name: "2020S33", + designation: None, + aliases: None, + ), + ( + id: "65225", + name: "2020S34", + designation: None, + aliases: None, + ), + ( + id: "65226", + name: "2020S35", + designation: None, + aliases: None, + ), + ( + id: "65227", + name: "2020S36", + designation: None, + aliases: None, + ), + ( + id: "65228", + name: "2020S37", + designation: None, + aliases: None, + ), + ( + id: "65229", + name: "2020S38", + designation: None, + aliases: None, + ), + ( + id: "65230", + name: "2020S39", + designation: None, + aliases: None, + ), + ( + id: "65231", + name: "2020S40", + designation: None, + aliases: None, + ), + ( + id: "65232", + name: "2020S41", + designation: None, + aliases: None, + ), + ( + id: "65233", + name: "2020S42", + designation: None, + aliases: None, + ), + ( + id: "65234", + name: "2020S43", + designation: None, + aliases: None, + ), + ( + id: "65235", + name: "2020S44", + designation: None, + aliases: None, + ), + ( + id: "65236", + name: "2023S01", + designation: None, + aliases: None, + ), + ( + id: "65237", + name: "2023S02", + designation: None, + aliases: None, + ), + ( + id: "65238", + name: "2023S03", + designation: None, + aliases: None, + ), + ( + id: "65239", + name: "2023S04", + designation: None, + aliases: None, + ), + ( + id: "65240", + name: "2023S05", + designation: None, + aliases: None, + ), + ( + id: "65241", + name: "2023S06", + designation: None, + aliases: None, + ), + ( + id: "65242", + name: "2023S07", + designation: None, + aliases: None, + ), + ( + id: "65243", + name: "2023S08", + designation: None, + aliases: None, + ), + ( + id: "65244", + name: "2023S09", + designation: None, + aliases: None, + ), + ( + id: "65245", + name: "2023S10", + designation: None, + aliases: None, + ), + ( + id: "65246", + name: "2023S11", + designation: None, + aliases: None, + ), + ( + id: "65247", + name: "2023S12", + designation: None, + aliases: None, + ), + ( + id: "65248", + name: "2023S13", + designation: None, + aliases: None, + ), + ( + id: "65249", + name: "2023S14", + designation: None, + aliases: None, + ), + ( + id: "65250", + name: "2023S15", + designation: None, + aliases: None, + ), + ( + id: "65251", + name: "2023S16", + designation: None, + aliases: None, + ), + ( + id: "65252", + name: "2023S17", + designation: None, + aliases: None, + ), + ( + id: "65253", + name: "2023S18", + designation: None, + aliases: None, + ), + ( + id: "65254", + name: "2023S19", + designation: None, + aliases: None, + ), + ( + id: "65255", + name: "2023S20", + designation: None, + aliases: None, + ), + ( + id: "65256", + name: "2023S21", + designation: None, + aliases: None, + ), + ( + id: "65257", + name: "2023S22", + designation: None, + aliases: None, + ), + ( + id: "65258", + name: "2023S23", + designation: None, + aliases: None, + ), + ( + id: "65259", + name: "2023S24", + designation: None, + aliases: None, + ), + ( + id: "65260", + name: "2023S25", + designation: None, + aliases: None, + ), + ( + id: "65261", + name: "2023S26", + designation: None, + aliases: None, + ), + ( + id: "65262", + name: "2023S27", + designation: None, + aliases: None, + ), + ( + id: "65263", + name: "2023S28", + designation: None, + aliases: None, + ), + ( + id: "65264", + name: "2023S29", + designation: None, + aliases: None, + ), + ( + id: "65265", + name: "2023S30", + designation: None, + aliases: None, + ), + ( + id: "65266", + name: "2023S31", + designation: None, + aliases: None, + ), + ( + id: "65267", + name: "2023S32", + designation: None, + aliases: None, + ), + ( + id: "65268", + name: "2023S33", + designation: None, + aliases: None, + ), + ( + id: "65269", + name: "2023S34", + designation: None, + aliases: None, + ), + ( + id: "65270", + name: "2023S35", + designation: None, + aliases: None, + ), + ( + id: "65271", + name: "2023S36", + designation: None, + aliases: None, + ), + ( + id: "65272", + name: "2023S37", + designation: None, + aliases: None, + ), + ( + id: "65273", + name: "2023S38", + designation: None, + aliases: None, + ), + ( + id: "65274", + name: "2023S39", + designation: None, + aliases: None, + ), + ( + id: "65275", + name: "2023S40", + designation: None, + aliases: None, + ), + ( + id: "65276", + name: "2023S41", + designation: None, + aliases: None, + ), + ( + id: "65277", + name: "2023S42", + designation: None, + aliases: None, + ), + ( + id: "65278", + name: "2023S43", + designation: None, + aliases: None, + ), + ( + id: "65279", + name: "2023S44", + designation: None, + aliases: None, + ), + ( + id: "65280", + name: "2023S45", + designation: None, + aliases: None, + ), + ( + id: "65281", + name: "2023S46", + designation: None, + aliases: None, + ), + ( + id: "65282", + name: "2023S47", + designation: None, + aliases: None, + ), + ( + id: "65283", + name: "2023S48", + designation: None, + aliases: None, + ), + ( + id: "65284", + name: "2023S49", + designation: None, + aliases: None, + ), + ( + id: "65285", + name: "2023S50", + designation: None, + aliases: None, + ), + ( + id: "699", + name: "Saturn", + designation: None, + aliases: None, + ), + ( + id: "701", + name: "Ariel", + designation: None, + aliases: None, + ), + ( + id: "702", + name: "Umbriel", + designation: None, + aliases: None, + ), + ( + id: "703", + name: "Titania", + designation: None, + aliases: None, + ), + ( + id: "704", + name: "Oberon", + designation: None, + aliases: None, + ), + ( + id: "705", + name: "Miranda", + designation: None, + aliases: None, + ), + ( + id: "706", + name: "Cordelia", + designation: None, + aliases: None, + ), + ( + id: "707", + name: "Ophelia", + designation: None, + aliases: None, + ), + ( + id: "708", + name: "Bianca", + designation: None, + aliases: None, + ), + ( + id: "709", + name: "Cressida", + designation: None, + aliases: None, + ), + ( + id: "710", + name: "Desdemona", + designation: None, + aliases: None, + ), + ( + id: "711", + name: "Juliet", + designation: None, + aliases: None, + ), + ( + id: "712", + name: "Portia", + designation: None, + aliases: None, + ), + ( + id: "713", + name: "Rosalind", + designation: None, + aliases: None, + ), + ( + id: "714", + name: "Belinda", + designation: None, + aliases: None, + ), + ( + id: "715", + name: "Puck", + designation: None, + aliases: None, + ), + ( + id: "716", + name: "Caliban", + designation: None, + aliases: None, + ), + ( + id: "717", + name: "Sycorax", + designation: None, + aliases: None, + ), + ( + id: "718", + name: "Prospero", + designation: None, + aliases: None, + ), + ( + id: "719", + name: "Setebos", + designation: None, + aliases: None, + ), + ( + id: "720", + name: "Stephano", + designation: None, + aliases: None, + ), + ( + id: "721", + name: "Trinculo", + designation: None, + aliases: None, + ), + ( + id: "722", + name: "Francisco", + designation: None, + aliases: None, + ), + ( + id: "723", + name: "Margaret", + designation: None, + aliases: None, + ), + ( + id: "724", + name: "Ferdinand", + designation: None, + aliases: None, + ), + ( + id: "725", + name: "Perdita", + designation: None, + aliases: None, + ), + ( + id: "726", + name: "Mab", + designation: None, + aliases: None, + ), + ( + id: "727", + name: "Cupid", + designation: None, + aliases: None, + ), + ( + id: "799", + name: "Uranus", + designation: None, + aliases: None, + ), + ( + id: "75051", + name: "2023U1", + designation: None, + aliases: None, + ), + ( + id: "801", + name: "Triton", + designation: None, + aliases: None, + ), + ( + id: "802", + name: "Nereid", + designation: None, + aliases: None, + ), + ( + id: "803", + name: "Naiad", + designation: None, + aliases: None, + ), + ( + id: "804", + name: "Thalassa", + designation: None, + aliases: None, + ), + ( + id: "805", + name: "Despina", + designation: None, + aliases: None, + ), + ( + id: "806", + name: "Galatea", + designation: None, + aliases: None, + ), + ( + id: "807", + name: "Larissa", + designation: None, + aliases: None, + ), + ( + id: "808", + name: "Proteus", + designation: None, + aliases: None, + ), + ( + id: "809", + name: "Halimede", + designation: None, + aliases: None, + ), + ( + id: "810", + name: "Psamathe", + designation: None, + aliases: None, + ), + ( + id: "811", + name: "Sao", + designation: None, + aliases: None, + ), + ( + id: "812", + name: "Laomedeia", + designation: None, + aliases: None, + ), + ( + id: "813", + name: "Neso", + designation: None, + aliases: None, + ), + ( + id: "814", + name: "Hippocamp", + designation: None, + aliases: None, + ), + ( + id: "899", + name: "Neptune", + designation: None, + aliases: None, + ), + ( + id: "85051", + name: "2002N5", + designation: None, + aliases: None, + ), + ( + id: "85052", + name: "2021N1", + designation: None, + aliases: None, + ), + ( + id: "901", + name: "Charon", + designation: None, + aliases: None, + ), + ( + id: "902", + name: "Nix", + designation: None, + aliases: None, + ), + ( + id: "903", + name: "Hydra", + designation: None, + aliases: None, + ), + ( + id: "904", + name: "Kerberos", + designation: None, + aliases: None, + ), + ( + id: "905", + name: "Styx", + designation: None, + aliases: None, + ), + ( + id: "999", + name: "Pluto", + designation: None, + aliases: None, + ), + ( + id: "3011", + name: "EM-L1", + designation: None, + aliases: None, + ), + ( + id: "3012", + name: "EM-L2", + designation: None, + aliases: None, + ), + ( + id: "3014", + name: "EM-L4", + designation: None, + aliases: None, + ), + ( + id: "3015", + name: "EM-L5", + designation: None, + aliases: None, + ), + ( + id: "999787", + name: "WT1190F", + designation: None, + aliases: None, + ), + ( + id: "1000041", + name: "Hartley 2", + designation: None, + aliases: None, + ), + ( + id: "1003228", + name: "Siding Spring", + designation: None, + aliases: None, + ), + ( + id: "9037734", + name: "ISON_NG1", + designation: None, + aliases: None, + ), + ( + id: "9037735", + name: "ISON_NG2", + designation: None, + aliases: None, + ), + ( + id: "2000016", + name: "Psyche (mission target)", + designation: None, + aliases: None, + ), + ( + id: "2006489", + name: "6489 Golevka (1991 JX)", + designation: None, + aliases: None, + ), + ( + id: "2101955", + name: "101955 Bennu (1999 RQ36)", + designation: None, + aliases: None, + ), + ( + id: "2486958", + name: "Arrokoth", + designation: None, + aliases: None, + ), + ( + id: "9901489", + name: "2018_AV2 (spacecraft)", + designation: None, + aliases: None, + ), + ( + id: "9901490", + name: "9O0DC57 (spacecraft)", + designation: None, + aliases: None, + ), + ( + id: "9901885", + name: "9U01FF6 (spacecraft)", + designation: None, + aliases: None, + ), + ( + id: "20000617", + name: "Patroclus (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920000617", + name: "Patroclus (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120000617", + name: "Menoetius", + designation: None, + aliases: None, + ), + ( + id: "20050000", + name: "Quaoar (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920050000", + name: "Quaoar (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120050000", + name: "Weywot", + designation: None, + aliases: None, + ), + ( + id: "20065803", + name: "Didymos (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920065803", + name: "Didymos (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120065803", + name: "Dimorphos", + designation: None, + aliases: None, + ), + ( + id: "20090482", + name: "Orcus (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920090482", + name: "Orcus (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120090482", + name: "Vanth", + designation: None, + aliases: None, + ), + ( + id: "20120347", + name: "Salacia (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920120347", + name: "Salacia (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120120347", + name: "Actaea", + designation: None, + aliases: None, + ), + ( + id: "20136108", + name: "Haumea (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920136108", + name: "Haumea (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120136108", + name: "Hi\'iaka", + designation: None, + aliases: None, + ), + ( + id: "220136108", + name: "Namaka", + designation: None, + aliases: None, + ), + ( + id: "20136199", + name: "Eris (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920136199", + name: "Eris (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120136199", + name: "Dysnomia", + designation: None, + aliases: None, + ), + ( + id: "20469705", + name: "|=Kagara (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920469705", + name: "|=Kagara (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120469705", + name: "Haunu", + designation: None, + aliases: None, + ), + ( + id: "20612687", + name: "2003 UN284 (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920612687", + name: "2003 UN284 (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120612687", + name: "2003 UN284 1", + designation: None, + aliases: None, + ), + ( + id: "20612095", + name: "1999 OJ4 (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "920612095", + name: "1999 OJ4 (primary body)", + designation: None, + aliases: None, + ), + ( + id: "120612095", + name: "1999 OJ4 1", + designation: None, + aliases: None, + ), + ( + id: "53031823", + name: "1998 WW31 (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "953031823", + name: "1998 WW31 (primary body)", + designation: None, + aliases: None, + ), + ( + id: "153031823", + name: "1998 WW31 1", + designation: None, + aliases: None, + ), + ( + id: "53092511", + name: "2001 QW322 (system barycenter)", + designation: None, + aliases: None, + ), + ( + id: "953092511", + name: "2001 QW322 (primary body)", + designation: None, + aliases: None, + ), + ( + id: "153092511", + name: "2001 QW322 1", + designation: None, + aliases: None, + ), + ], +) \ No newline at end of file diff --git a/assets/moon.txt b/assets/moon.txt index 149b5c5..18aec80 100644 --- a/assets/moon.txt +++ b/assets/moon.txt @@ -1,4 +1,4 @@ -curl -s "https://ssd.jpl.nasa.gov/api/horizons.api?format=text&COMMAND=%27301%27&CENTER=%27%40sun%27&EPHEM_TYPE=%27VECTORS%27&OUT_UNITS=%27AU-D%27&START_TIME=%272000-01-01%2012:00%27&STOP_TIME=%272000-01-01%2012:01%27&STEP_SIZE=%271%20m%27&VEC_TABLE=2&REF_PLANE=%27ECLIPTIC%27&REF_SYSTEM=%27J2000%27" +curl -s "https://ssd.jpl.nasa.gov/api/horizons.api?format=text&COMMAND=%27301%27&CENTER=%27%40sun%27&EPHEM_TYPE=%27VECTORS%27&OUT_UNITS=%27AU-D%27&START_TIME=%272025-01-01%2000:00%27&STOP_TIME=%272025-01-01%2000:01%27&STEP_SIZE=%271%20m%27&VEC_TABLE=2&REF_PLANE=%27ECLIPTIC%27&REF_SYSTEM=%27J2000%27" API VERSION: 1.2 API SOURCE: NASA/JPL Horizons API diff --git a/src/jpl_horizon.rs b/src/jpl_horizon.rs new file mode 100644 index 0000000..91f4f26 --- /dev/null +++ b/src/jpl_horizon.rs @@ -0,0 +1,2328 @@ +use bevy::math::DVec3; +use chrono::{DateTime, Utc}; +use reqwest::Client; +use serde::{Deserialize, Serialize}; + +/// JPL Horizons API client for querying ephemeris data +#[derive(Debug, Clone)] +pub struct JplHorizonsClient { + client: Client, + base_url: String, +} + +/// Ephemeris type for JPL Horizons queries +#[derive(Debug, Clone, Serialize, Default)] +pub enum EphemerisType { + #[serde(rename = "OBSERVER")] + Observer, + #[serde(rename = "VECTORS")] + #[default] + Vectors, + #[serde(rename = "ELEMENTS")] + Elements, + #[serde(rename = "SPK")] + Spk, + #[serde(rename = "APPROACH")] + Approach, +} + +/// Output format options +#[derive(Debug, Clone)] +pub enum OutputFormat { + Json, + Text, +} + +/// Vector table format options (for VECTORS ephemeris type) +#[derive(Debug, Clone)] +pub enum VectorTable { + /// State vector {x,y,z,vx,vy,vz} + StateVector, + /// Position and velocity components + PositionVelocity, + /// State vector with coordinate system labels + StateVectorWithLabels, + /// Position vector only {x,y,z} + PositionOnly, + /// Velocity vector only {vx,vy,vz} + VelocityOnly, + /// Both position and velocity vectors separately + PositionAndVelocity, +} + +/// Vector corrections for ephemeris calculations +#[derive(Debug, Clone)] +pub enum VectorCorrections { + /// No corrections (geometric states) + None, + /// Light-time correction only + LightTime, + /// Light-time and stellar aberration corrections + LightTimeAndAberration, +} + +/// Reference plane options +#[derive(Debug, Clone)] +pub enum ReferencePlane { + /// Earth orbital plane at J2000.0 + Ecliptic, + /// Reference frame + Frame, + /// Target body equatorial plane + BodyEquator, +} + +/// Reference system (coordinate frame) +#[derive(Debug, Clone)] +pub enum ReferenceSystem { + /// International Celestial Reference Frame + Icrf, + /// J2000.0 reference frame + J2000, + /// B1950.0 reference frame + B1950, +} + +/// Output distance and velocity units +#[derive(Debug, Clone)] +pub enum OutputUnits { + /// Kilometers and km/s + KilometersPerSecond, + /// AU and AU/day + AuPerDay, + /// Kilometers and km/day + KilometersPerDay, +} + +/// Time scale options +#[derive(Debug, Clone)] +pub enum TimeType { + /// Barycentric Dynamical Time + Tdb, + /// Universal Time + Ut, + /// Terrestrial Time + Tt, +} + +/// Time precision for output +#[derive(Debug, Clone)] +pub enum TimeDigits { + /// Round to nearest minute + Minutes, + /// Round to nearest second + Seconds, + /// Include fractional seconds + FracSec, +} + +/// Yes/No boolean options +#[derive(Debug, Clone)] +pub enum YesNo { + Yes, + No, +} + +/// Angle format options +#[derive(Debug, Clone)] +pub enum AngleFormat { + /// Hours, minutes, seconds + Hms, + /// Decimal degrees + Deg, +} + +/// Major celestial bodies with their standard JPL Horizons IDs +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum MajorBody { + // Solar System + /// Solar System Barycenter (ID: 0) + SolarSystemBarycenter, + + // Planet Barycenters + /// Mercury Barycenter (ID: 1) + MercuryBarycenter, + /// Venus Barycenter (ID: 2) + VenusBarycenter, + /// Earth-Moon Barycenter (ID: 3) + EarthMoonBarycenter, + /// Mars Barycenter (ID: 4) + MarsBarycenter, + /// Jupiter Barycenter (ID: 5) + JupiterBarycenter, + /// Saturn Barycenter (ID: 6) + SaturnBarycenter, + /// Uranus Barycenter (ID: 7) + UranusBarycenter, + /// Neptune Barycenter (ID: 8) + NeptuneBarycenter, + /// Pluto Barycenter (ID: 9) + PlutoBarycenter, + + // Central Bodies + /// Sun (ID: 10) + Sun, + /// Mercury (ID: 199) + Mercury, + /// Venus (ID: 299) + Venus, + /// Earth (ID: 399) + Earth, + /// Mars (ID: 499) + Mars, + /// Jupiter (ID: 599) + Jupiter, + /// Saturn (ID: 699) + Saturn, + /// Uranus (ID: 799) + Uranus, + /// Neptune (ID: 899) + Neptune, + /// Pluto (ID: 999) + Pluto, + + // Lagrange Points + /// SEMB-L1 (ID: 31) + SembL1, + /// SEMB-L2 (ID: 32) + SembL2, + /// SEMB-L4 (ID: 34) + SembL4, + /// SEMB-L5 (ID: 35) + SembL5, + /// EM-L1 (ID: 3011) + EmL1, + /// EM-L2 (ID: 3012) + EmL2, + /// EM-L4 (ID: 3014) + EmL4, + /// EM-L5 (ID: 3015) + EmL5, + + // Major Moons + /// Moon / Luna (ID: 301) + Moon, + + // Mars Moons + /// Phobos - Mars I (ID: 401) + Phobos, + /// Deimos - Mars II (ID: 402) + Deimos, + + // Jupiter Moons + /// Io - Jupiter I (ID: 501) + Io, + /// Europa - Jupiter II (ID: 502) + Europa, + /// Ganymede - Jupiter III (ID: 503) + Ganymede, + /// Callisto - Jupiter IV (ID: 504) + Callisto, + /// Amalthea - Jupiter V (ID: 505) + Amalthea, + /// Himalia - Jupiter VI (ID: 506) + Himalia, + /// Elara - Jupiter VII (ID: 507) + Elara, + /// Pasiphae - Jupiter VIII (ID: 508) + Pasiphae, + /// Sinope - Jupiter IX (ID: 509) + Sinope, + /// Lysithea - Jupiter X (ID: 510) + Lysithea, + /// Carme - Jupiter XI (ID: 511) + Carme, + /// Ananke - Jupiter XII (ID: 512) + Ananke, + /// Leda - Jupiter XIII (ID: 513) + Leda, + /// Thebe - Jupiter XIV (ID: 514) + Thebe, + /// Adrastea - Jupiter XV (ID: 515) + Adrastea, + /// Metis - Jupiter XVI (ID: 516) + Metis, + + // Saturn Moons + /// Mimas - Saturn I (ID: 601) + Mimas, + /// Enceladus - Saturn II (ID: 602) + Enceladus, + /// Tethys - Saturn III (ID: 603) + Tethys, + /// Dione - Saturn IV (ID: 604) + Dione, + /// Rhea - Saturn V (ID: 605) + Rhea, + /// Titan - Saturn VI (ID: 606) + Titan, + /// Hyperion - Saturn VII (ID: 607) + Hyperion, + /// Iapetus - Saturn VIII (ID: 608) + Iapetus, + /// Phoebe - Saturn IX (ID: 609) + Phoebe, + /// Janus - Saturn X (ID: 610) + Janus, + /// Epimetheus - Saturn XI (ID: 611) + Epimetheus, + /// Helene - Saturn XII (ID: 612) + Helene, + /// Telesto - Saturn XIII (ID: 613) + Telesto, + /// Calypso - Saturn XIV (ID: 614) + Calypso, + /// Atlas - Saturn XV (ID: 615) + Atlas, + /// Prometheus - Saturn XVI (ID: 616) + Prometheus, + /// Pandora - Saturn XVII (ID: 617) + Pandora, + /// Pan - Saturn XVIII (ID: 618) + Pan, + + // Uranus Moons + /// Ariel - Uranus I (ID: 701) + Ariel, + /// Umbriel - Uranus II (ID: 702) + Umbriel, + /// Titania - Uranus III (ID: 703) + Titania, + /// Oberon - Uranus IV (ID: 704) + Oberon, + /// Miranda - Uranus V (ID: 705) + Miranda, + /// Cordelia - Uranus VI (ID: 706) + Cordelia, + /// Ophelia - Uranus VII (ID: 707) + Ophelia, + /// Bianca - Uranus VIII (ID: 708) + Bianca, + /// Cressida - Uranus IX (ID: 709) + Cressida, + /// Desdemona - Uranus X (ID: 710) + Desdemona, + /// Juliet - Uranus XI (ID: 711) + Juliet, + /// Portia - Uranus XII (ID: 712) + Portia, + /// Rosalind - Uranus XIII (ID: 713) + Rosalind, + /// Belinda - Uranus XIV (ID: 714) + Belinda, + /// Puck - Uranus XV (ID: 715) + Puck, + /// Caliban - Uranus XVI (ID: 716) + Caliban, + /// Sycorax - Uranus XVII (ID: 717) + Sycorax, + /// Prospero - Uranus XVIII (ID: 718) + Prospero, + /// Setebos - Uranus XIX (ID: 719) + Setebos, + /// Stephano - Uranus XX (ID: 720) + Stephano, + /// Trinculo - Uranus XXI (ID: 721) + Trinculo, + /// Francisco - Uranus XXII (ID: 722) + Francisco, + /// Margaret - Uranus XXIII (ID: 723) + Margaret, + /// Ferdinand - Uranus XXIV (ID: 724) + Ferdinand, + /// Perdita - Uranus XXV (ID: 725) + Perdita, + /// Mab - Uranus XXVI (ID: 726) + Mab, + /// Cupid - Uranus XXVII (ID: 727) + Cupid, + + // Neptune Moons + /// Triton - Neptune I (ID: 801) + Triton, + /// Nereid - Neptune II (ID: 802) + Nereid, + /// Naiad - Neptune III (ID: 803) + Naiad, + /// Thalassa - Neptune IV (ID: 804) + Thalassa, + /// Despina - Neptune V (ID: 805) + Despina, + /// Galatea - Neptune VI (ID: 806) + Galatea, + /// Larissa - Neptune VII (ID: 807) + Larissa, + /// Proteus - Neptune VIII (ID: 808) + Proteus, + /// Halimede - Neptune IX (ID: 809) + Halimede, + /// Psamathe - Neptune X (ID: 810) + Psamathe, + /// Sao - Neptune XI (ID: 811) + Sao, + /// Laomedeia - Neptune XII (ID: 812) + Laomedeia, + /// Neso - Neptune XIII (ID: 813) + Neso, + /// Hippocamp - Neptune XIV (ID: 814) + Hippocamp, + + // Pluto Moons + /// Charon - Pluto I (ID: 901) + Charon, + /// Nix - Pluto II (ID: 902) + Nix, + /// Hydra - Pluto III (ID: 903) + Hydra, + /// Kerberos - Pluto IV (ID: 904) + Kerberos, + /// Styx - Pluto V (ID: 905) + Styx, + + // Custom body by ID + /// Custom body specified by JPL Horizons ID + Custom(String), +} + +/// Time units for step size specification +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum TimeUnit { + /// Minutes + Minutes, + /// Hours + Hours, + /// Days + Days, + /// Months + Months, + /// Years + Years, +} + +/// Step size specification for ephemeris output intervals +#[derive(Debug, Clone, PartialEq)] +pub enum StepSize { + /// Fixed calendar intervals (e.g., "1 d", "3 h") + Calendar { value: u32, unit: TimeUnit }, + /// Variable angular motion stepping in arc-minutes (e.g., "VAR 600") + AngularMotion { arc_minutes: u32 }, + /// Raw string for complex patterns + Raw(String), +} + +/// Body command specification for JPL Horizons queries +#[derive(Debug, Clone, PartialEq)] +pub enum BodyCommand { + /// Major body using predefined enum + Major(MajorBody), + /// Small body by designation (e.g., "1;", "DES=1999 AN10;") + SmallBody(String), + /// Raw command string + Raw(String), +} + +/// Common parameters for all ephemeris types +#[derive(Debug, Clone)] +pub struct CommonParams { + /// Target body command + pub command: BodyCommand, + /// Toggle object summary data + pub obj_data: Option, + /// Toggle ephemeris generation + pub make_ephem: Option, + /// Coordinate center/origin + pub center: Option, + /// Start time for ephemeris + pub start_time: Option>, + /// Stop time for ephemeris + pub stop_time: Option>, + /// Step size for output interval + pub step_size: Option, + /// Input/output timescale + pub time_type: Option, + /// Reference frame + pub ref_system: Option, + /// Comma-separated value output + pub csv_format: Option, + /// Output format + pub format: Option, +} + +/// Parameters specific to OBSERVER ephemeris type +#[derive(Debug, Clone)] +pub struct ObserverParams { + /// Common parameters + pub common: CommonParams, + /// Output quantity codes + pub quantities: Option, + /// Local civil time offset + pub time_zone: Option, + /// RA/DEC output format + pub ang_format: Option, + /// Refraction correction + pub apparent: Option, + /// Range quantity units + pub range_units: Option, + /// Solar elongation bounds + pub solar_elong: Option, + /// Optical airmass cutoff + pub airmass: Option, + /// Rise/transit/set output only + pub r_t_s_only: Option, +} + +/// Parameters specific to VECTORS ephemeris type +#[derive(Debug, Clone)] +pub struct VectorParams { + /// Common parameters + pub common: CommonParams, + /// Reference plane + pub ref_plane: Option, + /// Distance/time units + pub out_units: Option, + /// Vector table format + pub vec_table: Option, + /// Vector correction level + pub vec_corr: Option, + /// Vector component labeling + pub vec_labels: Option, +} + +/// Parameters specific to ELEMENTS ephemeris type +#[derive(Debug, Clone)] +pub struct ElementParams { + /// Common parameters + pub common: CommonParams, + /// Periapsis time type + pub tp_type: Option, + /// Element labeling + pub elm_labels: Option, +} + +/// Parameters specific to SPK ephemeris type +#[derive(Debug, Clone)] +pub struct SpkParams { + /// Common parameters + pub common: CommonParams, + /// SPK segment identifier + pub spk_id: Option, +} + +/// JPL Horizons API response structure +#[derive(Debug, Deserialize)] +pub struct HorizonsResponse { + pub signature: Option, + pub result: Option, + pub error: Option, +} + +/// Signature information from JPL Horizons response +#[derive(Debug, Deserialize)] +pub struct Signature { + pub source: Option, + pub version: Option, +} + +/// Single vector data point from JPL Horizons +#[derive(Debug, Clone)] +pub struct VectorData { + /// Julian Day Number + pub julian_day: f64, + /// Position vector in AU (X, Y, Z) + pub position: DVec3, + /// Velocity vector in AU/day (VX, VY, VZ) + pub velocity: DVec3, +} + +/// Collection of ephemeris vector data +#[derive(Debug, Clone)] +pub struct EphemerisVectors { + /// Vector data points + pub data: Vec, +} + +/// Information about a major body from JPL Horizons +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MajorBodyInfo { + /// Horizons ID number + pub id: String, + /// Common name of the body + pub name: String, + /// Official designation (if any) + pub designation: Option, + /// Additional aliases or identifiers + pub aliases: Option, +} + +/// Collection of major bodies from JPL Horizons +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct MajorBodies { + /// List of major bodies + pub bodies: Vec, +} + +/// Errors that can occur when using the JPL Horizons client +#[derive(Debug, thiserror::Error)] +pub enum HorizonsError { + #[error("HTTP request failed: {0}")] + Request(#[from] reqwest::Error), + #[error("JSON parsing failed: {0}")] + Json(#[from] serde_json::Error), + #[error("API returned error: {0}")] + Api(String), + #[error("Invalid parameter: {0}")] + InvalidParameter(String), + #[error("Vector parsing failed: {0}")] + VectorParsing(String), + #[error("Major body parsing failed: {0}")] + MajorBodyParsing(String), +} + +// Enum to string conversion implementations +impl OutputFormat { + pub fn as_str(&self) -> &'static str { + match self { + OutputFormat::Json => "json", + OutputFormat::Text => "text", + } + } +} + +impl VectorTable { + pub fn as_str(&self) -> &'static str { + match self { + VectorTable::StateVector => "1", + VectorTable::PositionVelocity => "2", + VectorTable::StateVectorWithLabels => "3", + VectorTable::PositionOnly => "4", + VectorTable::VelocityOnly => "5", + VectorTable::PositionAndVelocity => "6", + } + } +} + +impl VectorCorrections { + pub fn as_str(&self) -> &'static str { + match self { + VectorCorrections::None => "NONE", + VectorCorrections::LightTime => "LT", + VectorCorrections::LightTimeAndAberration => "LT+S", + } + } +} + +impl ReferencePlane { + pub fn as_str(&self) -> &'static str { + match self { + ReferencePlane::Ecliptic => "ECLIPTIC", + ReferencePlane::Frame => "FRAME", + ReferencePlane::BodyEquator => "BODY EQUATOR", + } + } +} + +impl ReferenceSystem { + pub fn as_str(&self) -> &'static str { + match self { + ReferenceSystem::Icrf => "ICRF", + ReferenceSystem::J2000 => "J2000", + ReferenceSystem::B1950 => "B1950", + } + } +} + +impl OutputUnits { + pub fn as_str(&self) -> &'static str { + match self { + OutputUnits::KilometersPerSecond => "KM-S", + OutputUnits::AuPerDay => "AU-D", + OutputUnits::KilometersPerDay => "KM-D", + } + } +} + +impl TimeType { + pub fn as_str(&self) -> &'static str { + match self { + TimeType::Tdb => "TDB", + TimeType::Ut => "UT", + TimeType::Tt => "TT", + } + } +} + +impl TimeDigits { + pub fn as_str(&self) -> &'static str { + match self { + TimeDigits::Minutes => "MINUTES", + TimeDigits::Seconds => "SECONDS", + TimeDigits::FracSec => "FRACSEC", + } + } +} + +impl YesNo { + pub fn as_str(&self) -> &'static str { + match self { + YesNo::Yes => "YES", + YesNo::No => "NO", + } + } +} + +impl AngleFormat { + pub fn as_str(&self) -> &'static str { + match self { + AngleFormat::Hms => "HMS", + AngleFormat::Deg => "DEG", + } + } +} + +impl MajorBody { + /// Get the JPL Horizons ID for this major body + pub fn id(&self) -> &str { + match self { + // Solar System + MajorBody::SolarSystemBarycenter => "0", + + // Planet Barycenters + MajorBody::MercuryBarycenter => "1", + MajorBody::VenusBarycenter => "2", + MajorBody::EarthMoonBarycenter => "3", + MajorBody::MarsBarycenter => "4", + MajorBody::JupiterBarycenter => "5", + MajorBody::SaturnBarycenter => "6", + MajorBody::UranusBarycenter => "7", + MajorBody::NeptuneBarycenter => "8", + MajorBody::PlutoBarycenter => "9", + + // Central Bodies + MajorBody::Sun => "10", + MajorBody::Mercury => "199", + MajorBody::Venus => "299", + MajorBody::Earth => "399", + MajorBody::Mars => "499", + MajorBody::Jupiter => "599", + MajorBody::Saturn => "699", + MajorBody::Uranus => "799", + MajorBody::Neptune => "899", + MajorBody::Pluto => "999", + + // Lagrange Points + MajorBody::SembL1 => "31", + MajorBody::SembL2 => "32", + MajorBody::SembL4 => "34", + MajorBody::SembL5 => "35", + MajorBody::EmL1 => "3011", + MajorBody::EmL2 => "3012", + MajorBody::EmL4 => "3014", + MajorBody::EmL5 => "3015", + + // Major Moons + MajorBody::Moon => "301", + + // Mars Moons + MajorBody::Phobos => "401", + MajorBody::Deimos => "402", + + // Jupiter Moons + MajorBody::Io => "501", + MajorBody::Europa => "502", + MajorBody::Ganymede => "503", + MajorBody::Callisto => "504", + MajorBody::Amalthea => "505", + MajorBody::Himalia => "506", + MajorBody::Elara => "507", + MajorBody::Pasiphae => "508", + MajorBody::Sinope => "509", + MajorBody::Lysithea => "510", + MajorBody::Carme => "511", + MajorBody::Ananke => "512", + MajorBody::Leda => "513", + MajorBody::Thebe => "514", + MajorBody::Adrastea => "515", + MajorBody::Metis => "516", + + // Saturn Moons + MajorBody::Mimas => "601", + MajorBody::Enceladus => "602", + MajorBody::Tethys => "603", + MajorBody::Dione => "604", + MajorBody::Rhea => "605", + MajorBody::Titan => "606", + MajorBody::Hyperion => "607", + MajorBody::Iapetus => "608", + MajorBody::Phoebe => "609", + MajorBody::Janus => "610", + MajorBody::Epimetheus => "611", + MajorBody::Helene => "612", + MajorBody::Telesto => "613", + MajorBody::Calypso => "614", + MajorBody::Atlas => "615", + MajorBody::Prometheus => "616", + MajorBody::Pandora => "617", + MajorBody::Pan => "618", + + // Uranus Moons + MajorBody::Ariel => "701", + MajorBody::Umbriel => "702", + MajorBody::Titania => "703", + MajorBody::Oberon => "704", + MajorBody::Miranda => "705", + MajorBody::Cordelia => "706", + MajorBody::Ophelia => "707", + MajorBody::Bianca => "708", + MajorBody::Cressida => "709", + MajorBody::Desdemona => "710", + MajorBody::Juliet => "711", + MajorBody::Portia => "712", + MajorBody::Rosalind => "713", + MajorBody::Belinda => "714", + MajorBody::Puck => "715", + MajorBody::Caliban => "716", + MajorBody::Sycorax => "717", + MajorBody::Prospero => "718", + MajorBody::Setebos => "719", + MajorBody::Stephano => "720", + MajorBody::Trinculo => "721", + MajorBody::Francisco => "722", + MajorBody::Margaret => "723", + MajorBody::Ferdinand => "724", + MajorBody::Perdita => "725", + MajorBody::Mab => "726", + MajorBody::Cupid => "727", + + // Neptune Moons + MajorBody::Triton => "801", + MajorBody::Nereid => "802", + MajorBody::Naiad => "803", + MajorBody::Thalassa => "804", + MajorBody::Despina => "805", + MajorBody::Galatea => "806", + MajorBody::Larissa => "807", + MajorBody::Proteus => "808", + MajorBody::Halimede => "809", + MajorBody::Psamathe => "810", + MajorBody::Sao => "811", + MajorBody::Laomedeia => "812", + MajorBody::Neso => "813", + MajorBody::Hippocamp => "814", + + // Pluto Moons + MajorBody::Charon => "901", + MajorBody::Nix => "902", + MajorBody::Hydra => "903", + MajorBody::Kerberos => "904", + MajorBody::Styx => "905", + + MajorBody::Custom(id) => id, + } + } + + /// Get the common name of this major body + pub fn name(&self) -> &str { + match self { + MajorBody::SolarSystemBarycenter => "Solar System Barycenter", + MajorBody::MercuryBarycenter => "Mercury Barycenter", + MajorBody::VenusBarycenter => "Venus Barycenter", + MajorBody::EarthMoonBarycenter => "Earth-Moon Barycenter", + MajorBody::MarsBarycenter => "Mars Barycenter", + MajorBody::JupiterBarycenter => "Jupiter Barycenter", + MajorBody::SaturnBarycenter => "Saturn Barycenter", + MajorBody::UranusBarycenter => "Uranus Barycenter", + MajorBody::NeptuneBarycenter => "Neptune Barycenter", + MajorBody::PlutoBarycenter => "Pluto Barycenter", + MajorBody::Sun => "Sun", + MajorBody::Mercury => "Mercury", + MajorBody::Venus => "Venus", + MajorBody::Earth => "Earth", + MajorBody::Mars => "Mars", + MajorBody::Jupiter => "Jupiter", + MajorBody::Saturn => "Saturn", + MajorBody::Uranus => "Uranus", + MajorBody::Neptune => "Neptune", + MajorBody::Pluto => "Pluto", + + // Lagrange Points + MajorBody::SembL1 => "SEMB-L1", + MajorBody::SembL2 => "SEMB-L2", + MajorBody::SembL4 => "SEMB-L4", + MajorBody::SembL5 => "SEMB-L5", + MajorBody::EmL1 => "EM-L1", + MajorBody::EmL2 => "EM-L2", + MajorBody::EmL4 => "EM-L4", + MajorBody::EmL5 => "EM-L5", + + MajorBody::Moon => "Moon", + + // Mars Moons + MajorBody::Phobos => "Phobos", + MajorBody::Deimos => "Deimos", + + // Jupiter Moons + MajorBody::Io => "Io", + MajorBody::Europa => "Europa", + MajorBody::Ganymede => "Ganymede", + MajorBody::Callisto => "Callisto", + MajorBody::Amalthea => "Amalthea", + MajorBody::Himalia => "Himalia", + MajorBody::Elara => "Elara", + MajorBody::Pasiphae => "Pasiphae", + MajorBody::Sinope => "Sinope", + MajorBody::Lysithea => "Lysithea", + MajorBody::Carme => "Carme", + MajorBody::Ananke => "Ananke", + MajorBody::Leda => "Leda", + MajorBody::Thebe => "Thebe", + MajorBody::Adrastea => "Adrastea", + MajorBody::Metis => "Metis", + + // Saturn Moons + MajorBody::Mimas => "Mimas", + MajorBody::Enceladus => "Enceladus", + MajorBody::Tethys => "Tethys", + MajorBody::Dione => "Dione", + MajorBody::Rhea => "Rhea", + MajorBody::Titan => "Titan", + MajorBody::Hyperion => "Hyperion", + MajorBody::Iapetus => "Iapetus", + MajorBody::Phoebe => "Phoebe", + MajorBody::Janus => "Janus", + MajorBody::Epimetheus => "Epimetheus", + MajorBody::Helene => "Helene", + MajorBody::Telesto => "Telesto", + MajorBody::Calypso => "Calypso", + MajorBody::Atlas => "Atlas", + MajorBody::Prometheus => "Prometheus", + MajorBody::Pandora => "Pandora", + MajorBody::Pan => "Pan", + + // Uranus Moons + MajorBody::Ariel => "Ariel", + MajorBody::Umbriel => "Umbriel", + MajorBody::Titania => "Titania", + MajorBody::Oberon => "Oberon", + MajorBody::Miranda => "Miranda", + MajorBody::Cordelia => "Cordelia", + MajorBody::Ophelia => "Ophelia", + MajorBody::Bianca => "Bianca", + MajorBody::Cressida => "Cressida", + MajorBody::Desdemona => "Desdemona", + MajorBody::Juliet => "Juliet", + MajorBody::Portia => "Portia", + MajorBody::Rosalind => "Rosalind", + MajorBody::Belinda => "Belinda", + MajorBody::Puck => "Puck", + MajorBody::Caliban => "Caliban", + MajorBody::Sycorax => "Sycorax", + MajorBody::Prospero => "Prospero", + MajorBody::Setebos => "Setebos", + MajorBody::Stephano => "Stephano", + MajorBody::Trinculo => "Trinculo", + MajorBody::Francisco => "Francisco", + MajorBody::Margaret => "Margaret", + MajorBody::Ferdinand => "Ferdinand", + MajorBody::Perdita => "Perdita", + MajorBody::Mab => "Mab", + MajorBody::Cupid => "Cupid", + + // Neptune Moons + MajorBody::Triton => "Triton", + MajorBody::Nereid => "Nereid", + MajorBody::Naiad => "Naiad", + MajorBody::Thalassa => "Thalassa", + MajorBody::Despina => "Despina", + MajorBody::Galatea => "Galatea", + MajorBody::Larissa => "Larissa", + MajorBody::Proteus => "Proteus", + MajorBody::Halimede => "Halimede", + MajorBody::Psamathe => "Psamathe", + MajorBody::Sao => "Sao", + MajorBody::Laomedeia => "Laomedeia", + MajorBody::Neso => "Neso", + MajorBody::Hippocamp => "Hippocamp", + + // Pluto Moons + MajorBody::Charon => "Charon", + MajorBody::Nix => "Nix", + MajorBody::Hydra => "Hydra", + MajorBody::Kerberos => "Kerberos", + MajorBody::Styx => "Styx", + + MajorBody::Custom(_) => "Custom Body", + } + } +} + +impl TimeUnit { + pub fn as_str(&self) -> &'static str { + match self { + TimeUnit::Minutes => "m", + TimeUnit::Hours => "h", + TimeUnit::Days => "d", + TimeUnit::Months => "mo", + TimeUnit::Years => "y", + } + } +} + +impl StepSize { + /// Convert to the string format expected by JPL Horizons API + pub fn as_str(&self) -> String { + match self { + StepSize::Calendar { value, unit } => format!("{} {}", value, unit.as_str()), + StepSize::AngularMotion { arc_minutes } => format!("VAR {}", arc_minutes), + StepSize::Raw(s) => s.clone(), + } + } +} + +impl BodyCommand { + /// Convert to the string format expected by JPL Horizons API + pub fn as_str(&self) -> String { + match self { + BodyCommand::Major(body) => body.id().to_string(), + BodyCommand::SmallBody(designation) => designation.clone(), + BodyCommand::Raw(command) => command.clone(), + } + } + + pub fn name(&self) -> String { + match self { + BodyCommand::Major(body) => body.name().to_string(), + BodyCommand::SmallBody(designation) => designation.clone(), + BodyCommand::Raw(command) => command.clone(), + } + } +} + +// Convenience constructors for common usage patterns +impl StepSize { + /// Create a step size of N minutes + pub fn minutes(value: u32) -> Self { + StepSize::Calendar { + value, + unit: TimeUnit::Minutes, + } + } + + /// Create a step size of N hours + pub fn hours(value: u32) -> Self { + StepSize::Calendar { + value, + unit: TimeUnit::Hours, + } + } + + /// Create a step size of N days + pub fn days(value: u32) -> Self { + StepSize::Calendar { + value, + unit: TimeUnit::Days, + } + } + + /// Create angular motion stepping with N arc-minutes + pub fn angular_motion(arc_minutes: u32) -> Self { + StepSize::AngularMotion { arc_minutes } + } +} + +impl BodyCommand { + /// Create command for the Sun + pub fn sun() -> Self { + BodyCommand::Major(MajorBody::Sun) + } + + /// Create command for Earth + pub fn earth() -> Self { + BodyCommand::Major(MajorBody::Earth) + } + + /// Create command for the Moon + pub fn moon() -> Self { + BodyCommand::Major(MajorBody::Moon) + } + + /// Create command for Mars + pub fn mars() -> Self { + BodyCommand::Major(MajorBody::Mars) + } + + /// Create command for Jupiter + pub fn jupiter() -> Self { + BodyCommand::Major(MajorBody::Jupiter) + } + + /// Create command for a body at the Sun center (@sun) + pub fn sun_center() -> Self { + BodyCommand::Raw("@sun".to_string()) + } + + /// Create command for a body at Earth center (@earth) + pub fn earth_center() -> Self { + BodyCommand::Raw("@earth".to_string()) + } +} + +impl Default for CommonParams { + fn default() -> Self { + Self { + command: BodyCommand::Major(MajorBody::Earth), // Default to Earth + obj_data: None, + make_ephem: Some(YesNo::Yes), // Default to generating ephemeris + center: None, + start_time: None, + stop_time: None, + step_size: None, + time_type: None, + ref_system: None, + csv_format: None, + format: Some(OutputFormat::Text), + } + } +} + +impl CommonParams { + /// Create common parameters with command + pub fn new(command: BodyCommand) -> Self { + Self { + command, + ..Default::default() + } + } + + /// Create common parameters with command from string (for backward compatibility) + pub fn new_from_string(command: String) -> Self { + Self { + command: BodyCommand::Raw(command), + ..Default::default() + } + } +} + +impl ObserverParams { + /// Create observer parameters with command + pub fn new(command: BodyCommand) -> Self { + Self { + common: CommonParams::new(command), + quantities: None, + time_zone: None, + ang_format: None, + apparent: None, + range_units: None, + solar_elong: None, + airmass: None, + r_t_s_only: None, + } + } + + /// Create observer parameters with command from string (for backward compatibility) + pub fn new_from_string(command: String) -> Self { + Self::new(BodyCommand::Raw(command)) + } + + /// Configure for typical ground-based observations + pub fn ground_based(command: BodyCommand) -> Self { + let mut common = CommonParams::new(command); + common.ref_system = Some(ReferenceSystem::J2000); + + Self { + common, + ang_format: Some(AngleFormat::Deg), + apparent: Some(YesNo::Yes), // Apply refraction correction + quantities: None, // Let API use defaults + time_zone: None, + range_units: None, + solar_elong: None, + airmass: None, + r_t_s_only: None, + } + } +} + +impl VectorParams { + /// Create vector parameters with command + pub fn new(command: BodyCommand) -> Self { + Self { + common: CommonParams::new(command), + ref_plane: Some(ReferencePlane::Ecliptic), + out_units: Some(OutputUnits::AuPerDay), + vec_table: Some(VectorTable::PositionVelocity), + vec_corr: Some(VectorCorrections::None), // Geometric states + vec_labels: Some(YesNo::Yes), + } + } + + /// Create vector parameters with command from string (for backward compatibility) + pub fn new_from_string(command: String) -> Self { + Self::new(BodyCommand::Raw(command)) + } + + /// Configure for high-precision calculations + pub fn high_precision(command: BodyCommand) -> Self { + let mut common = CommonParams::new(command); + common.time_type = Some(TimeType::Tdb); // Barycentric Dynamical Time + common.ref_system = Some(ReferenceSystem::J2000); + + Self { + common, + ref_plane: Some(ReferencePlane::Ecliptic), + out_units: Some(OutputUnits::AuPerDay), + vec_table: Some(VectorTable::PositionVelocity), + vec_corr: Some(VectorCorrections::None), // No corrections for precision + vec_labels: Some(YesNo::Yes), + } + } +} + +impl ElementParams { + /// Create element parameters with command + pub fn new(command: BodyCommand) -> Self { + Self { + common: CommonParams::new(command), + tp_type: None, + elm_labels: Some(YesNo::Yes), + } + } + + /// Create element parameters with command from string (for backward compatibility) + pub fn new_from_string(command: String) -> Self { + Self::new(BodyCommand::Raw(command)) + } +} + +impl SpkParams { + /// Create SPK parameters with command + pub fn new(command: BodyCommand) -> Self { + Self { + common: CommonParams::new(command), + spk_id: None, + } + } + + /// Create SPK parameters with command from string (for backward compatibility) + pub fn new_from_string(command: String) -> Self { + Self::new(BodyCommand::Raw(command)) + } +} + +impl JplHorizonsClient { + /// Create a new JPL Horizons client + pub fn new() -> Self { + Self { + client: Client::new(), + base_url: "https://ssd.jpl.nasa.gov/api/horizons.api".to_string(), + } + } + + /// Create a new JPL Horizons client with custom HTTP client + pub fn with_client(client: Client) -> Self { + Self { + client, + base_url: "https://ssd.jpl.nasa.gov/api/horizons.api".to_string(), + } + } + + /// Query observer ephemeris from JPL Horizons API + pub async fn query_observer( + &self, + params: &ObserverParams, + ) -> Result { + let mut query_params = vec![ + ("COMMAND", format!("'{}'", params.common.command.as_str())), + ("EPHEM_TYPE", "'OBSERVER'".to_string()), + ]; + + // Add common parameters + self.add_common_params(&mut query_params, ¶ms.common); + + // Add observer-specific parameters + if let Some(ref quantities) = params.quantities { + query_params.push(("QUANTITIES", format!("'{}'", quantities))); + } + + if let Some(ref time_zone) = params.time_zone { + query_params.push(("TIME_ZONE", format!("'{}'", time_zone))); + } + + if let Some(ref ang_format) = params.ang_format { + query_params.push(("ANG_FORMAT", ang_format.as_str().to_string())); + } + + if let Some(ref apparent) = params.apparent { + query_params.push(("APPARENT", apparent.as_str().to_string())); + } + + if let Some(ref range_units) = params.range_units { + query_params.push(("RANGE_UNITS", format!("'{}'", range_units))); + } + + if let Some(ref solar_elong) = params.solar_elong { + query_params.push(("SOLAR_ELONG", format!("'{}'", solar_elong))); + } + + if let Some(airmass) = params.airmass { + query_params.push(("AIRMASS", airmass.to_string())); + } + + if let Some(ref r_t_s_only) = params.r_t_s_only { + query_params.push(("R_T_S_ONLY", r_t_s_only.as_str().to_string())); + } + + self.execute_query(query_params, ¶ms.common.format) + .await + } + + /// Query vector ephemeris from JPL Horizons API + pub async fn query_vectors( + &self, + params: &VectorParams, + ) -> Result { + let mut query_params = vec![ + ("COMMAND", format!("'{}'", params.common.command.as_str())), + ("EPHEM_TYPE", "'VECTORS'".to_string()), + ]; + + // Add common parameters + self.add_common_params(&mut query_params, ¶ms.common); + + // Add vector-specific parameters + if let Some(ref ref_plane) = params.ref_plane { + query_params.push(("REF_PLANE", format!("'{}'", ref_plane.as_str()))); + } + + if let Some(ref out_units) = params.out_units { + query_params.push(("OUT_UNITS", format!("'{}'", out_units.as_str()))); + } + + if let Some(ref vec_table) = params.vec_table { + query_params.push(("VEC_TABLE", vec_table.as_str().to_string())); + } + + if let Some(ref vec_corr) = params.vec_corr { + query_params.push(("VEC_CORR", format!("'{}'", vec_corr.as_str()))); + } + + if let Some(ref vec_labels) = params.vec_labels { + query_params.push(("VEC_LABELS", vec_labels.as_str().to_string())); + } + + self.execute_query(query_params, ¶ms.common.format) + .await + } + + /// Query orbital elements from JPL Horizons API + pub async fn query_elements( + &self, + params: &ElementParams, + ) -> Result { + let mut query_params = vec![ + ("COMMAND", format!("'{}'", params.common.command.as_str())), + ("EPHEM_TYPE", "'ELEMENTS'".to_string()), + ]; + + // Add common parameters + self.add_common_params(&mut query_params, ¶ms.common); + + // Add element-specific parameters + if let Some(ref tp_type) = params.tp_type { + query_params.push(("TP_TYPE", format!("'{}'", tp_type))); + } + + if let Some(ref elm_labels) = params.elm_labels { + query_params.push(("ELM_LABELS", elm_labels.as_str().to_string())); + } + + self.execute_query(query_params, ¶ms.common.format) + .await + } + + /// Helper method to add common parameters to query + fn add_common_params(&self, query_params: &mut Vec<(&str, String)>, common: &CommonParams) { + if let Some(ref obj_data) = common.obj_data { + query_params.push(("OBJ_DATA", obj_data.as_str().to_string())); + } + + if let Some(ref make_ephem) = common.make_ephem { + query_params.push(("MAKE_EPHEM", make_ephem.as_str().to_string())); + } + + if let Some(ref center) = common.center { + query_params.push(("CENTER", format!("'{}'", center.as_str()))); + } + + if let Some(ref start_time) = common.start_time { + query_params.push(( + "START_TIME", + format!("'{}'", start_time.format("%Y-%m-%d %H:%M")), + )); + } + + if let Some(ref stop_time) = common.stop_time { + query_params.push(( + "STOP_TIME", + format!("'{}'", stop_time.format("%Y-%m-%d %H:%M")), + )); + } + + if let Some(ref step_size) = common.step_size { + query_params.push(("STEP_SIZE", format!("'{}'", step_size.as_str()))); + } + + if let Some(ref time_type) = common.time_type { + query_params.push(("TIME_TYPE", time_type.as_str().to_string())); + } + + if let Some(ref ref_system) = common.ref_system { + query_params.push(("REF_SYSTEM", format!("'{}'", ref_system.as_str()))); + } + + if let Some(ref csv_format) = common.csv_format { + query_params.push(("CSV_FORMAT", csv_format.as_str().to_string())); + } + + if let Some(ref format) = common.format { + query_params.push(("format", format.as_str().to_string())); + } + } + + /// Helper method to execute the query + async fn execute_query( + &self, + query_params: Vec<(&str, String)>, + format: &Option, + ) -> Result { + let response = self + .client + .get(&self.base_url) + .query(&query_params) + .send() + .await?; + + let response_text = response.text().await?; + + // Try to parse as JSON first + match serde_json::from_str::(&response_text) { + Ok(mut horizon_response) => { + // Check if API returned an error + if let Some(error) = &horizon_response.error { + return Err(HorizonsError::Api(error.clone())); + } + + // If format was text, store the raw response in result + if let Some(format) = format { + if format.as_str() == "text" { + horizon_response.result = Some(response_text); + } + } + + Ok(horizon_response) + } + Err(_) => { + // If JSON parsing fails, assume it's text format + Ok(HorizonsResponse { + signature: None, + result: Some(response_text), + error: None, + }) + } + } + } + + /// Get vector ephemeris for a celestial body (returns parsed structured data) + pub async fn get_vectors( + &self, + command: BodyCommand, + start_time: DateTime, + stop_time: DateTime, + step_size: Option, + center: Option, + ) -> Result { + let mut params = VectorParams::new(command); + params.common.start_time = Some(start_time); + params.common.stop_time = Some(stop_time); + params.common.step_size = step_size; + params.common.center = center; + + self.query_vectors(¶ms).await + } + + /// Get observer ephemeris for a celestial body + pub async fn get_observer( + &self, + command: BodyCommand, + start_time: DateTime, + stop_time: DateTime, + step_size: Option, + center: Option, + ) -> Result { + let mut params = ObserverParams::new(command); + params.common.start_time = Some(start_time); + params.common.stop_time = Some(stop_time); + params.common.step_size = step_size; + params.common.center = center; + params.common.format = Some(OutputFormat::Json); + + self.query_observer(¶ms).await + } + + /// Get orbital elements for a celestial body + pub async fn get_elements( + &self, + command: BodyCommand, + start_time: DateTime, + stop_time: DateTime, + step_size: Option, + center: Option, + ) -> Result { + let mut params = ElementParams::new(command); + params.common.start_time = Some(start_time); + params.common.stop_time = Some(stop_time); + params.common.step_size = step_size; + params.common.center = center; + params.common.format = Some(OutputFormat::Json); + + self.query_elements(¶ms).await + } + + /// Get list of all major bodies and their ID codes from JPL Horizons + /// Uses the special 'MB' command to retrieve the major bodies list + async fn get_major_bodies(&self) -> Result { + let query_params = vec![ + ("COMMAND", "'MB'".to_string()), + ("format", "text".to_string()), + ]; + + self.execute_query(query_params, &Some(OutputFormat::Text)) + .await + } + + /// Get parsed list of all major bodies and their ID codes from JPL Horizons + /// Returns structured data instead of raw text + pub async fn list_major_bodies(&self) -> Result { + let response = self.get_major_bodies().await?; + + if let Some(text_result) = response.result { + parse_major_bodies(&text_result) + } else { + Err(HorizonsError::MajorBodyParsing( + "No result data received".to_string(), + )) + } + } +} + +impl Default for JplHorizonsClient { + fn default() -> Self { + Self::new() + } +} + +/// Parse vector data from JPL Horizons text response +pub fn parse_vectors(text: &str) -> Result { + let mut data = Vec::new(); + + // Find the data section between $$SOE and $$EOE + let start_marker = "$$SOE"; + let end_marker = "$$EOE"; + + let start_pos = text + .find(start_marker) + .ok_or_else(|| HorizonsError::VectorParsing("Could not find $$SOE marker".to_string()))? + + start_marker.len(); + + let end_pos = text + .find(end_marker) + .ok_or_else(|| HorizonsError::VectorParsing("Could not find $$EOE marker".to_string()))?; + + let data_section = &text[start_pos..end_pos]; + + // Parse each data entry + let lines: Vec<&str> = data_section.lines().collect(); + let mut i = 0; + + while i < lines.len() { + let line = lines[i].trim(); + + // Skip empty lines + if line.is_empty() { + i += 1; + continue; + } + + // Look for Julian Day line (contains "=" and "A.D.") + if line.contains("=") && line.contains("A.D.") { + // Extract Julian Day from beginning of line + let julian_day = if let Some(space_pos) = line.find(' ') { + line[..space_pos].parse::().map_err(|_| { + HorizonsError::VectorParsing(format!("Could not parse Julian Day: {}", line)) + })? + } else { + return Err(HorizonsError::VectorParsing(format!( + "Invalid Julian Day line: {}", + line + ))); + }; + + // Parse position line (next line) + if i + 1 >= lines.len() { + return Err(HorizonsError::VectorParsing( + "Missing position line".to_string(), + )); + } + let pos_line = lines[i + 1].trim(); + let position = parse_vector_line(pos_line, &['X', 'Y', 'Z'])?; + + // Parse velocity line (line after position) + if i + 2 >= lines.len() { + return Err(HorizonsError::VectorParsing( + "Missing velocity line".to_string(), + )); + } + let vel_line = lines[i + 2].trim(); + let velocity = parse_vector_line(vel_line, &['V', 'X', 'Y'])?; // VX, VY, VZ + + data.push(VectorData { + julian_day, + position, + velocity, + }); + + i += 3; // Skip to next entry + } else { + i += 1; + } + } + + if data.is_empty() { + return Err(HorizonsError::VectorParsing( + "No vector data found".to_string(), + )); + } + + Ok(EphemerisVectors { data }) +} + +/// Parse a line containing vector components (X Y Z or VX VY VZ) +fn parse_vector_line(line: &str, prefixes: &[char]) -> Result { + let mut components = [0.0f64; 3]; + let mut found_count = 0; + + // Expected format: " X =-1.771350992727098E-01 Y = 9.672416867665306E-01 Z =-4.085281582511366E-06" + // or: " VX=-1.720762506872895E-02 VY=-3.158782144324866E-03 VZ= 1.049888594613343E-07" + + if prefixes == &['V', 'X', 'Y'] { + // Velocity line: VX= VY= VZ= + for (i, &prefix_char) in ['X', 'Y', 'Z'].iter().enumerate() { + let pattern = format!("V{}=", prefix_char); + if let Some(start) = line.find(&pattern) { + let value_start = start + pattern.len(); + let remaining = &line[value_start..]; + + // Find the end of this value (next space or V, or end of string) + let value_end = remaining.find(" V").unwrap_or(remaining.len()); + let value_str = remaining[..value_end].trim(); + + components[i] = value_str.parse::().map_err(|_| { + HorizonsError::VectorParsing(format!( + "Could not parse velocity component {}: {}", + prefix_char, value_str + )) + })?; + found_count += 1; + } + } + } else { + // Position line: X= Y= Z= + for (i, &prefix_char) in prefixes.iter().enumerate() { + let pattern = format!("{} =", prefix_char); + if let Some(start) = line.find(&pattern) { + let value_start = start + pattern.len(); + let remaining = &line[value_start..]; + + // Find the end of this value (next space followed by a letter, or end of string) + let mut value_end = remaining.len(); + for (j, c) in remaining.char_indices() { + if j > 0 && c == ' ' { + if let Some(next_char) = remaining.chars().nth(j + 1) { + if next_char.is_alphabetic() { + value_end = j; + break; + } + } + } + } + + let value_str = remaining[..value_end].trim(); + components[i] = value_str.parse::().map_err(|_| { + HorizonsError::VectorParsing(format!( + "Could not parse position component {}: {}", + prefix_char, value_str + )) + })?; + found_count += 1; + } + } + } + + if found_count != 3 { + return Err(HorizonsError::VectorParsing(format!( + "Expected 3 components, found {}: {}", + found_count, line + ))); + } + + Ok(DVec3::new(components[0], components[1], components[2])) +} + +/// Parse major bodies list from JPL Horizons text response +pub fn parse_major_bodies(text: &str) -> Result { + let mut bodies = Vec::new(); + let lines: Vec<&str> = text.lines().collect(); + + // Find the header line that starts with "ID#" + let mut start_index = None; + for (i, line) in lines.iter().enumerate() { + if line.trim().starts_with("ID#") { + start_index = Some(i + 2); // Skip header and separator line + break; + } + } + + let start_index = start_index.ok_or_else(|| { + HorizonsError::MajorBodyParsing("Could not find major bodies table".to_string()) + })?; + + // Parse each body entry + for line in lines.iter().skip(start_index) { + let line = line.trim(); + + // Skip empty lines and lines that are clearly not body entries + if line.is_empty() || line.starts_with("*") || line.starts_with("---") { + continue; + } + + // Parse the line format: "ID# Name Designation IAU/aliases/other" + // Handle columnar format by finding column positions + if line.len() < 10 { + continue; // Skip very short lines + } + + // Extract ID (first column, up to first space) + let id_end = line.find(' ').unwrap_or(line.len()); + let id = line[..id_end].trim().to_string(); + + if id.is_empty() || !id.chars().all(|c| c.is_ascii_digit()) { + continue; // Skip non-numeric IDs or empty + } + + // Extract name (starts after ID column, ends before designation column) + // Look for the name starting after some spaces following the ID + let remaining = &line[id_end..]; + let name_start = remaining.find(|c: char| !c.is_whitespace()).unwrap_or(0); + let name_section = &remaining[name_start..]; + + // Find the end of the name by looking for multiple spaces (indicating next column) + let mut name_end = name_section.len(); + let mut space_count = 0; + for (i, c) in name_section.char_indices() { + if c == ' ' { + space_count += 1; + if space_count >= 2 { + name_end = i; + break; + } + } else { + space_count = 0; + } + } + + let name = name_section[..name_end].trim().to_string(); + + if !name.is_empty() { + bodies.push(MajorBodyInfo { + id, + name, + designation: None, // Can be enhanced later with better parsing + aliases: None, // Can be enhanced later with better parsing + }); + } + } + + if bodies.is_empty() { + return Err(HorizonsError::MajorBodyParsing( + "No major bodies found in response".to_string(), + )); + } + + Ok(MajorBodies { bodies }) +} + +#[cfg(test)] +mod tests { + use super::*; + use bevy::math::DVec3; + use chrono::TimeZone; + use reqwest::Body; + + const SAMPLE_MOON_DATA: &str = r#"API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: July 31, 2013 Moon / (Earth) 301 +******************************************************************************* +$$SOE +2451545.000000000 = A.D. 2000-Jan-01 12:00:00.0000 TDB + X =-1.790843809223965E-01 Y = 9.654035607264573E-01 Z = 2.383726922995396E-04 + VX=-1.683595459141215E-02 VY=-3.580960720855671E-03 VZ=-6.540550604528720E-06 +2451545.000694444 = A.D. 2000-Jan-01 12:01:00.0000 TDB + X =-1.790960725225740E-01 Y = 9.654010738956424E-01 Z = 2.383681475637660E-04 + VX=-1.683585392087164E-02 VY=-3.581112024431721E-03 VZ=-6.548288423082821E-06 +$$EOE +*******************************************************************************"#; + + const SAMPLE_EARTH_DATA: &str = r#"API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +******************************************************************************* + Revised: April 12, 2021 Earth 399 +******************************************************************************* +$$SOE +2451545.000000000 = A.D. 2000-Jan-01 12:00:00.0000 TDB + X =-1.771350992727098E-01 Y = 9.672416867665306E-01 Z =-4.085281582511366E-06 + VX=-1.720762506872895E-02 VY=-3.158782144324866E-03 VZ= 1.049888594613343E-07 +2451545.000694444 = A.D. 2000-Jan-01 12:01:00.0000 TDB + X =-1.771470489993106E-01 Y = 9.672394930949845E-01 Z =-4.085208640488331E-06 + VX=-1.720758754114626E-02 VY=-3.158991907845201E-03 VZ= 1.050842029536420E-07 +$$EOE +*******************************************************************************"#; + + #[test] + fn test_client_creation() { + let client = JplHorizonsClient::new(); + assert_eq!(client.base_url, "https://ssd.jpl.nasa.gov/api/horizons.api"); + } + + #[test] + fn test_common_params_default() { + let params = CommonParams::default(); + assert_eq!(params.command.as_str(), "399"); // Default is Earth + assert!(matches!(params.make_ephem, Some(YesNo::Yes))); + assert!(matches!(params.format, Some(OutputFormat::Text))); + } + + #[test] + fn test_parse_vectors_moon_data() { + let result = parse_vectors(SAMPLE_MOON_DATA).unwrap(); + + assert_eq!(result.data.len(), 2); + + // Test first data point + let first = &result.data[0]; + assert_eq!(first.julian_day, 2451545.000000000); + + // Test position (Moon) + let expected_pos = DVec3::new( + -1.790843809223965E-01, + 9.654035607264573E-01, + 2.383726922995396E-04, + ); + assert!((first.position - expected_pos).length() < 1e-15); + + // Test velocity (Moon) + let expected_vel = DVec3::new( + -1.683595459141215E-02, + -3.580960720855671E-03, + -6.540550604528720E-06, + ); + assert!((first.velocity - expected_vel).length() < 1e-15); + + // Test second data point + let second = &result.data[1]; + assert_eq!(second.julian_day, 2451545.000694444); + } + + #[test] + fn test_parse_vectors_earth_data() { + let result = parse_vectors(SAMPLE_EARTH_DATA).unwrap(); + + assert_eq!(result.data.len(), 2); + + // Test first data point (Earth) + let first = &result.data[0]; + assert_eq!(first.julian_day, 2451545.000000000); + + // Test position (Earth) + let expected_pos = DVec3::new( + -1.771350992727098E-01, + 9.672416867665306E-01, + -4.085281582511366E-06, + ); + assert!((first.position - expected_pos).length() < 1e-15); + + // Test velocity (Earth) + let expected_vel = DVec3::new( + -1.720762506872895E-02, + -3.158782144324866E-03, + 1.049888594613343E-07, + ); + assert!((first.velocity - expected_vel).length() < 1e-15); + } + + #[test] + fn test_parse_vectors_no_soe_marker() { + let invalid_data = "API VERSION: 1.2\nSome data without SOE marker"; + let result = parse_vectors(invalid_data); + + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + HorizonsError::VectorParsing(_) + )); + } + + #[test] + fn test_parse_vectors_no_eoe_marker() { + let invalid_data = r#"$$SOE +2451545.000000000 = A.D. 2000-Jan-01 12:00:00.0000 TDB + X =-1.771350992727098E-01 Y = 9.672416867665306E-01 Z =-4.085281582511366E-06 + VX=-1.720762506872895E-02 VY=-3.158782144324866E-03 VZ= 1.049888594613343E-07"#; + + let result = parse_vectors(invalid_data); + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + HorizonsError::VectorParsing(_) + )); + } + + #[test] + fn test_parse_vectors_empty_data_section() { + let empty_data = r#"$$SOE +$$EOE"#; + + let result = parse_vectors(empty_data); + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + HorizonsError::VectorParsing(_) + )); + } + + #[test] + fn test_vector_data_creation() { + let position = DVec3::new(1.0, 2.0, 3.0); + let velocity = DVec3::new(0.1, 0.2, 0.3); + let julian_day = 2451545.0; + + let vector_data = VectorData { + julian_day, + position, + velocity, + }; + + assert_eq!(vector_data.julian_day, julian_day); + assert_eq!(vector_data.position, position); + assert_eq!(vector_data.velocity, velocity); + } + + #[test] + fn test_ephemeris_vectors_creation() { + let data = vec![ + VectorData { + julian_day: 2451545.0, + position: DVec3::new(1.0, 2.0, 3.0), + velocity: DVec3::new(0.1, 0.2, 0.3), + }, + VectorData { + julian_day: 2451546.0, + position: DVec3::new(1.1, 2.1, 3.1), + velocity: DVec3::new(0.11, 0.21, 0.31), + }, + ]; + + let ephemeris = EphemerisVectors { data: data.clone() }; + assert_eq!(ephemeris.data.len(), 2); + assert_eq!(ephemeris.data[0].julian_day, 2451545.0); + assert_eq!(ephemeris.data[1].julian_day, 2451546.0); + } + + #[tokio::test] + async fn test_vector_params_creation() { + let _client = JplHorizonsClient::new(); + let params = VectorParams::new(BodyCommand::moon()); + + // Test that we can create the params correctly + assert_eq!(params.common.command.as_str(), "301"); + assert!(matches!( + params.vec_table, + Some(VectorTable::PositionVelocity) + )); + } + + #[test] + fn test_ephemeris_type_variants() { + // Test all enum variants exist + let _observer = EphemerisType::Observer; + let _vectors = EphemerisType::Vectors; + let _elements = EphemerisType::Elements; + let _spk = EphemerisType::Spk; + let _approach = EphemerisType::Approach; + } + + #[test] + fn test_horizons_error_variants() { + // Test error type variants (just checking they can be created) + let _api_err = HorizonsError::Api("Test API error".to_string()); + let _param_err = HorizonsError::InvalidParameter("Test param error".to_string()); + let _parse_err = HorizonsError::VectorParsing("Test parse error".to_string()); + + // Test error display + let api_err = HorizonsError::Api("API error".to_string()); + let error_msg = format!("{}", api_err); + assert!(error_msg.contains("API error")); + } + + #[test] + fn test_typed_parameters() { + // Test enum string conversions + assert_eq!(OutputFormat::Json.as_str(), "json"); + assert_eq!(OutputFormat::Text.as_str(), "text"); + + assert_eq!(VectorTable::PositionVelocity.as_str(), "2"); + assert_eq!(VectorTable::StateVector.as_str(), "1"); + + assert_eq!(OutputUnits::AuPerDay.as_str(), "AU-D"); + assert_eq!(OutputUnits::KilometersPerSecond.as_str(), "KM-S"); + + assert_eq!(ReferencePlane::Ecliptic.as_str(), "ECLIPTIC"); + assert_eq!(ReferenceSystem::J2000.as_str(), "J2000"); + + assert_eq!(YesNo::Yes.as_str(), "YES"); + assert_eq!(YesNo::No.as_str(), "NO"); + } + + #[test] + fn test_parameter_builders() { + // Test vector parameters builder + let vec_params = VectorParams::new(BodyCommand::moon()); + assert_eq!(vec_params.common.command.as_str(), "301"); + assert!(matches!(vec_params.common.format, Some(OutputFormat::Text))); + assert!(matches!(vec_params.out_units, Some(OutputUnits::AuPerDay))); + assert!(matches!( + vec_params.ref_plane, + Some(ReferencePlane::Ecliptic) + )); + + // Test observer parameters builder + let obs_params = ObserverParams::new(BodyCommand::mars()); + assert_eq!(obs_params.common.command.as_str(), "499"); + assert!(matches!(obs_params.common.format, Some(OutputFormat::Text))); + + // Test elements parameters builder + let elem_params = ElementParams::new(BodyCommand::earth()); + assert_eq!(elem_params.common.command.as_str(), "399"); + assert!(matches!(elem_params.elm_labels, Some(YesNo::Yes))); + } + + #[test] + fn test_specialized_builders() { + // Test high precision vectors + let high_prec = VectorParams::high_precision(BodyCommand::moon()); + assert!(matches!( + high_prec.vec_table, + Some(VectorTable::PositionVelocity) + )); + assert!(matches!(high_prec.vec_corr, Some(VectorCorrections::None))); + assert!(matches!(high_prec.common.time_type, Some(TimeType::Tdb))); + assert!(matches!( + high_prec.common.ref_system, + Some(ReferenceSystem::J2000) + )); + + // Test ground-based observer + let ground_obs = ObserverParams::ground_based(BodyCommand::mars()); + assert!(matches!( + ground_obs.common.ref_system, + Some(ReferenceSystem::J2000) + )); + assert!(matches!(ground_obs.ang_format, Some(AngleFormat::Deg))); + assert!(matches!(ground_obs.apparent, Some(YesNo::Yes))); + } + + const SAMPLE_MAJOR_BODIES_DATA: &str = r#"API VERSION: 1.2 +API SOURCE: NASA/JPL Horizons API + +Multiple major-bodies match string "*" + + ID# Name Designation IAU/aliases/other + ------- ---------------------------------- ----------- ------------------- + 0 Solar System Barycenter SSB + 1 Mercury Barycenter + 2 Venus Barycenter + 3 Earth-Moon Barycenter EMB + 4 Mars Barycenter + 5 Jupiter Barycenter + 6 Saturn Barycenter + 7 Uranus Barycenter + 8 Neptune Barycenter + 9 Pluto Barycenter + 10 Sun Sol + 199 Mercury + 299 Venus + 399 Earth + 301 Moon Luna + 499 Mars + 501 Io J1 + 502 Europa J2 + 503 Ganymede J3 + 504 Callisto J4"#; + + #[test] + fn test_parse_major_bodies() { + let result = parse_major_bodies(SAMPLE_MAJOR_BODIES_DATA).unwrap(); + + assert!(result.bodies.len() >= 10); + + // Test some specific bodies + let solar_system_barycenter = result.bodies.iter().find(|b| b.id == "0"); + assert!(solar_system_barycenter.is_some()); + assert_eq!( + solar_system_barycenter.unwrap().name, + "Solar System Barycenter" + ); + + let sun = result.bodies.iter().find(|b| b.id == "10"); + assert!(sun.is_some()); + assert_eq!(sun.unwrap().name, "Sun"); + + let earth = result.bodies.iter().find(|b| b.id == "399"); + assert!(earth.is_some()); + assert_eq!(earth.unwrap().name, "Earth"); + + let moon = result.bodies.iter().find(|b| b.id == "301"); + assert!(moon.is_some()); + assert_eq!(moon.unwrap().name, "Moon"); + } + + #[test] + fn test_parse_major_bodies_no_table() { + let invalid_data = "API VERSION: 1.2\nSome data without major bodies table"; + let result = parse_major_bodies(invalid_data); + + assert!(result.is_err()); + assert!(matches!( + result.unwrap_err(), + HorizonsError::MajorBodyParsing(_) + )); + } + + #[test] + fn test_major_body_creation() { + let body = MajorBodyInfo { + id: "399".to_string(), + name: "Earth".to_string(), + designation: None, + aliases: Some("Terra".to_string()), + }; + + assert_eq!(body.id, "399"); + assert_eq!(body.name, "Earth"); + assert!(body.designation.is_none()); + assert_eq!(body.aliases.as_ref().unwrap(), "Terra"); + } + + #[test] + fn test_major_bodies_collection() { + let bodies = vec![ + MajorBodyInfo { + id: "399".to_string(), + name: "Earth".to_string(), + designation: None, + aliases: None, + }, + MajorBodyInfo { + id: "301".to_string(), + name: "Moon".to_string(), + designation: None, + aliases: Some("Luna".to_string()), + }, + ]; + + let major_bodies = MajorBodies { bodies }; + assert_eq!(major_bodies.bodies.len(), 2); + assert_eq!(major_bodies.bodies[0].name, "Earth"); + assert_eq!(major_bodies.bodies[1].name, "Moon"); + } + + #[test] + fn test_major_body_enum() { + // Test enum values and their IDs + assert_eq!(MajorBody::Sun.id(), "10"); + assert_eq!(MajorBody::Sun.name(), "Sun"); + + assert_eq!(MajorBody::Earth.id(), "399"); + assert_eq!(MajorBody::Earth.name(), "Earth"); + + assert_eq!(MajorBody::Moon.id(), "301"); + assert_eq!(MajorBody::Moon.name(), "Moon"); + + assert_eq!(MajorBody::Mars.id(), "499"); + assert_eq!(MajorBody::Mars.name(), "Mars"); + + // Test custom body + let custom = MajorBody::Custom("12345".to_string()); + assert_eq!(custom.id(), "12345"); + assert_eq!(custom.name(), "Custom Body"); + } + + #[test] + fn test_step_size_enum() { + // Test calendar intervals + let step1 = StepSize::minutes(30); + assert_eq!(step1.as_str(), "30 m"); + + let step2 = StepSize::hours(6); + assert_eq!(step2.as_str(), "6 h"); + + let step3 = StepSize::days(1); + assert_eq!(step3.as_str(), "1 d"); + + // Test angular motion + let step4 = StepSize::angular_motion(600); + assert_eq!(step4.as_str(), "VAR 600"); + + // Test raw string + let step5 = StepSize::Raw("custom".to_string()); + assert_eq!(step5.as_str(), "custom"); + } + + #[test] + fn test_body_command_enum() { + // Test major body commands + let cmd1 = BodyCommand::sun(); + assert_eq!(cmd1.as_str(), "10"); + + let cmd2 = BodyCommand::earth(); + assert_eq!(cmd2.as_str(), "399"); + + let cmd3 = BodyCommand::moon(); + assert_eq!(cmd3.as_str(), "301"); + + // Test center commands + let cmd4 = BodyCommand::sun_center(); + assert_eq!(cmd4.as_str(), "@sun"); + + let cmd5 = BodyCommand::earth_center(); + assert_eq!(cmd5.as_str(), "@earth"); + + // Test small body + let cmd6 = BodyCommand::SmallBody("1;".to_string()); + assert_eq!(cmd6.as_str(), "1;"); + + // Test raw command + let cmd7 = BodyCommand::Raw("custom".to_string()); + assert_eq!(cmd7.as_str(), "custom"); + } + + #[test] + fn test_time_unit_enum() { + assert_eq!(TimeUnit::Minutes.as_str(), "m"); + assert_eq!(TimeUnit::Hours.as_str(), "h"); + assert_eq!(TimeUnit::Days.as_str(), "d"); + assert_eq!(TimeUnit::Months.as_str(), "mo"); + assert_eq!(TimeUnit::Years.as_str(), "y"); + } + + #[test] + fn test_parameter_constructors() { + // Test VectorParams with enum + let params1 = VectorParams::new(BodyCommand::mars()); + assert_eq!(params1.common.command.as_str(), "499"); + + // Test VectorParams from string (backward compatibility) + let params2 = VectorParams::new_from_string("301".to_string()); + assert_eq!(params2.common.command.as_str(), "301"); + + // Test high precision constructor + let params3 = VectorParams::high_precision(BodyCommand::jupiter()); + assert_eq!(params3.common.command.as_str(), "599"); + assert!(matches!(params3.common.time_type, Some(TimeType::Tdb))); + } + + #[tokio::test] + async fn write_major_bodies() { + let client = JplHorizonsClient::new(); + let response = client.list_major_bodies().await.unwrap(); + let ron_str = + ron::ser::to_string_pretty(&response, ron::ser::PrettyConfig::default()).unwrap(); + tokio::fs::write("assets/jpl_horizon/major_bodies.ron", ron_str) + .await + .unwrap(); + } + + #[tokio::test] + async fn write_vectors() { + let client = JplHorizonsClient::new(); + let start = Utc.with_ymd_and_hms(2025, 1, 1, 0, 0, 0).unwrap(); + let end = Utc.with_ymd_and_hms(2025, 1, 1, 0, 1, 0).unwrap(); + + let commands = [ + BodyCommand::Major(MajorBody::Sun), + BodyCommand::Major(MajorBody::Mercury), + BodyCommand::Major(MajorBody::Venus), + BodyCommand::Major(MajorBody::Earth), + BodyCommand::Major(MajorBody::Moon), + BodyCommand::Major(MajorBody::Mars), + BodyCommand::Major(MajorBody::Phobos), + BodyCommand::Major(MajorBody::Deimos), + BodyCommand::Major(MajorBody::Jupiter), + BodyCommand::Major(MajorBody::Io), + BodyCommand::Major(MajorBody::Europa), + BodyCommand::Major(MajorBody::Ganymede), + BodyCommand::Major(MajorBody::Callisto), + BodyCommand::Major(MajorBody::Saturn), + BodyCommand::Major(MajorBody::Titan), + BodyCommand::Major(MajorBody::Rhea), + BodyCommand::Major(MajorBody::Iapetus), + BodyCommand::Major(MajorBody::Dione), + BodyCommand::Major(MajorBody::Tethys), + BodyCommand::Major(MajorBody::Enceladus), + BodyCommand::Major(MajorBody::Mimas), + BodyCommand::Major(MajorBody::Uranus), + BodyCommand::Major(MajorBody::Titania), + BodyCommand::Major(MajorBody::Oberon), + BodyCommand::Major(MajorBody::Ariel), + BodyCommand::Major(MajorBody::Umbriel), + BodyCommand::Major(MajorBody::Miranda), + BodyCommand::Major(MajorBody::Neptune), + BodyCommand::Major(MajorBody::Triton), + ]; + use tokio::fs; + use tokio::time::{Duration, sleep}; + + for command in commands.iter() { + let file_path = format!("assets/jpl_horizon/bodies/{}.txt", command.name()); + if fs::try_exists(&file_path).await.unwrap_or(false) { + println!("File {} already exists, skipping.", file_path); + continue; + } + let response = client + .get_vectors( + command.clone(), + start, + end, + Some(StepSize::minutes(1)), + Some("500@10".to_string()), + ) + .await + .unwrap(); + fs::write(&file_path, response.result.unwrap()) + .await + .unwrap(); + sleep(Duration::from_secs(1)).await; + } + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..2e3abb4 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1 @@ +pub mod jpl_horizon; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 02b16b7..41f6e68 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,8 @@ use bevy::{ use bevy_inspector_egui::{bevy_egui::EguiPlugin, quick::WorldInspectorPlugin}; use iyes_perf_ui::{PerfUiPlugin, prelude::*}; +mod jpl_horizon; + // Scaling factor to convert AU to game units // Neptune is approximately 30.1 astronomical units (AU) from the Sun // Point light effective range is about 10 game units, so 10 game units = ~30 AU @@ -467,79 +469,93 @@ fn setup_solar_system(mut commands: Commands) { } // High precision constants -const G_SI: f64 = 6.67430e-11; // Gravitational constant in m³/kg/s² (2018 CODATA value) -const AU_TO_M: f64 = 149597870691.0; // AU to meters (IAU 2012 definition, exact) -const DAY_TO_S: f64 = 86400.0; // Day to seconds (exact) +const G_SI: f64 = 6.67430e-11; // m^3 / (kg s^2) +const AU_TO_M: f64 = 149_597_870_691.0; // m +const DAY_TO_S: f64 = 86_400.0; // s -// Pre-calculated G in AU³/kg/day² units for optimization -// G_AU = G_SI * (day²/s²) / (AU³/m³) -// G_AU = G_SI * (DAY_TO_S²) / (AU_TO_M³) +// G in AU^3 / (kg day^2) const G_AU: f64 = G_SI * (DAY_TO_S * DAY_TO_S) / (AU_TO_M * AU_TO_M * AU_TO_M); const STEPS: usize = 100; -// Time step calculation: -// FixedUpdate runs at 64fps, 1 game second = 7 days, 100 steps per FixedUpdate -// DT = (7 days / 64 fps) / 100 steps = 7 / (64 * 100) = 0.00109375 days per step -const DT: f64 = 1.0 / (64.0 * STEPS as f64); // Time step in days +// If FixedUpdate is 64 Hz and you want 1 day per game second: DT = 1/(64*STEPS) day/step +const DT: f64 = 1.0 / (64.0 * STEPS as f64); fn n_body(mut query: Query<(&Mass, &mut Position, &mut Velocity)>) { - // Collect all bodies data (mass, position, velocity) + // Pull data out once. This copy lets us integrate freely without borrow issues. + // (If you want zero copies, use a Resource scratch buffer and reuse it across frames.) let mut bodies: Vec<(f64, DVec3, DVec3)> = query .iter() .map(|(mass, pos, vel)| (mass.0.0, pos.0.0, vel.0.0)) .collect(); - // Helper function to calculate gravitational forces - let calculate_forces = |bodies: &Vec<(f64, DVec3, DVec3)>| -> Vec { - let mut forces: Vec = vec![DVec3::ZERO; bodies.len()]; - - for i in 0..bodies.len() { - for j in 0..bodies.len() { - if i != j { - let r_vec = bodies[j].1 - bodies[i].1; // Position difference in AU - let r_mag_au = r_vec.length(); + let n = bodies.len(); + if n < 2 { + // Nothing to do; write back if needed and return + for (i, (_m, mut pos, mut vel)) in query.iter_mut().enumerate() { + if let Some(b) = bodies.get(i) { + pos.0.0 = b.1; + vel.0.0 = b.2; + } + } + return; + } - if r_mag_au > 1e-10 { - // Avoid division by zero - // Calculate gravitational acceleration in AU/day² units - let acceleration_magnitude = G_AU * bodies[j].0 / (r_mag_au * r_mag_au); - let acceleration_vec = r_vec.normalize() * acceleration_magnitude; - forces[i] += acceleration_vec; - } + // Single reusable acceleration buffer + let mut acc: Vec = vec![DVec3::ZERO; n]; + + // Pairwise acceleration accumulation (O(n^2)/2) with Newton's 3rd law + let compute_accelerations = |bodies: &[(f64, DVec3, DVec3)], acc: &mut [DVec3]| { + acc.fill(DVec3::ZERO); + + for i in 0..n - 1 { + let (mi, pi, _) = bodies[i]; + for j in (i + 1)..n { + let (mj, pj, _) = bodies[j]; + + let r = pj - pi; // AU + let r2 = r.length_squared(); // AU^2 + // Tighter epsilon in AU^2; avoids division by ~0 without killing legit close passes + if r2 > 1e-20 { + // a_i = G * m_j * r / r^3, a_j = -G * m_i * r / r^3 + let inv_r = r2.sqrt().recip(); // 1 / r + let inv_r3 = inv_r * inv_r * inv_r; // 1 / r^3 + + let a_i = r * (G_AU * mj * inv_r3); + let a_j = r * (G_AU * mi * inv_r3); + + acc[i] += a_i; + acc[j] -= a_j; // opposite direction } } } - forces }; - // Perform integration steps using Leapfrog (Verlet) symplectic integrator + // Leapfrog / velocity-Verlet for _ in 0..STEPS { - // Step 1: Half-step momentum update - p ← p - (h/2)∇U(q) - let forces = calculate_forces(&bodies); - for i in 0..bodies.len() { - bodies[i].2 += forces[i] * (DT * 0.5); // Update velocity (momentum/mass) + // v += a(q) * dt/2 + compute_accelerations(&bodies, &mut acc); + for i in 0..n { + bodies[i].2 += acc[i] * (DT * 0.5); } - // Step 2: Full-step position update - q ← q + h∇T(p) - // For classical mechanics, ∇T(p) = p/m = v (velocity) - for i in 0..bodies.len() { - let velocity = bodies[i].2; - bodies[i].1 += velocity * DT; // Update position + // q += v * dt + for i in 0..n { + let vel = bodies[i].2; // copy DVec3 (cheap, it's just 3 f64s) + bodies[i].1 += vel * DT; } - // Step 3: Half-step momentum update - p ← p - (h/2)∇U(q) - let forces = calculate_forces(&bodies); - for i in 0..bodies.len() { - bodies[i].2 += forces[i] * (DT * 0.5); // Update velocity again + // v += a(q_new) * dt/2 + compute_accelerations(&bodies, &mut acc); + for i in 0..n { + bodies[i].2 += acc[i] * (DT * 0.5); } } - // Write back updated positions and velocities + // Write back for (i, (_mass, mut pos, mut vel)) in query.iter_mut().enumerate() { - if let Some(body) = bodies.get(i) { - pos.0.0 = body.1; - vel.0.0 = body.2; - } + let (_, p, v) = bodies[i]; + pos.0.0 = p; + vel.0.0 = v; } }