Тангаж, рысканье в норме. Выводим на орбиту ИСЗ.
Мои поздравления по случаю состоявшейся вчера 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, использовать в данном посте отечественную разработку не удастся :(
Рис.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)
Рис.6
Можно для интереса сделать @t1 = 2 * @Period и отрисовать траекторию второго витка:
Рис.7
Далее предполагается подложить на координатную сетку политическую карту мира, собрать орбитальную группировку типа GPS или ГЛОНАСС, покрутить ее во времени и посмотреть, насколько плотно она кого покрывает.
Продолжение следует.
Алексей Шуленин