Тангаж, рысканье в норме. Выводим на орбиту ИСЗ.

 

image

Мои поздравления по случаю состоявшейся вчера 54-летней годовщины начала космической эры. В честь этого знаменательного события, которое отмечало все прогрессивное человечество, давайте тоже что-нибудь запустим. Начнем с момента, когда изделие вышло на орбиту, сориентировалось и приступило к штатной задаче мониторинга земной поверхности на предмет несанкционированных очагов возгорания, раннего обнаружения нефтяных пятен в районах, к тому не предназначенных, и прочей экологии. При помощи появившейся в SQL Server Denali поддержки FULLGLOBE проложим на глобусе его наземную трассу, чтобы понять, где конкретно оно в данный момент летит.

Для начала понадобится привязаться к какой-нибудь стандартной геодезической системе координат. Для операций планетного масштаба распространена геоцентрическая эллипсоидальная система WGS-84 (World Geodetic System), разработанная Военно-картографическим ведомством Министерства обороны США, последняя, 3-я редакция которой опубликована в 1997 г., она же используется в GPS, которая в SQL Server значится под SRID = 4326. Эллипсоид - тело, полученное вращением эллипса вокруг его в данном случае малой оси (Земля имеет неправильную сплюснутую с полюсов форму), размеры осей которого подобраны так, чтобы среднеквадратичное отклонение от поверхности Земли (геоида) было минимально либо по всей поверхности в целом, либо для заданной территории, например, России.

 

Топографической службой Вооруженных сил РФ разработана система ПЗ-90 на основе эллипсоида, построенного группой под руководством директора ЦНИИГАиК Ф.Н.Красовского и проф.А.А.Изотова, которая используется, в частности в ГЛОНАСС. Постановлением Правительства от 28 июля 2000 г. N 568 "Об установлении единых государственных систем координат" в России приняты в качестве стандарта геоцентрическая система координат "Параметры Земли 1990 года" (ПЗ-90) для использования в целях геодезического обеспечения орбитальных полетов и решения навигационных задач и система геодезических координат 1995 года (СК-95) для использования при осуществлении геодезических и картографических работ, начиная с 1 июля 2002 г. В SQL Server она значится под SRID = 4200.

 

Из-за того, что большинство карт, которые мне удалось найти в бесплатном доступе, привязаны к WGS-84, использовать в данном посте отечественную разработку не удастся :(

image

 

image

Рис.1

 

Параметры системы, которые могут пригодиться в дальнейшем, я свел в таблицу и написал функцию для их извлечения:

 

use tempdb

 

if object_id('Константы_WGS84', 'U') is not null drop table Константы_WGS84

create table Константы_WGS84 (name varchar(5) primary key, value float, description nvarchar(300))

insert Константы_WGS84 (name, value, description) values ('Ra', 6378137, 'Большая полуось эллипсоида Земли, м'),

                                                                                    ('f', 298.257223563, 'Сплюснутость'),

                                                                                    ('Wz', 7.2921158553e-5, 'Угловая скорость вращения Земли, рад/с'),

                                                                                    ('Gz', 398600.5e9, 'Геоцентрическая гравитационная постоянная, м3/с2')

go

if object_id('Константа_WGS84', 'FN') is not null drop function Константа_WGS84

go

create function Константа_WGS84(@name varchar(5)) returns float as

begin

 return (select value from Константы_WGS84 where name = @name)

end

go

insert Константы_WGS84 (name, value, description) values ('Rb', dbo.Константа_WGS84('Ra') * (1 - 1 / dbo.Константа_WGS84('f')), 'Малая полуось эллипсоида Земли, м'),

                                                                                    ('eZ', sqrt(dbo.Константа_WGS84('Ra') * dbo.Константа_WGS84('Ra') - dbo.Константа_WGS84('Rb') * dbo.Константа_WGS84('Rb')) / dbo.Константа_WGS84('Ra'), 'Эксцентриситет')

Рис.2

 

Частично их можно найти тут:

 

select * from sys.spatial_reference_systems where spatial_reference_id = 4326

Рис.3

 

остальные - поиском в Интернете.

 

Сплюснутость по науке называется коэффициентом сжатия и считается как большая полуось / (большая полуось - малая полуось). Геоцентрическая гравитационная постоянная считается как глобальная гравитационная постоянная (это которую в 6 классе на крутильных весах определял Кавендиш) умножить на массу Земли с учетом атмосферы.

 

Для простоты будем рассматривать невозмущенное движение спутника, пренебрегая нецентральностью гравитационного поля Земли, обусловленной неравномерным распределением масс, трением атмосферы, влиянием Солнца, Луны и остальных небесных тел, радиацией, намагниченностью, релятивистскими эффектами и нечистой силой, иначе мы зашьемся и ничего не нарисуем.

 

Для описания невозмущенного движения достаточно трех законов Кеплера, которые все тоже проходили в школе то ли по физике, то ли по астрономии ближе к 10 кл. Первый из них гласит, что в поле тяготения тела движутся по коническим сечениям, в частности, по эллипсу, в одном из фокусов которого расположен притягивающий центр, если, конечно, у них не хватает сил оторваться по параболе. Не говоря про гиперболу, по которой вообще можно оторваться так, что мама не горюй. Как известно из курса военной подготовки, эллипс - это круг, вписанный в прямоугольник. Это отточенная, но не вполне корректная формулировка. Если плющить круг, получится овал. Форму эллипса можно задать, например, при помощи большой полуоси a и эксцентриситета e.

Теперь этот эллипс надо сориентировать вокруг Земли. Ставим его сперва торчком перпендикулярно экватору, чтобы эллипс располагался в плоскости сечения нулевого меридиана и линия апсид (длинная ось, соединяющая перигей с апогеем) совпадала с осью вращения Земли. Повернем плоскость эллипса вокруг линии апсид на угол Omega. Он называется долготой восходящего узла. Точка восходящего узла задает также направление движения по орбите. В ней спутник переходит из полупространства южного полушария Земли в северное. Проложим новую ось как результат пересечения плоскости эллипса с плоскос��ью экватора. Она называется линией узлов. Отпускаем вертикаль. Эллипс начнет свободно покачиваться вокруг линии узлов. Угол i между плоскостью экватора и плоскостью эллипса называется наклонением орбиты - см., напр., рис. Кстати, это неточный рис. Согласно военного устава центр Земли должен находиться в фокусе эллипса, а не в его центре. Будем считать, что на нем изображена круговая орбита. Зафиксируем плоскость эллипса и повернем его в ней вокруг фокуса. Угол w между линией узлов и направлением из фокуса на перигей, - см., напр., рис.4 - называется аргументом перигея.

 

Осталось задать положение спутника как точки на эллипсе и вычислить его от времени. Я помню, что это делается на основе остальных двух законов Кеплера, но как это делается, я не помню. Открываем любой популярный учебник по астрономии, параграф 3.10.2 - "Параметры и аномалии кеплеровской орбиты". Для задания положения точки на эллипсе будем откладывать угол v между перигеем и радиус-вектором, фокуса и упирающимся из фокуса в спутник - см. рис.3.14. Этот угол называется истинной аномалией. И еще осталось задать, где спутник находился в начальный момент времени. Это делается при помощи T0 - времени прохождения перигея. Замечательно. Я предлагаю держать параметры орбиты тоже в табличке, где ж еще? В качестве примера возьмем характеристики первого искусственного спутника Земли, выведенного на орбиту 4 октября 1957 г. Долготы восходящего узла не нашел, поставил по аналогии с последующими запусками, время прохождения перигея - наобум в 0.

 

if object_id('Параметры_орбиты', 'U') is not null drop table Параметры_орбиты

create table Параметры_орбиты (спутник tinyint identity, a float, e float, Omega float, i float, w float, T0 float)

insert Параметры_орбиты (a, e, Omega, i, w, T0) values (6955200, 0.05201, 28 * pi() / 180, 65.1 * pi() / 180, 58 * pi() / 180, 0)

go

if object_id('Параметр_орбиты', 'FN') is not null drop function Параметр_орбиты

go

create function Параметр_орбиты(@id tinyint, @name varchar(5)) returns float as

begin

 return (select value from Параметры_орбиты unpivot (Value for Field in (a, e, Omega, i, w, T0)) unpvt where спутник = @id and field = @name)

end

Рис.4

 

Из третьего закона Кеплера - квадраты периодов обращений спутников соотносятся, как кубы их больших полуосей, получается период обращения спутника по орбите

 

T = 2 * pi * sqrt( a * a * a / Gz)

 

Обратная периоду величина называется средним движением (3.51).

 

n = 2 * pi / T = sqrt (Gz / a / a / a)

 

По смыслу это действительно средняя угловая скорость.

Средняя скорость умножить на время называется средней аномалией:

 

M = n * (t - T0)

 

Из второго закона Кеплера - радиус-вектор из фокуса к спутнику за равные промежутки времени заметает равные площади - после интегрирования и преобразований получается равенство (3.63):

 

E = M + e * sin(E)

 

где Е - эксцентрическая аномалия (см. рис.3.3). Аналитически ее вычислить не удастся, зато по этой формуле она легко вычисляется итеративно с нужной точностью. За нулевое приближение можно принять E0 = M.

Эксцентрическая аномалия связана с истинной через формулу (3.60):

 

tg(v/2) = sqrt ((1 + е) / (1 - е)) * tg (E/2)

 

Таким образом, на каждый момент времени удастся получить v как функцию от t. Длина радиус-вектора от перифокуса до спутника согласно первому закону Кеплера есть уравнение эллипса в полярных координатах - см. (3.59):

 

r = p / (1 + e * cos(v))

 

где p - фокальный параметр = a * (1 - e * e).

 

Связанная с орбитой декартова система координат имеет ось х, направленную от перицентра к перигею, ось y, параллельную малой оси эллипса, и z, ортогональную плоскости орбиты. Все равно по ней ничего не растет: (r * cos(v), r * sin(v), 0) = (a * (cos(E) - e), a *sqrt(1 - e * e) * sin (E), 0) - см. (3.58). Чтобы перейти из орбитальной системы координат в земную, радиус-вектор нужно в обратном порядке отвернуть на углы -w вокруг z, -i вокруг x' и -Omega вокруг Z'' = Z, задающие ориентацию эллипса относительно Земли:

 

cos Omega

-sin Omega

0

 

1

0

0

 

cos w

-sin w

0

sin Omega

cos Omega

0

0

cos i

-sin i

sin w

cos w

0

0

0

1

0

sin i

cos i

0

0

1

то есть умножить резул��тирующую матрицу п��оизведения поворотов (3.68)

 

cos(Omega) * cos(w) - sin(Omega) * sin(w) * cos(i)

-cos(Omega) * sin(w) - sin(Omega) * cos(w) * cos(i)

sin(Omega) * sin(i)

sin(Omega) * cos(w) + cos(Omega) * sin(w) * cos(i)

-sin(Omega) * sin(w) + cos(Omega) * cos(w) * cos(i)

-cos(Omega) * sin(i)

sin(w) * sin(i)

cos(w) * sin(i)

cos(i)

 

на столбец координат радиус-вектора. Получатся трехмерные декартовы координаты в прямоугольной системе отсчета, центр которой совпадает с центром Земли, ось Z направлена на северный полюс, оси X и Y лежат в плоскости экватора. Х направлена на нулевой меридиан, Y ей ортогональна. Смещения прибавлять не нужно, т.к. центры обеих координатных систем совпадают.

Спроецировав точку с координатами (X, Y, Z) на поверхность приближающего Землю в выбранной геодезической системе, в данном случае WGC-84, референсного эллипсоида, мы получим географические координаты точки-следа от спутника на поверхности Земли. Параметры эллипсоида известны (Рис.3). Формулы пересчета между декартовыми координатами и широтой, долготой, высотой можно вывести самому, либо позаимствовать уже готовые, например, на сайте лаборатории ГАИШа - (2.11), из которых сразу получается долгота L = arctg(Y/X) и следом широта B. Нужно только помнить, что из-за вращения Земли долгота восходящего узла с каждым моментом времени уезжает в противоположном направлении. Прецессией, нутацией, мутацией и прочей флуктуацией для простоты пренебрегаем. Получается оч.красивая функция. Используя параметры орбиты по id спутника, она возвращает географическую точку на поверхности Земли (широта/долгота), над которой он в данный момент находится:

 

if object_id('ПроекцияПоложенияНаОрбите', 'FN') is not null drop function ПроекцияПоложенияНаОрбите

go

create function ПроекцияПоложенияНаОрбите(@номер_спутника tinyint, @t float) returns geography as

begin

 --Константы функции

 declare @Gz float = dbo.Константа_WGS84('Gz') --геоцентрическая гравитационная постоянная

 declare @Ra float = dbo.Константа_WGS84('Ra') --большая полуось эллипсоида Земли

 declare @eZ float = dbo.Константа_WGS84('eZ') --эксцентриситет эллипсоида Земли

 declare @a float = dbo.Параметр_орбиты(@номер_спутника, 'a') --большая полуось орбиты

 declare @e float = dbo.Параметр_орбиты(@номер_спутника, 'e') --эксцентриситет орбиты

 declare @Omega float = dbo.Параметр_орбиты(@номер_спутника, 'Omega') --долгота восходящего узла

 set @Omega -= dbo.Константа_WGS84('Wz') * @t --Земля вращается

 declare @i float = dbo.Параметр_орбиты(@номер_спутника, 'i') --наклонение

 declare @w float = dbo.Параметр_орбиты(@номер_спутника, 'w') --аргумент перигея

 --Находим истинную аномалию @v

 declare @n float = sqrt(@Gz / @a / @a / @a) --среднее движение

 declare @M float = @n * (@t - dbo.Параметр_орбиты(@номер_спутника, 'T0')) --средняя аномалия

 declare @Ea float, @Ea0 float = @M --эксцентрическая аномалия рассчитывается итеративно

 declare @eps float = 1e-8

 while 1 = 1 begin

  set @Ea = @M + @e * sin(@Ea0)

  if abs(@Ea - @Ea0) < @eps break

  set @Ea0 = @Ea

 end

 --Полярные координаты в СК орбиты (ось - линия апсид)

 --declare @v float = 2 * atan(sqrt((1 + @e) / (1 - @e)) * tan(@Ea / 2))

 --declare @r float = @a * (1 - @e * @e) / (1 + @e * cos(@v))

 declare @rcosv float = @a * (cos(@Ea) - @e)

 declare @rsinv float = @a * sqrt(1 - @e * @e) * sin(@Ea)

 --Преобразуем их в декартову геоцентрическую СК.

 --Поскольку по 3-й координате радиус-вектор имеет 0, 3-й столбец матрицы преобразования не понадобится.

 declare @a11 float = cos(@Omega) * cos(@w) - sin(@Omega) * cos(@i) * sin(@w)

 declare @a12 float = -cos(@Omega) * sin(@w) - sin(@Omega) * cos(@i) * cos(@w)

 declare @a21 float = sin(@Omega) * cos(@w) + cos(@Omega) * cos(@i) * sin(@w)

 declare @a22 float = -sin(@Omega) * sin(@w) + cos(@Omega) * cos(@i) * cos(@w)

 declare @a31 float = sin(@i) * sin(@w)

 declare @a32 float = sin(@i) * cos(@w)

 --В такие моменты особенно остро ощущаешь отсутствие в Т-SQL массивов.

 declare @X float = @a11 * @rcosv + @a12 * @rsinv

 declare @Y float = @a21 * @rcosv + @a22 * @rsinv

 declare @Z float = @a31 * @rcosv + @a32 * @rsinv

  --Переводим декартовы координаты в геодезические

 declare @B float /*широта*/, @L float /*долгота*/

 if @X = 0 and @Y = 0 --точка находится на полюсе, долгота может быть любая

  select @B = 0, @L = sign(@Z) * pi() / 2

 else begin

  set @L = atn2(@Y, @X) --долгота

  declare @B0 float = 0 --широту считаем итеративно аналогично эксцентрической аномалии

  declare @ro float --радиус кривизны эллипсоида в первом вертикале

  while 1 = 1 begin

   set @ro = @Ra / sqrt(1 - @eZ * @eZ * sin(@B0) * sin(@B0))

   set @B = atn2( (@Z + @ro * @eZ * @eZ * sin(@B0)), sqrt(@X * @X + @Y * @Y) )

   if abs(@B - @B0) < @eps break

   set @B0 = @B

  end

 end

 return geography::Point(@B * 180 / pi(), @L * 180 / pi(), 4326)

end

Рис.5

 

Нижеприводимый скрипт отмечает N промежуточных точек с равными интервалами в течение периода обращения. Для видимости они обозначены кругами радиусом в 100 км. Точки соединены отрезками в линию при помощи метода, который мы использовали в посте Превращение последовательности точек в геометрическую фигуру\Скрипт 8. Это позволяет нарисовать траекторию витка на поверхности Земли. Можно видеть, что из-за того, что вращение спутника происходит в направлении вращения Земли, ему не удается за виток описать полный круг на ее поверхности. Она от него как бы убегает.

 

declare @Period float = 2 * pi() * sqrt( power(dbo.Параметр_орбиты(1, 'a'), 3) / dbo.Константа_WGS84('Gz') )

declare @i int = 0, @N int = 8, @t0 float = 0, @t1 float = @Period

declare @g geography = geography::STGeomFromText('GEOMETRYCOLLECTION EMPTY', 4326), @b varbinary(max) = cast('' as varbinary), @p geography

while @i <= @N begin

 set @p = dbo.ПроекцияПоложенияНаОрбите(1, @t0 + (@t1 - @t0) * @i / @N)

 set @g = @g.STUnion(@p.STBuffer(100000) )

 set @b += substring(@p.STAsBinary(), 6, 16)

 set @i += 1

end

select @g union all select geography::STGeomFromWKB(0x01 + 0x02000000 + cast(reverse(cast(@N + 1 as binary(4))) as binary(4)) + @b, 4326)

 

image

Рис.6

 

Можно для интереса сделать @t1 = 2 * @Period и отрисовать траекторию второго витка:

 

image

Рис.7

 

Далее предполагается подложить на координатную сетку политическую карту мира, собрать орбитальную группировку типа GPS или ГЛОНАСС, покрутить ее во времени и посмотреть, насколько плотно она кого покрывает.

 

Продолжение следует.

 

Алексей Шуленин