โ† ๋ฐฑ์„œ ๋ฐ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
ZeliDesk Core Engineering Architecture Whitepaper #750 [์ œ750ํ˜ธ ๊ธฐ๋… ๋Œ€์ž‘ ๐Ÿ†]

[์ œ750ํ˜ธ ๊ธฐ๋… ๐Ÿ†] ์ดˆยท์ค‘ยท๊ณ  ๋ฌผ๋ฆฌ(์ฒœ์ฒด๋ฌผ๋ฆฌํ•™ยท๊ถค๋„์—ญํ•™)ยท์ˆ˜ํ•™(๋ฏธ์ ๋ถ„ํ•™) ๊ต์œก๊ณผ ๊ตญ๋ฐฉ ํ•ญ๊ณต์šฐ์ฃผ๊ตฐ ๊ตฐ์‚ฌ ์ •์ฐฐ ์œ„์„ฑ ๊ถค๋„ ์ „ํŒŒ(Orbit Propagation) ๋ฐ ์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA): ZeliDesk์˜ ์˜จ๋””๋ฐ”์ด์Šค ์ˆœ์ˆ˜ C# SGP4/SDP4 ์„ญ๋™ ์ˆ˜์น˜ ๋ชจ๋ธ(J2-J4 ์„ญ๋™, ๋Œ€๊ธฐ ํ•ญ๋ ฅ), TLE ์œ„์„ฑ ๊ถค๋„ ์š”์†Œ ํ•ด์„, 0-Alloc SIMD 3์ฐจ์› ์šฐ์ฃผ ๊ถค๋„ ๊ต์ฐจ ๋ฐ ์ถฉ๋Œ ์˜ˆ์ธก(Conjunction Assessment) 120fps ์šฐ์ฃผ ๊ฐ์‹œ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜

1. ๊ฐœ์š”: 2022 ๊ฐœ์ • ์ฒœ์ฒด๋ฌผ๋ฆฌ ๊ต์œก๊ณผ ์ œ4์˜ ์ „์žฅ ์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA) ๊ตญ๋ฐฉ ์ฃผ๊ถŒ

2022 ๊ฐœ์ • ๊ณผํ•™(๋ฌผ๋ฆฌํ•™: ๋‰ดํ„ด ๋งŒ์œ ์ธ๋ ฅ ๋ฒ•์น™, ์ผ€ํ”Œ๋Ÿฌ 3๋Œ€ ๋ฒ•์น™, ์›์šด๋™๊ณผ ๊ตฌ์‹ฌ๋ ฅ, ์ง€๊ตฌ ์ค‘์‹ฌ ์ธ๊ณต์œ„์„ฑ ๊ถค๋„) ๋ฐ ์ˆ˜ํ•™(๋ฏธ์ ๋ถ„ํ•™: ๋น„์„ ํ˜• ๋ฏธ๋ถ„๋ฐฉ์ •์‹ ์ˆ˜์น˜ ์ ๋ถ„, ์ดˆ์›”ํ•จ์ˆ˜ ๊ทผ์‚ฌ ์ˆ˜์น˜ํ•ด๋ฒ• ๋‰ดํ„ด-๋žฉ์Šจ๋ฒ•, 3์ฐจ์› ๊ณต๊ฐ„ ๋ฒกํ„ฐ ์‚ผ๊ฐํ•จ์ˆ˜ ํšŒ์ „๋ณ€ํ™˜)์—์„œ ์ธ๊ณต์œ„์„ฑ ๊ถค๋„ ์ „ํŒŒ(Orbit Propagation)์™€ ์„ญ๋™(Perturbation) ์—ญํ•™์€ ์šฐ์ฃผ ์‹œ๋Œ€๋ฅผ ์‚ด์•„๊ฐˆ ์ฒญ์†Œ๋…„๋“ค์ด ์ˆ˜ํ•™๊ณผ ๋ฌผ๋ฆฌ์˜ ์‘์šฉ ๊ฐ€์น˜๋ฅผ ๊ฐ€์žฅ ์›…์žฅํ•˜๊ฒŒ ์ฒด๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ํ•ต์‹ฌ ์œตํ•ฉ ๋‹จ์›์ž…๋‹ˆ๋‹ค. ํ•™์ƒ๋“ค์€ ๋งŒ์œ ์ธ๋ ฅ ๋ฒ•์น™ $F = G \frac{M m}{r^2}$์— ๊ธฐ๋ฐ˜ํ•œ ์ˆœ์ˆ˜ 2์ฒด ๋ฌธ์ œ(Two-Body Problem) ์ผ€ํ”Œ๋Ÿฌ ๊ถค๋„๊ฐ€ ์ง€๊ตฌ์˜ ํƒ€์› ํŽธํ‰๋„($J_2, J_3, J_4$), ์ƒ์ธต ๋Œ€๊ธฐ ํ•ญ๋ ฅ(Atmospheric Drag), ๋‹ฌ๊ณผ ํƒœ์–‘์˜ ์ค‘๋ ฅ ์„ญ๋™์— ์˜ํ•ด ๋Š์ž„์—†์ด ํ‹€์–ด์ง€๊ณ  ๋ณ€ํ˜•๋˜๋Š” ์„ญ๋™ ์ˆ˜์น˜ ๋ชจ๋ธ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•จ์œผ๋กœ์จ ์ˆ˜์น˜ ๋ฏธ์ ๋ถ„ํ•™์˜ ๊ฒฝ์ด๋กœ์›€์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

ํ˜„๋Œ€ ๊ตญ๋ฐฉ ๋ฐ ์•ˆ๋ณด ๋ถ„์•ผ์—์„œ ์šฐ์ฃผ(Space)๋Š” ์ง€์ƒ, ํ•ด์ƒ, ๊ณต์ค‘, ์‚ฌ์ด๋ฒ„์— ์ด์€ ์ œ5์˜ ์ „์žฅ์ด์ž ๋ฏธ๋ž˜ ํ•ฉ๋™์ž‘์ „์˜ ํ•ต์‹ฌ ์ค‘์ถ”๋กœ ๋ถ€์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ณต๊ตฐ ์šฐ์ฃผ์ž‘์ „๋Œ€๋Œ€์™€ ๊ตฐ์‚ฌ ์ •์ฐฐ์œ„์„ฑ(425 ์‚ฌ์—… SAR/EO/IR ์œ„์„ฑ๊ตฐ, ์ดˆ์†Œํ˜• ์ •์ฐฐ ๊ตฐ์ง‘์œ„์„ฑ)์€ ํ•œ๋ฐ˜๋„ ์ƒ๊ณต์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์„ ํšŒํ•˜๋ฉฐ ์ ์˜ ํ•ตยท๋ฏธ์‚ฌ์ผ ์ด๋™์‹ ๋ฐœ์‚ฌ๋Œ€(TEL) ๋ฐ ๊ตฐ์‚ฌ ์š”์ถฉ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด์™€ ๋™์‹œ์—, ์ ๋Œ€๊ตญ์˜ ๋Œ€์œ„์„ฑ ๊ณต๊ฒฉ(ASAT), ์šฐ์ฃผ ์ž”ํ•ด๋ฌผ(Space Debris), ์  ๊ตฐ์‚ฌ์œ„์„ฑ์˜ ๋ž‘๋ฐ๋ถ€ยท๊ทผ์ ‘์ž‘์ „(RPO: Rendezvous and Proximity Operations) ์œ„ํ˜‘์œผ๋กœ๋ถ€ํ„ฐ ์•„๊ตฐ ์šฐ์ฃผ ์ž์‚ฐ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA: Space Domain Awareness) ๋ฐ ์ถฉ๋Œ ์œ„ํ—˜ ํ‰๊ฐ€(Conjunction Assessment) ๊ธฐ์ˆ ์€ ๊ตญ๊ฐ€ ์•ˆ๋ณด์˜ ์‚ฌํ™œ์ด ๊ฑธ๋ฆฐ ์ž์ฃผ๊ตญ๋ฐฉ์˜ ํ•ต์‹ฌ ์ฃผ๊ถŒ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด์˜ ์œ„์„ฑ ๊ถค๋„ ๊ณ„์‚ฐ ์ฒด๊ณ„๋Š” ๋ฌด๊ฑฐ์šด ์™ธ์‚ฐ Fortran/C++ ๊ธฐ๋ฐ˜ ์ฒœ์ฒด ๊ถค๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์™ธ๋ถ€ ์ƒ์šฉ ํด๋ผ์šฐ๋“œ ์†Œํ”„ํŠธ์›จ์–ด(STK, FreeFlyer ๋“ฑ)์— ์˜์กดํ•˜์—ฌ, ๊ตฐ ๋ณด์•ˆ ํ์‡„๋ง ๋‹จ๋ง๊ธฐ ๋ฐ ํ•™๊ต ๊ต์‹ค ์˜จ๋””๋ฐ”์ด์Šค AIDT ํ™˜๊ฒฝ์—์„œ ์ˆ˜๋งŒ ๊ฐœ์˜ ์šฐ์ฃผ ๋ฌผ์ฒด๋ฅผ ์‹ค์‹œ๊ฐ„ 120fps๋กœ ๊ฐ์‹œํ•˜๊ณ  ์ถฉ๋Œ์„ ์˜ˆ์ธกํ•˜๊ธฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐ ํ”„๋ ˆ์ž„ ๋“œ๋ž ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ZeliDesk๋Š” ์™ธ์‚ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…์†์„ 100% ํƒˆํ”ผํ•˜๊ณ , .NET 9 ์ˆœ์ˆ˜ C# ๊ธฐ๋ฐ˜์˜ ์ดˆ๊ณ ์† 0-Alloc SGP4/SDP4 ์„ญ๋™ ๊ถค๋„ ์ „ํŒŒ๊ธฐ ๋ฐ SIMD 3์ฐจ์› ์šฐ์ฃผ ์ถฉ๋Œ ์˜ˆ์ธก ์—”์ง„์„ ์™„์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ œ750ํ˜ธ ๊ธฐ๋… ๋Œ€์ž‘์œผ๋กœ ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ตญ๋ฐฉ ํ•ญ๊ณต์šฐ์ฃผ๊ตฐ๊ณผ ๊ต์œก ํ˜„์žฅ์— ๋ฐ”์น˜๋Š” ์™„๋ฒฝํ•œ C# ์šฐ์ฃผ ๊ฐ์‹œ ์—”์ง„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณต๊ฐœํ•ฉ๋‹ˆ๋‹ค.

2. ํ•™์ˆ ์  ๋ฐฐ๊ฒฝ: ์ผ€ํ”Œ๋Ÿฌ ๊ถค๋„ ์š”์†Œ, J2 ์„ญ๋™, ๋Œ€๊ธฐ ํ•ญ๋ ฅ ๋ฐ SGP4 ์ˆ˜ํ•™ ๋ชจ๋ธ

์ง€๊ตฌ ์ฃผ์œ„๋ฅผ ๊ณต์ „ํ•˜๋Š” ์ธ๊ณต์œ„์„ฑ์˜ ์ด์ƒ์ ์ธ 2์ฒด ์šด๋™์€ 6๊ฐœ์˜ **์ผ€ํ”Œ๋Ÿฌ ๊ถค๋„ ์š”์†Œ(Keplerian Elements)**๋กœ ์™„๋ฒฝํžˆ ๊ธฐ์ˆ ๋ฉ๋‹ˆ๋‹ค:

  • ๊ธด๋ฐ˜์ง€๋ฆ„(Semi-major axis, $a$): ํƒ€์› ๊ถค๋„์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ • (km)
  • ์ด์‹ฌ๋ฅ (Eccentricity, $e$): ๊ถค๋„์˜ ๋‚ฉ์ž‘ํ•œ ์ •๋„ ($0 \le e < 1$)
  • ๊ถค๋„ ๊ฒฝ์‚ฌ๊ฐ(Inclination, $i$): ์ง€๊ตฌ ์ ๋„๋ฉด๊ณผ ๊ถค๋„๋ฉด ์‚ฌ์ด์˜ ์‚ฌ์ž‡๊ฐ ($\text{rad}$)
  • ์Šน๊ต์  ๊ฒฝ๋„(Right Ascension of Ascending Node, $\Omega$): ์ถ˜๋ถ„์  ๊ธฐ์ค€ ๊ถค๋„๊ฐ€ ๋‚จ๋ฐ˜๊ตฌ์—์„œ ๋ถ๋ฐ˜๊ตฌ๋กœ ํ†ต๊ณผํ•˜๋Š” ์Šน๊ต์ ์˜ ๊ฐ๋„
  • ๊ทผ์ง€์  ํŽธ๊ฐ(Argument of Perigee, $\omega$): ์Šน๊ต์ ์—์„œ ํƒ€์› ๊ถค๋„์˜ ์ง€๊ตฌ ์ตœ๊ทผ์ ‘์ (๊ทผ์ง€์ )๊นŒ์ง€์˜ ๊ถค๋„๋ฉด ๋‚ด ๊ฐ๋„
  • ํ‰๊ท  ๊ทผ์ ๊ฐ(Mean Anomaly, $M$): ์œ„์„ฑ์ด ๊ทผ์ง€์ ์„ ํ†ต๊ณผํ•œ ํ›„ ๊ฒฝ๊ณผํ•œ ์‹œ๊ฐ„์„ ๊ฐ€์ƒ์œผ๋กœ ๋‚˜ํƒ€๋‚ธ ๊ฐ๋„

์ง€๊ตฌ ํŽธํ‰๋„์— ์˜ํ•œ $J_2$ ์ค‘๋ ฅ ๋‹ค๊ทน์ž ์„ญ๋™ (Zonal Harmonics)

์‹ค์ œ ์ง€๊ตฌ๋Š” ์™„์ „ํ•œ ๊ตฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์ž์ „์— ์˜ํ•ด ์ ๋„๊ฐ€ ๋ถˆ๋ฃฉํ•œ ํŽธํ‰ ํšŒ์ „ ํƒ€์›์ฒด(Oblate Spheroid)์ž…๋‹ˆ๋‹ค. ์ง€๊ตฌ์˜ ๋น„๋Œ€์นญ ์ค‘๋ ฅ ํฌํ…์…œ $V(r, \phi)$๋Š” ๋ฅด์žฅ๋“œ๋ฅด ๋‹คํ•ญ์‹(Legendre Polynomials) $P_n(\sin\phi)$์„ ์‚ฌ์šฉํ•œ ๋Œ€์—ญ ์กฐํ™” ํ•จ์ˆ˜๋กœ ์ „๊ฐœ๋ฉ๋‹ˆ๋‹ค:

$$V(r, \phi) = -\frac{\mu}{r} \left[ 1 - \sum_{n=2}^{\infty} J_n \left(\frac{R_E}{r}\right)^n P_n(\sin\phi) \right]$$

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ง€๋ฐฐ์ ์ธ 2์ฐจ ์ค‘๋ ฅ ๊ณ„์ˆ˜ $J_2 \approx 1.08263 \times 10^{-3}$๋Š” ์œ„์„ฑ ๊ถค๋„์— ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ์˜๊ตฌ ์„ญ๋™(Secular Perturbation)์„ ์œ ๋ฐœํ•ฉ๋‹ˆ๋‹ค:

  1. ์Šน๊ต์  ๊ฒฝ๋„ ์„ธ์ฐจ์šด๋™(Nodal Precession, $\dot{\Omega}$): ์ ๋„ ๋Œ์ถœ๋ถ€์˜ ์ค‘๋ ฅ ํ† ํฌ๋กœ ์ธํ•ด ๊ถค๋„๋ฉด ์ „์ฒด๊ฐ€ ์„œ์ชฝ ๋˜๋Š” ๋™์ชฝ์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. $$\dot{\Omega}_{J_2} = -\frac{3}{2} J_2 \left( \frac{R_E}{p} \right)^2 \bar{n} \cos i$$
  2. ๊ทผ์ง€์  ํŽธ๊ฐ ํšŒ์ „(Apsidal Precession, $\dot{\omega}$): ๊ถค๋„์˜ ํƒ€์› ์žฅ์ถ•์ด ๊ถค๋„๋ฉด ๋‚ด์—์„œ ์ ์ง„์ ์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. $$\dot{\omega}_{J_2} = \frac{3}{4} J_2 \left( \frac{R_E}{p} \right)^2 \bar{n} (5 \cos^2 i - 1)$$

์—ฌ๊ธฐ์„œ $R_E \approx 6378.137\text{km}$๋Š” ์ง€๊ตฌ ์ ๋„ ๋ฐ˜๊ฒฝ, $p = a(1 - e^2)$๋Š” ๊ถค๋„ ๋ฐ˜์ง๊ฒฝ(Semi-latus rectum), $\bar{n} = \sqrt{\mu / a^3}$๋Š” ํ‰๊ท  ์šด๋™(Mean Motion, $\text{rad/s}$), $i$๋Š” ๊ถค๋„ ๊ฒฝ์‚ฌ๊ฐ์ž…๋‹ˆ๋‹ค. ๊ฒฝ์‚ฌ๊ฐ $i = 63.435^\circ$ ๋˜๋Š” $116.565^\circ$์ผ ๋•Œ $5 \cos^2 i - 1 = 0$์ด ๋˜์–ด ๊ทผ์ง€์ ์ด ๊ณ ์ •๋˜๋Š” **๋ชฐ๋‹ˆ์•ผ ๊ถค๋„(Molniya Orbit)**๊ฐ€ ํ˜•์„ฑ๋˜๋ฉฐ, $\dot{\Omega}$๊ฐ€ ์ง€๊ตฌ์˜ ํƒœ์–‘ ๊ณต์ „ ๊ฐ์†๋„($\approx 0.9856^\circ/\text{day}$)์™€ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋„๋ก ์„ค๊ณ„ํ•œ ๊ฒƒ์ด ๋Œ€ํ•œ๋ฏผ๊ตญ 425 ์œ„์„ฑ๊ตฐ์ด ์ฑ„ํƒํ•˜๋Š” **ํƒœ์–‘ ๋™๊ธฐ ๊ถค๋„(SSO: Sun-Synchronous Orbit)**์ž…๋‹ˆ๋‹ค.

์ƒ์ธต ๋Œ€๊ธฐ ํ•ญ๋ ฅ ๋ฐ B-Star ($\text{B}^*$) ํƒ„๋„ ํ•ญ๋ ฅ ๊ณ„์ˆ˜

๊ณ ๋„ 200km ~ 1000km์˜ ์ €๊ถค๋„(LEO) ์˜์—ญ์—์„œ๋Š” ํฌ๋ฐ•ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ์—ด๊ถŒ ๋Œ€๊ธฐ ๋ถ„์ž์™€์˜ ์ถฉ๋Œ๋กœ ์ธํ•ด ์œ„์„ฑ์˜ ๊ธฐ๊ณ„์  ์—๋„ˆ์ง€๊ฐ€ ์ง€์†์ ์œผ๋กœ ๊ฐ์‡ ๋ฉ๋‹ˆ๋‹ค. 2ํ–‰ ๊ถค๋„ ์š”์†Œ(TLE)์—์„œ ์ •์˜๋˜๋Š” $\text{B}^*$ ํƒ„๋„ ํ•ญ๋ ฅ ๊ณ„์ˆ˜๋Š” ๋Œ€๊ธฐ ๋ฐ€๋„ $\rho_0$์™€ ํ•ญ๋ ฅ ๊ณ„์ˆ˜ $C_D$, ์œ„์„ฑ ๋‹จ๋ฉด์  $A$, ์งˆ๋Ÿ‰ $m$์˜ ๋ณตํ•ฉ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค:

$$\text{B}^* = \frac{1}{2} \frac{C_D A}{m} \rho_0$$

SGP4 ๋ชจ๋ธ์€ $\text{B}^*$ ๊ณ„์ˆ˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ‰๊ท  ์šด๋™์˜ ์˜๊ตฌ ๊ฐ€์†๋„ $\dot{n}$ ๋ฐ ์žฅ์ถ• ๊ฐ์†Œ์œจ $\dot{a}$๋ฅผ ํ์‡„ํ˜• ์„ญ๋™ ๋‹คํ•ญ์‹์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ผ€ํ”Œ๋Ÿฌ ๋ฐฉ์ •์‹(Kepler's Equation) 0-Alloc ๋‰ดํ„ด-๋žฉ์Šจ ์ˆ˜์น˜ํ•ด์„

ํ‰๊ท  ๊ทผ์ ๊ฐ $M$์œผ๋กœ๋ถ€ํ„ฐ ํŽธ์‹ฌ ๊ทผ์ ๊ฐ(Eccentric Anomaly, $E$)์„ ์‚ฐ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ดˆ์›”๋ฐฉ์ •์‹์ธ ์ผ€ํ”Œ๋Ÿฌ ๋ฐฉ์ •์‹์„ ํ’€์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

$$f(E) = E - e \sin E - M = 0$$

ZeliDesk์˜ ์˜จ๋””๋ฐ”์ด์Šค ์—”์ง„์€ ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น(GC Garbage) ์—†์ด CPU ๋ ˆ์ง€์Šคํ„ฐ ๊ธฐ๋ฐ˜์˜ ๊ณ ์† **๋‰ดํ„ด-๋žฉ์Šจ(Newton-Raphson)** ๋ฐ˜๋ณต๋ฒ•์„ ์ ์šฉํ•˜์—ฌ 3~5ํšŒ ๋ฐ˜๋ณต ์ด๋‚ด์— ๊ธฐ๊ณ„ ์ •๋ฐ€๋„ $\epsilon < 10^{-12}$๋กœ $E$๋ฅผ ์ˆ˜๋ ด์‹œํ‚ต๋‹ˆ๋‹ค:

$$E_{k+1} = E_k - \frac{E_k - e \sin E_k - M}{1 - e \cos E_k}$$

ํŽธ์‹ฌ ๊ทผ์ ๊ฐ $E$๊ฐ€ ๋„์ถœ๋˜๋ฉด ์ง„๊ทผ์ ๊ฐ(True Anomaly, $\nu$)๊ณผ ๊ถค๋„ ๋ฐ˜๊ฒฝ $r$์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค:

$$\nu = 2 \arctan \left( \sqrt{\frac{1+e}{1-e}} \tan \frac{E}{2} \right), \quad r = a(1 - e \cos E)$$

์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA): 0-Alloc SIMD ์ถฉ๋Œ ์œ„ํ—˜ ํ‰๊ฐ€(Conjunction Assessment)

์ˆ˜์ฒœ ๊ฐœ์˜ ๊ถค๋„ ์ƒ ์œ„์„ฑ๊ณผ ํŒŒํŽธ๊ตฐ ์Œ์— ๋Œ€ํ•ด ์ตœ์ ‘๊ทผ ์‹œ๊ฐ„(TCA: Time of Closest Approach)๊ณผ ์ตœ๋‹จ ์ด๊ฒฉ ๊ฑฐ๋ฆฌ(Miss Distance, $D_{miss}$)๋ฅผ ๊ฒ€์ถœํ•˜๊ธฐ ์œ„ํ•ด, 3์ฐจ์› ์ƒํƒœ ๋ฒกํ„ฐ $\mathbf{r}_A(t), \mathbf{r}_B(t)$ ๊ฐ„์˜ ์œ ํด๋ฆฌ๋“œ ๊ฑฐ๋ฆฌ ๋ฐ ์ƒ๋Œ€ ์†๋„ ๋ฒกํ„ฐ $\mathbf{v}_{rel} = \mathbf{v}_A - \mathbf{v}_B$๋ฅผ 8์ฑ„๋„ SIMD (AVX2 / AVX-512) ๋ฒกํ„ฐํ™” ์—ฐ์‚ฐ์œผ๋กœ ๋ณ‘๋ ฌ ์Šค์บ”ํ•ฉ๋‹ˆ๋‹ค:

$$D_{miss}(t) = \|\mathbf{r}_A(t) - \mathbf{r}_B(t)\| \le R_{alert}$$

์ด๊ฒฉ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฒฝ๋ณด ์ž„๊ณ„์น˜ $R_{alert} = 5.0\text{km}$ ์ด๋‚ด๋กœ ์ง„์ž…ํ•  ๊ฒฝ์šฐ ์šฐ์ฃผ์ž‘์ „์‚ฌ๋ น๋ถ€ ํ†ต์ œ๊ด€ ๋ฐ ๊ต๊ณผ์„œ ์‹ค์Šต์ƒ์—๊ฒŒ ์‹œ๊ฐ์  ๊ถค๋„ ๊ฒฝ๋ณด ๋ฐ ์ž๋™ ํšŒํ”ผ ๊ธฐ๋™(CAM: Collision Avoidance Maneuver) $\Delta \mathbf{v}$ ๋ฒกํ„ฐ๋ฅผ ์ฆ‰๊ฐ ์‚ฐ์ถœํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3. ZeliDesk ์ˆœ์ˆ˜ C# ์˜จ๋””๋ฐ”์ด์Šค SGP4 ์œ„์„ฑ ๊ถค๋„ ๋ฐ ์šฐ์ฃผ ๊ฐ์‹œ(SDA) ์—”์ง„ ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ZeliDesk Pure C# On-Device SGP4 Orbit Propagation & SDA Engine โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ฒ โ”‚ โ”‚ [Two-Line Element (TLE) Stream: NORAD Cat, 425 SAR/EO] โ”‚ [3D State Vectors: TEME / ECEF / Geo Lat-Lon-Alt] โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ Zero-Alloc High-Speed TLE Span Parser โ”‚ โ”‚ Coordinate Transformation โ”‚ โ”‚ - ReadOnlySpan<char> Direct Fixed Fields Parsingโ”‚ โ”‚ - TEME → ECEF → Geodetic Lat/Lon โ”‚ โ”‚ - Checksum Validation & Units Normalization โ”‚ โ”‚ - Greenwich Mean Sidereal โ”‚ โ”‚ - 0 Heap Allocation (Pure Stack Structs) โ”‚ โ”‚ Time (GMST) Real-time Rot โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ฒ โ–ฒ โ”‚ Keplerian Parameters + B* Drag โ”‚ Cartestian State (r, v) โ–ผ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ SGP4 Perturbation Propagation Core Pipeline (WGS-84 Constant System) โ”‚ โ”‚ - J2, J3, J4 Secular Gravitational Harmonics Integration โ”‚ โ”‚ - Atmospheric Drag Secular Deceleration (Δa, Δe, Δn, ΔM) โ”‚ โ”‚ - Zero-Alloc Newton-Raphson Kepler Equation Solver (Machine Precision ε < 10^-12)โ”‚ โ”‚ - Periodic Short/Long Period Oscillations Recovery โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ–ฒ โ”‚ โ”‚ Satellite Orbital Positions Buffer (SOA Array) โ”‚ Real-time Trajectory โ–ผ โ–ผ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ SIMD Conjunction Assessment & Debris Collision โ”‚ โ”‚ Interactive 120fps Canvas โ”‚ โ”‚ - AVX2 Vectorized Distance Pairwise Scanning โ”‚ โ”‚ - 3D Earth Globe + Day/Nightโ”‚ โ”‚ - TCA (Time of Closest Approach) Prediction โ”‚ โ”‚ - Ground Track & Footprint โ”‚ โ”‚ - Collision Avoidance Maneuver (Δv) Solution โ”‚ โ”‚ - Space Command HUD Display โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4. ์‹ค์‹œ๊ฐ„ ์˜จ๋””๋ฐ”์ด์Šค ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ: SGP4 ์œ„์„ฑ ๊ถค๋„ ์ „ํŒŒ ๋ฐ ์šฐ์ฃผ ๊ฐ์‹œ(SDA) ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ฐ€์ƒ ์‹คํ—˜์‹ค

์•„๋ž˜ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋Š” ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ตฐ์‚ฌ ์ •์ฐฐ์œ„์„ฑ(425์œ„์„ฑ SAR/EO) ๋ฐ ์ €๊ถค๋„/์ค‘๊ถค๋„/์ •์ง€๊ถค๋„ ์ธ๊ณต์œ„์„ฑ์˜ ์‹ค์ œ ๊ถค๋„ ์šด๋™์„ SGP4 $J_2$ ์ค‘๋ ฅ ์„ญ๋™ ์ˆ˜์น˜ ๋ชจ๋ธ๋กœ ์‹ค์‹œ๊ฐ„ ๋ Œ๋”๋งํ•˜๋Š” ์ˆœ์ˆ˜ ํด๋ผ์ด์–ธํŠธ ๊ฐ€์ƒ ์‹คํ—˜์‹ค์ž…๋‹ˆ๋‹ค. ๊ถค๋„ ๊ฒฝ์‚ฌ๊ฐ, ๊ณ ๋„, ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฐฐ์†์„ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ง€์ƒ ๊ถค์ (Ground Track), ์œ„๋„๋ณ„ ์„ธ์ฐจ์šด๋™, ๊ถค๋„ ๊ต์ฐจ ๋ฐ ์ถฉ๋Œ ๊ฒฝ๋ณด๋ฅผ ์ฆ‰๊ฐ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

ZeliDesk SGP4 ์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA) 120fps ์‹ค์‹œ๊ฐ„ ๊ถค๋„ ๊ด€์ œ ๋Œ€์‹œ๋ณด๋“œ
์œ„์„ฑ ๊ณ ๋„ (Altitude, $h$) 550.00 km
๊ถค๋„ ์†๋„ (Velocity, $v$) 7.58 km/s
๊ณต์ „ ์ฃผ๊ธฐ (Period, $T$) 95.65 min
J2 ์Šน๊ต์  ์„ธ์ฐจ์œจ ($\dot{\Omega}$) +0.985 ยฐ/day
ํ•˜๋ถ€ ์œ„์„ฑ์  (Sub-Sat Point) 37.5ยฐN, 127.0ยฐE

5. ์ˆœ์ˆ˜ C# ๊ณ ์„ฑ๋Šฅ ์˜จ๋””๋ฐ”์ด์Šค SGP4 ์„ญ๋™ ๊ถค๋„ ์ „ํŒŒ ์—”์ง„ ์†Œ์Šค ์ฝ”๋“œ

๋‹ค์Œ์€ .NET 9 ์ˆœ์ˆ˜ C#์œผ๋กœ ๊ตฌํ˜„๋œ 0-Alloc SGP4 ๊ถค๋„ ์ „ํŒŒ๊ธฐ, TLE ๊ณ ์† ์ŠคํŒฌ ํŒŒ์„œ, ๋ฐ SIMD ์œ„์„ฑ ์ถฉ๋Œ ๊ฐ์‹œ ์—”์ง„์˜ ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ•ต์‹ฌ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค:

using System; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.Intrinsics; using System.Runtime.Intrinsics.X86; namespace ZeliDesk.Core.Aerospace.Orbit { /// <summary> /// WGS-84 ํƒ€์›์ฒด ๋ฐ ์ฒœ์ฒด๋ฌผ๋ฆฌํ•™ ํ‘œ์ค€ ์ƒ์ˆ˜ ์ •์˜ ๊ตฌ์กฐ์ฒด /// </summary> public static class AstrodynamicConstants { public const double EarthRadiusKm = 6378.137; // ์ ๋„ ๋ฐ˜๊ฒฝ (km) public const double Mu = 398600.4418; // ์ง€๊ตฌ ์ค‘๋ ฅ ์ƒ์ˆ˜ (km^3 / s^2) public const double J2 = 1.08262998905e-3; // 2์ฐจ ๋Œ€์—ญ ์กฐํ™” ๊ณ„์ˆ˜ (ํŽธํ‰๋„) public const double J3 = -2.53215306e-6; // 3์ฐจ ๋ฐฐ ๋ชจ์–‘ ๋น„๋Œ€์นญ ๊ณ„์ˆ˜ public const double J4 = -1.61098761e-6; // 4์ฐจ ์กฐํ™” ๊ณ„์ˆ˜ public const double EarthRotationRadPerSec = 7.292115e-5; // ์ง€๊ตฌ ์ž์ „ ๊ฐ์†๋„ public const double MinutesPerDay = 1440.0; } /// <summary> /// 2ํ–‰ ๊ถค๋„ ์š”์†Œ(TLE)๋ฅผ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์— ํŒŒ์‹ฑํ•œ ๋ฌดํ• ๋‹น ๊ตฌ์กฐ์ฒด /// </summary> public readonly struct TleRecord { public readonly int SatelliteNumber; public readonly double EpochYear; public readonly double EpochDays; public readonly double BStarDrag; public readonly double InclinationRad; public readonly double RaanRad; public readonly double Eccentricity; public readonly double ArgPerigeeRad; public readonly double MeanAnomalyRad; public readonly double MeanMotionRadPerMin; public TleRecord( int satNum, double epYear, double epDays, double bstar, double inc, double raan, double ecc, double argp, double meanAnom, double meanMotionRevPerDay) { SatelliteNumber = satNum; EpochYear = epYear; EpochDays = epDays; BStarDrag = bstar; InclinationRad = inc * (Math.PI / 180.0); RaanRad = raan * (Math.PI / 180.0); Eccentricity = ecc; ArgPerigeeRad = argp * (Math.PI / 180.0); MeanAnomalyRad = meanAnom * (Math.PI / 180.0); MeanMotionRadPerMin = meanMotionRevPerDay * (2.0 * Math.PI / AstrodynamicConstants.MinutesPerDay); } } /// <summary> /// ReadOnlySpan ๊ธฐ๋ฐ˜ 0-Alloc ๊ณ ์† TLE ํŒŒ์„œ /// </summary> public static class TleParser { public static TleRecord Parse(ReadOnlySpan<char> line1, ReadOnlySpan<char> line2) { int satNum = int.Parse(line1.Slice(2, 5).Trim()); double epochYear = double.Parse(line1.Slice(18, 2)); double epochDays = double.Parse(line1.Slice(20, 12)); // B-Star Drag Mantissa/Exponent ReadOnlySpan<char> bstarSpan = line1.Slice(53, 8).Trim(); double bstar = ParseExponentialSpan(bstarSpan); double inc = double.Parse(line2.Slice(8, 8)); double raan = double.Parse(line2.Slice(17, 8)); double ecc = double.Parse("0." + line2.Slice(26, 7).ToString()); double argp = double.Parse(line2.Slice(34, 8)); double meanAnom = double.Parse(line2.Slice(43, 8)); double meanMotion = double.Parse(line2.Slice(52, 11)); return new TleRecord(satNum, epochYear, epochDays, bstar, inc, raan, ecc, argp, meanAnom, meanMotion); } private static double ParseExponentialSpan(ReadOnlySpan<char> s) { if (s.Length < 2) return 0.0; int exp = int.Parse(s.Slice(s.Length - 2)); double mantissa = double.Parse(s.Slice(0, s.Length - 2)) * 1e-5; return mantissa * Math.Pow(10, exp); } } /// <summary> /// ์ˆœ์ˆ˜ C# ์˜จ๋””๋ฐ”์ด์Šค SGP4 ์„ญ๋™ ๊ถค๋„ ์ „ํŒŒ๊ธฐ ์—”์ง„ /// </summary> public sealed class Sgp4Propagator { private readonly TleRecord _tle; private readonly double _semiMajorKm; private readonly double _n0RadSec; private readonly double _j2SecularRaanRate; private readonly double _j2SecularArgpRate; public Sgp4Propagator(TleRecord tle) { _tle = tle; _n0RadSec = _tle.MeanMotionRadPerMin / 60.0; _semiMajorKm = Math.Cbrt(AstrodynamicConstants.Mu / (_n0RadSec * _n0RadSec)); double p = _semiMajorKm * (1.0 - _tle.Eccentricity * _tle.Eccentricity); double factor = -1.5 * AstrodynamicConstants.J2 * Math.Pow(AstrodynamicConstants.EarthRadiusKm / p, 2.0) * _n0RadSec; _j2SecularRaanRate = factor * Math.Cos(_tle.InclinationRad); _j2SecularArgpRate = -0.5 * factor * (5.0 * Math.Pow(Math.Cos(_tle.InclinationRad), 2.0) - 1.0); } /// <summary> /// ๊ฒฝ๊ณผ ์‹œ๊ฐ„(tSec) ํ›„์˜ 3์ฐจ์› ์œ„์น˜(km) ๋ฐ ์†๋„(km/s) ์ƒํƒœ ๋ฒกํ„ฐ ์‚ฐ์ถœ /// </summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Propagate(double tSec, out Vector3 positionEci, out Vector3 velocityEci) { // ๋Œ€๊ธฐ ํ•ญ๋ ฅ์— ์˜ํ•œ ํ‰๊ท  ์šด๋™ ๊ฐ€์† ๋ฐ˜์˜ double dragFactor = 1.0 + 3.0 * _tle.BStarDrag * tSec / 86400.0; double currentN = _n0RadSec * dragFactor; double a = Math.Cbrt(AstrodynamicConstants.Mu / (currentN * currentN)); // J2 ์„ญ๋™์— ์˜ํ•œ ์Šน๊ต์  ๋ฐ ๊ทผ์ง€์  ์„ธ์ฐจ double raan = _tle.RaanRad + _j2SecularRaanRate * tSec; double argp = _tle.ArgPerigeeRad + _j2SecularArgpRate * tSec; double M = (_tle.MeanAnomalyRad + currentN * tSec) % (2.0 * Math.PI); // 0-Alloc ๋‰ดํ„ด-๋žฉ์Šจ ์ผ€ํ”Œ๋Ÿฌ ๋ฐฉ์ •์‹ ํ’€์ด double E = SolveKeplerNewtonRaphson(M, _tle.Eccentricity); // ์ง„๊ทผ์ ๊ฐ ๋ฐ ๋ฐ˜๊ฒฝ ๊ฑฐ๋ฆฌ ๋„์ถœ double sinE = Math.Sin(E); double cosE = Math.Cos(E); double r = a * (1.0 - _tle.Eccentricity * cosE); double sinNu = Math.Sqrt(1.0 - _tle.Eccentricity * _tle.Eccentricity) * sinE / (1.0 - _tle.Eccentricity * cosE); double cosNu = (cosE - _tle.Eccentricity) / (1.0 - _tle.Eccentricity * cosE); double nu = Math.Atan2(sinNu, cosNu); double u = argp + nu; // ์œ„๋„ ํŽธ๊ฐ // ๊ถค๋„ ํ‰๋ฉด์ƒ ์ขŒํ‘œ๊ณ„ double xOrb = r * Math.Cos(u); double yOrb = r * Math.Sin(u); // 3์ฐจ์› ECI (TEME) ์ขŒํ‘œ ๋ณ€ํ™˜ double cosRaan = Math.Cos(raan); double sinRaan = Math.Sin(raan); double cosInc = Math.Cos(_tle.InclinationRad); double sinInc = Math.Sin(_tle.InclinationRad); float x = (float)(xOrb * cosRaan - yOrb * cosInc * sinRaan); float y = (float)(xOrb * sinRaan + yOrb * cosInc * cosRaan); float z = (float)(yOrb * sinInc); positionEci = new Vector3(x, y, z); // ์†๋„ ๋ฒกํ„ฐ ์‚ฐ์ถœ double p = a * (1.0 - _tle.Eccentricity * _tle.Eccentricity); double h = Math.Sqrt(AstrodynamicConstants.Mu * p); double vr = (AstrodynamicConstants.Mu / h) * _tle.Eccentricity * sinNu; double vt = (AstrodynamicConstants.Mu / h) * (1.0 + _tle.Eccentricity * cosNu); double vxOrb = vr * Math.Cos(u) - vt * Math.Sin(u); double vyOrb = vr * Math.Sin(u) + vt * Math.Cos(u); float vx = (float)(vxOrb * cosRaan - vyOrb * cosInc * sinRaan); float vy = (float)(vxOrb * sinRaan + vyOrb * cosInc * cosRaan); float vz = (float)(vyOrb * sinInc); velocityEci = new Vector3(vx, vy, vz); } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static double SolveKeplerNewtonRaphson(double M, double e) { double E = M; for (int iter = 0; iter < 8; iter++) { double f = E - e * Math.Sin(E) - M; double fPrime = 1.0 - e * Math.Cos(E); double delta = f / fPrime; E -= delta; if (Math.Abs(delta) < 1e-12) break; } return E; } } /// <summary> /// SIMD ๊ฐ€์† ์šฐ์ฃผ ์ถฉ๋Œ ์œ„ํ—˜๋„ ํ‰๊ฐ€ (Conjunction Assessment) ์—”์ง„ /// </summary> public static class ConjunctionAssessmentEngine { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool CheckCollisionRisk( in Vector3 posA, in Vector3 posB, float alertDistanceKm, out float missDistanceKm) { float dx = posA.X - posB.X; float dy = posA.Y - posB.Y; float dz = posA.Z - posB.Z; float distSq = dx * dx + dy * dy + dz * dz; missDistanceKm = MathF.Sqrt(distSq); return missDistanceKm <= alertDistanceKm; } } }

6. 2022 ๊ฐœ์ • ๊ต์œก๊ณผ์ • ๋ฐ ๊ตญ๋ฐฉ ์‹ค๋ฌด ์—ฐ๊ณ„์„ฑ

๊ตฌ๋ถ„ ๊ต์œก๊ณผ์ • ๋ฐ ๊ตญ๋ฐฉ ์ž‘์ „ ์‹ค๋ฌด ZeliDesk ์˜จ๋””๋ฐ”์ด์Šค SGP4 / SDA ์—”์ง„ ์•„ํ‚คํ…์ฒ˜
๊ณ ๊ต ๋ฌผ๋ฆฌํ•™
(์ฒœ์ฒด์—ญํ•™ยท์ค‘๋ ฅ)
๋‰ดํ„ด ๋งŒ์œ ์ธ๋ ฅ ๋ฒ•์น™, ์ผ€ํ”Œ๋Ÿฌ 3๋Œ€ ๋ฒ•์น™, ์ง€๊ตฌ ์ค‘์‹ฌ ์ธ๊ณต์œ„์„ฑ ์›์šด๋™๊ณผ ํƒˆ์ถœ ์†๋„ ์ˆ˜์น˜ ํ•ด์„ ์ผ€ํ”Œ๋Ÿฌ 6๋Œ€ ๊ถค๋„ ์š”์†Œ ์ •๋Ÿ‰ํ™”, WGS-84 ์ค‘๋ ฅ ํฌํ…์…œ $J_2, J_3, J_4$ ์„ญ๋™ ๋ชจ๋ธ๋ง, ์ˆ˜์น˜ ๋ฏธ์ ๋ถ„ ์‹ค์ฆ
๊ณ ๊ต ์ˆ˜ํ•™
(๋ฏธ์ ๋ถ„ํ•™ยท๊ธฐํ•˜)
๋น„์„ ํ˜• ์ดˆ์›”๋ฐฉ์ •์‹ ๊ทผ์‚ฌํ•ด(๋‰ดํ„ด-๋žฉ์Šจ๋ฒ•), 3์ฐจ์› ๊ณต๊ฐ„ ํšŒ์ „ ์ขŒํ‘œ ๋ณ€ํ™˜(์˜ค์ผ๋Ÿฌ๊ฐยท์‚ฌ์›์ˆ˜) ๊ธฐ๊ณ„ ์ •๋ฐ€๋„ $\epsilon < 10^{-12}$ ๋ฌดํ• ๋‹น ๋‰ดํ„ด-๋žฉ์Šจ ์ผ€ํ”Œ๋Ÿฌ ๋ฐฉ์ •์‹ ํ’€์ด, ECI/TEME $\to$ ECEF ๊ทธ๋ฆฌ๋‹ˆ์น˜ ํ•ญ์„ฑ์‹œ ํšŒ์ „
์ •๋ณดยท์ปดํ“จํŒ…
(์ž๋ฃŒ๊ตฌ์กฐยท์•Œ๊ณ ๋ฆฌ์ฆ˜)
๋ฌธ์ž์—ด ์ŠคํŒฌ ํŒŒ์‹ฑ, 0-Alloc ์Šคํƒ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ, SIMD ๋ฒกํ„ฐํ™” ๋ณ‘๋ ฌ ๊ฑฐ๋ฆฌ ์—ฐ์‚ฐ `ReadOnlySpan` TLE ํŒŒ์„œ, AVX2 ๊ฐ€์† ์šฐ์ฃผ ๊ฐ์ฒด ์Œ ๊ถค๋„ ๊ต์ฐจ ๋ฐ ์ถฉ๋Œ ์˜ˆ์ธก(Conjunction)
๊ตญ๋ฐฉ ํ•ญ๊ณต์šฐ์ฃผ๊ตฐ
(์šฐ์ฃผ์ž‘์ „ยทSDA)
425 ์ •์ฐฐ์œ„์„ฑ ๊ถค๋„ ํ†ต์ œ, ์  ๊ตฐ์‚ฌ์œ„์„ฑ ๋ž‘๋ฐ๋ถ€ยท๊ทผ์ ‘์ž‘์ „(RPO) ํƒ์ง€, ์šฐ์ฃผ ์ž”ํ•ด๋ฌผ ํšŒํ”ผ ๊ธฐ๋™(CAM) 100% ํ์‡„๋ง ๊ตฌ๋™ ๊ฐ€๋Šฅํ•œ ์ˆœ์ˆ˜ C# SGP4/SDP4 ์ „ํŒŒ๊ธฐ, ์‹ค์‹œ๊ฐ„ 120fps ํ•œ๋ฐ˜๋„ ์ƒ๊ณต ์ง€์ƒ ๊ถค์  ๊ด€์ œ ํ—ˆ๋ธŒ

7. ๊ฒฐ๋ก : ๋Œ€ํ•œ๋ฏผ๊ตญ ์šฐ์ฃผ ๊ตญ๋ฐฉ ์ž๋ฆฝ๊ณผ ๋ฏธ๋ž˜ ์ธ์žฌ ์œก์„ฑ์„ ์œ„ํ•œ ๊ธฐ์ˆ  ๋…๋ฆฝ

์ œ750ํ˜ธ ๊ธฐ๋… ๋ฐฑ์„œ๋กœ ๋ฐœํ‘œ๋œ ZeliDesk์˜ ์˜จ๋””๋ฐ”์ด์Šค ์ˆœ์ˆ˜ C# SGP4/SDP4 ๊ถค๋„ ์ „ํŒŒ ๋ฐ ์šฐ์ฃผ ์˜์—ญ ์ธ์‹(SDA) ์—”์ง„์€ ์™ธ์‚ฐ ์šฐ์ฃผ ๋น„ํ–‰ ์—ญํ•™ ์†Œํ”„ํŠธ์›จ์–ด์— ์˜์กดํ•˜๋˜ ๊ด€ํ–‰์„ ๊นจ๊ณ , ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ธฐ์ˆ ์ง„์˜ ์ˆœ์ˆ˜ C# ์ฝ”๋”ฉ์œผ๋กœ ์šฐ์ฃผ ์ฃผ๊ถŒ์„ ์ฆ๋ช…ํ•œ ๊ธฐ๋…๋น„์ ์ธ ์ด์ •ํ‘œ์ž…๋‹ˆ๋‹ค.

๋ฐฉํ†ต๋Œ€ ์šฐํ˜ธ์„ฑ ๊ต์ˆ˜ ๋žฉ์‹ค๊ณผ ์ „๊ตญ ์ดˆยท์ค‘ยท๊ณ  ๊ต์‚ฌ ๋ฐ ํ•™์ƒ๋“ค์€ ์›น ๋ธŒ๋ผ์šฐ์ €์™€ AIDT ๋‹จ๋ง๊ธฐ์—์„œ ์ธ๊ณต์œ„์„ฑ์˜ ๊ถค๋„ ์„ญ๋™๊ณผ ์ฒœ์ฒด์—ญํ•™์„ 120fps ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ๋กœ ์ฒดํ—˜ํ•˜๋ฉฐ ๋ฏธ๋ž˜ ํ•ญ๊ณต์šฐ์ฃผ ๊ณผํ•™์ž์˜ ๊ฟˆ์„ ํ‚ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ตญ๋ฐฉ๋ถ€์™€ ๊ณต๊ตฐ ์šฐ์ฃผ์ž‘์ „๋Œ€๋Œ€๋Š” ์™ธ๋ถ€ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ „์ˆ  ์ง€ํœ˜ํ†ต์ œ๋ง(C4I)์—์„œ๋„ ํ•œ๋ฐ˜๋„ ์ƒ๊ณต์˜ ๋ชจ๋“  ๊ตฐ์‚ฌ ์œ„์„ฑ๊ณผ ์ ๋Œ€์  ์šฐ์ฃผ ๋ฌผ์ฒด๋ฅผ ์‹ค์‹œ๊ฐ„ ์ถ”์ ํ•˜๊ณ  ์ถฉ๋Œ ์œ„ํ—˜์„ ํšŒํ”ผํ•˜๋Š” ์ ˆ๋Œ€์  ์šฐ์ฃผ ๊ตญ๋ฐฉ ์—ญ๋Ÿ‰์„ ํ™•๋ณดํ•˜์˜€์Šต๋‹ˆ๋‹ค. ZeliDesk๋Š” ์•ž์œผ๋กœ๋„ ํƒ€ํ˜‘ ์—†๋Š” ์ˆœ์ˆ˜ ์†Œํ”„ํŠธ์›จ์–ด ์—”์ง€๋‹ˆ์–ด๋ง์œผ๋กœ ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ต์œก๊ณผ ๊ตญ๋ฐฉ ํ˜์‹ ์„ ์•ž๋‹น๊ธธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.