Как программно рассчитать элементы орбиты, используя векторы положения/скорости?

Я хотел бы создать программное обеспечение для орбитальной механики с нуля. Я чувствую, что это был бы отличный способ изучить шаги, необходимые для вычисления различных элементов кеплеровской орбиты объекта, построения орбит и предсказания, где объект будет находиться в будущем.

В частности, я хочу начать с вычисления кепларианских элементов. Входными данными, которые я бы дал программе, были векторы положения и скорости, а также время. Эти входные векторы будут относиться к центру Земли, поэтому мне также может понадобиться выполнить передачу координат, если я хочу использовать определенное место на поверхности в качестве точки отсчета.

Я видел математику для расчета элементов орбиты Кеплера из этой книги , и я знаю, что за эти годы было разработано много программного обеспечения для их расчета, но мне трудно совместить их. Математика в книге немного сбивает с толку, и я думаю, что мне было бы легче понять, если бы я увидел шаги, «записанные» на языке программирования.

Я могу использовать R или Python. Векторизованный код с большинства языков я должен уметь переводить на один из этих двух. Спасибо! @Chris Я собираюсь обновить вопрос еще раз, добавив немного больше информации о моих проблемах с переводом математики в код.
Загляните на orsa.sourceforge.net , чтобы узнать об их решениях/методах. Долгое обсуждение здесь physicsforums.com/showthread.php?t=232778 . А для базового моделирования Python F=ma: пятьдесят примеров.readthedocs.org/en/latest/ gravity.html
FWIW, если вашей целью является вычисление будущего положения, обычно нет особых причин для преобразования вектора положения и скорости в элементы Кеплера. Просто вычислите и примените сопротивление и силу тяжести в вашем текущем местоположении и скорости и интегрируйте вперед небольшими шагами.

Ответы (3)

Даны центрированные на Земле, инерциальные (ECI) положение и векторы скорости р а также в , вы можете напрямую решить для классических орбитальных элементов ( а , е , я , Ом , ю , ν ) следующим образом (сначала алгоритмы, а затем псевдокод внизу):

Сначала найдите угловой момент

час знак равно р × в

тогда вектор узла

н ^ знак равно К ^ × час
который будет использован позже.

Тогда вектор эксцентриситета равен

е знак равно ( в 2 мю / р ) р ( р в ) в мю

а также е знак равно | е | .

Удельная механическая энергия

Е знак равно в 2 2 мю р

Если е 1 , тогда

а знак равно мю 2 Е
п знак равно а ( 1 е 2 )
В противном случае,
п знак равно час 2 мю
а знак равно

В настоящее время,

я знак равно потому что 1 час К час
Ом знак равно потому что 1 н я н
ю знак равно потому что 1 н е н е
ν знак равно потому что 1 е р е р

И вам нужно будет сделать следующие проверки: Если н Дж < 0 , тогда Ом знак равно 360 Ом ,

Если е К < 0 , тогда ю знак равно 360 ю , а также

Если р в < 0 , тогда ν знак равно 360 ν .

Обратите внимание, что в некоторых случаях вы столкнетесь с проблемами (особенностями): круговые орбиты ( е 0 ), и экваториальные орбиты ( я 0 ), особенно. В этих случаях вы обычно вводите новую, менее хлопотную переменную, например, среднюю долготу или истинную долготу перигея.

h=cross(r,v)
nhat=cross([0 0 1],h)

evec = ((mag(v)^2-mu/mag(r))*r-dot(r,v)*v)/mu
e = mag(evec)

energy = mag(v)^2/2-mu/mag(r)

if abs(e-1.0)>eps
   a = -mu/(2*energy)
   p = a*(1-e^2)
else
   p = mag(h)^2/mu
   a = inf

i = acos(h(3)/mag(h))

Omega = acos(n(1)/mag(n))

if n(2)<0
   Omega = 360-Omega

argp = acos(dot(n,evec)/(mag(n)*e))

if e(3)<0
   argp = 360-argp

nu = acos(dot(evec,r)/(e*mag(r))

if dot(r,v)<0
   nu = 360 - nu

Примечание : это следует из метода, изложенного в «Основах астродинамики и приложений » Вальядо, 2007.

Наконец-то воссоздал на Python. Спасибо за помощь! Это было довольно легко, и теперь я понимаю математику намного лучше.
Я хотел бы увидеть доказательство этих уравнений, а также их применение в реальной задаче получения набора элементов орбиты. Нужны ли орбитальные элементы, если у вас есть эти векторы положения и скорости для начала? Кажется, векторное исчисление может справиться с этим достаточно просто. Кроме того, меня смущает тот факт, что вы не дали определение маленькому мю. Также v-вектор является первой производной r-вектора по времени. N-шляпа - это единичный вектор, но вы не показали математику для его объединения. Каковы значения n и h в индексе? Кроме того, вы не смогли показать, как получить среднюю аномалию и среднее движение.
Как насчет расчета средней аномалии?
Есть ли разница между nhat и n? Я не уверен, что такое n (предположим, что n — это вектор узла), но он использовался для вычисления аргумента перицентра. Я предполагаю, что n совпадает с nhat, и n было использовано по ошибке?
Для программирования я бы предпочел использовать эквивалентные отношения с помощью функции atan2, потому что это автоматически выполняет разрешение квадрантов и защищает вас от необходимости проверять диапазон перед большинством применений acos выше. (Иногда числовая точность приводит к тому, что аргумент функции acos очень немного выходит за допустимый диапазон от -1,00000 до +1,00000. Когда это происходит, программа, как показано, аварийно завершает работу.) Также возможно, что h равно нулю, допускает ошибку деления на ноль.
Какой кат во второй строке? Я вижу в примере кода [0 0 1] — это нормальный вектор земной экваториальной плоскости?
Одна из проблем заключается в том, что это берет точки r и v и превращает их в элементы в этот момент, что не будет обычными средними значениями в наборе двухстрочных элементов. Что люди делают для создания TLE из векторов, так это распространяют вектор вперед с помощью численного интегрирования, а затем подбирают условия TLE, чтобы соответствовать ему. Если вы достаточно высоки, то вы, вероятно, можете игнорировать термин перетаскивания. Если вам не нужна сверхвысокая точность, вы можете смоделировать Землю как точечную массу.
Что такое a? Я смотрю на это эталонное изображение .
Что такое вектор узлов n^? Что такое K^? Что такое μ? Что такое rи чем отличается r⃗? А как насчет vи v⃗? Что такое p?
Что такое h_Kи n_I?
@MattJessick Как бы вы сделали это, используя Atan2?

Первый ключ к выяснению этого — правильная система координат. Для таких вещей обычно используются две системы координат. Это фиксированные кадры с центрированием на земле ( ECEF ) и кадры с центрированием на земле (ECI). В полночь эти две точки точно совпадают, но в другое время они расходятся в зависимости от вращения Земли. ECEF лучше всего работает для вещей на Земле (если вы не двигаетесь, у вас должна быть нулевая скорость. ECEF принимает это во внимание, скорость ECI заставит вас двигаться вместе с вращением Земли), ECI лучше всего работает для вещей на орбите (орбитальное движение). объекты не заботятся о вращении Земли, по крайней мере, физике все равно). Убедитесь, что системы координат правильные!

Итак, у вас есть положение и скорость в координатах ECI, что вы делаете? Есть отличная статья , описывающая весь процесс, конечные формулы которой я скопирую сюда. Есть также несколько хороших источников здесь , здесь и здесь . Я настоятельно рекомендую внимательно их прочитать. Неопределенность гораздо сложнее, так что давайте просто предположим, что вы в совершенстве знаете скорость и положение. В частности, 6 классических элементов Кеплариана — это эксцентриситет (е), наклон (i), прямое восхождение восходящего узла ( Ом ), аргумент перигея ( ю ), большая полуось (а) и время прохождения перигея ( Т О ).

Я должен упомянуть, что я в первую очередь следую методу определения орбиты Лапласа , существует конкурирующая методология, известная как метод Гаусса. Но в конце концов дело дошло до расшифровки кода Matlab .

Большая полуось

Вт с знак равно 1 2 * в 2 с Мус . / р ;

а знак равно м ты с / 2. / Вт с ; % большая полуось

Эксцентриситет

L = [rs(2,:).*vs(3,:) - rs(3,:).*vs(2,:);...
     rs(3,:).*vs(1,:) - rs(1,:).*vs(3,:);...
     rs(1,:).*vs(2,:) - rs(2,:).*vs(1,:)]; %angular momentum

п знак равно л 2 . / м ты с ; % полуширокая прямая кишка

е знак равно 1 п / а ;

наклон

я знак равно а т а н ( л ( 1 , : ) 2 + л ( 2 , : ) 2 л ( 3 , : ) ) ;

Аргументы Перицентра

ю знак равно а т а н 2 ( ( в с ( 1 , : ) . * л ( 2 , : ) в с ( 2 , : ) . * л ( 1 , : ) ) . / м ты с р с ( 3 , : ) . / р ) . / ( е . * с я н ( я ) ) ( ( л 2 с . * в с ( 3 , : ) ) . / м ты с ( л ( 1 , : ) . * р с ( 2 , : ) л ( 2 , : ) . * р с ( 1 , : ) ) . / ( л 2 с . * р ) ) . / ( е . * с я н ( я ) ) )

Долгота восходящего узла

Ом знак равно а т а н 2 ( л ( 2 , : ) , л ( 1 , : ) ) ;

Время прохождения перигея:

Т 0 знак равно ( Е е . * с я н ( Е ) ) . / м ты с . * а . 3

Метод Лапласа - это метод начального определения орбиты по измерениям углов и (я думаю) далеко за пределами того, что ищет OP. Если у вас есть положение и скорость ECI, получение кеплеровских элементов — это просто простое преобразование координат .
@Chris: Я знал, что должен быть более простой способ сделать преобразование ... Вздох.
А как насчет системы координат с точки зрения хиральности и ориентации? Насколько я могу судить, большинство гидов используют Z-is-up. Как эти формулы могут быть реализованы в левосторонней системе Y вверху, такой как Unity, или в правосторонней системе Y вверху, такой как Godot?

OrbitalPy имеет удобную elements_from_state_vectorфункцию, которая делает именно это:

https://github.com/RazerM/orbital/blob/0.7.0/orbital/utilities.py#L252

Вы можете проверить, что математика такая же, как в ответе пользователя 29.

Эй, это довольно круто! Я с нетерпением жду возможности попробовать это. Во втором примере в документации под названием « Создать орбиту Молния » может ли OrbitalPy реализовать прецессию? Есть ли место, чтобы добавить J2? (и я думаю, что Молния должна быть написана с большой буквы - я думаю, что это квалифицируется как имя собственное).
Я сам не знаком с OrbitalPy, но из ограниченного анализа исходного кода, который я провел, видно, что он выполняет чистое кеплеровское распространение с двумя телами, без каких-либо возмущений, поэтому без поправок на эллипсоид.
Это написано с учетом системы координат "Z-is-up"? Если у меня есть система координат "Y-is-up", должен ли я поменяться местами h.zс h.yи [0, 0, 1]с [0, 1, 0]?
«Аргумент перицентра — это угол между вектором эксцентриситета и его компонентой x». Почему?