Занимаюсь тут для саморазвития глобальным позиционированием. И чем глубже туда залезаешь, тем интереснее становится. Как у капусты, слой за слоем снимаешь - и в каждом слое вкусное. Вот, скажем, что мы все знаем про GPS? Ну, то, что включаешь навигатор, или, там, смартфон - и он тебе показывает, где ты находишься. Потом начинаешь изучать, как это работает. Летают вокруг Земли спутники, посылают какие-то сообщения. Приемник получает их, сравнивает как-то друг с другом и вычисляет. Потом начинаешь изучать, что это за сигналы. И выясняется, что в теории-то все довольно просто: - засекаешь время получения начала сообщения по своим неточным часам, - знаешь, когда это сообщение начало передаваться спутником по его точным часам, - знаешь, где вокруг Земли находился спутник в это точное время по получаемым от него же же эфемеридам, - делаешь это для нескольких спутников - знаешь, что сигналы идут от спутников со скоростью света в пустоте, измеренной довольно точно; то есть, двадцать тысяч километров расстояния до спутника его сигнал пройдет примерно за 67 миллисекунд - вычисляешь, например, по методу наименьших квадратов, свои координаты на Земле и сдвиг твоих часов от точного времени, такие, чтобы в этой точке пространства-времени ты получал эти сообщения от этих спутников в эти времена по твоим часам. - ПРОФИТ!
А на практике оказывается, что: - сигнал, на самом деле, идет не со скоростью света в пустоте, потому что между тобой и спутником нифига не пустота, а атмосфера; - эфемериды не очень точные, спутники чуток гуляют по орбитам; - у спутников часы тоже уходят, у каждого по-своему; - сигнал может отражаться от окружающих зданий и деревьев, то есть, приходить не по кратчайшему пути от спутника; - да и сообщения идут на невысоком битрейте (около мегабита в секунду), что даже если время получения начала сообщения измерено с точностью 1 сотая бита, то расстояние можно определить с точностью три метра - ну и конфигурация созвездия спутников, которое сейчас видно, влияет на точность. Если все видимые спутники близко друг к другу на небе, то расстояние до них будет одинаковым в довольно большом объеме, и где именно ты находишься в этом объеме, сказать сложно. Но это имеет характеристики шума и может быть осреднено.
Отдельно остановимся на атмосфере. Там, на высоте 30 километров газ сильно ионизирован, и скорость света в этом слое отличается от таковой в пустоте. Не сильно отличается, но достаточно, чтобы задержать сигнал на несколько наносекунд. Наносекунд, Карл! А потом умножаешь эти наносекунды на триста миллионов метров в секунду и получаешь несколько метров погрешности определения расстояния до спутника. А самое подлое, что от разных спутников задержка разная: во-первых, если спутник низко над горизонтом, то сигнал от него идет через ионосферу дольше, чем если он высоко над горизонтом; а во-вторых, ионизация ионосферы вызвана взаимодействием солнечного ветра с магнитным полем Земли. Земля вертится и ионосферные задержки зависят от местного времени. А солнечная активность разная в разные дни, поэтому нельзя точно предсказать, какие задержки будут завтра в то же время.
Однако, чукча хитрый. Задержка линейно зависит от частоты сигнала, поэтому передавая сигнал на двух частотах L1 и L2 и сравнивая времена прохождения между собой, задержку можно вычислить и учесть. Разработчики GPS предусмотрели это и спутники посылают сигналы на двух частотах. Если есть несколько тысяч лишних долларов, купи себе двухчастотный приемник, и наслаждайся коррекцией ионосферных задержек.
Что же делать нищебродам вроде меня, у которых только приемники L1? Просить помощи у налогоплательщиков, разумеется. Налогоплательщики у нас отзывчивые и профинансировали систему WAAS - Wide-Area Augmentation System. Вообще-то, они ее не для меня профинансировали, а для гражданской авиации - чтобы самолеты на глиссады выводить без курсо-глиссадных систем в аэропортах. А то на тысячи аэропортов не напасешься. Но раз уж сделано за счет налогоплательщиков, то пусть они и пользуются все.
Что это такое - WAAS? А вот что: есть в Северной Америке станции, координаты которых известны точно (об этой точности мы еще поговорим). На них стоят двухчастотнные приемники и точные часы. Занимаются они тем, что измеряют времена прохождения сигналов с тех спутников, которые видят. Сравнивают с тем, что должно быть согласно эфемеридам. Вычисляют расхождения. По расхождениям вычисляют: а) уточненные эфемериды, б) уходы часов каждого спутника, в) ионосферные задержки вокруг своего места. Потом ионосферные задержки интерполируются в текущую карту ионизации над всей территорией континента, вся эта беда собирается в коррекционное сообщение и отправляется на специально арендованный у Инмарсата спутник на геосинхронной орбите (на самом деле там три спутника арендовано) и им уже ретранслируется на той же частоте L1, на которой вещают спутники GPS. А те приемники, программа которых дополнена приемом сигналов WAAS, получают эти корректирующие сообщения и используют их в вычислениях расстояний до спутников. Итоговая точность - около одного метра.
А смартфоны и их сотовые операторы делают еще хитрее. Все эфемериды и вот эти вот сообщения WAAS идут на очень низком битрейте - 50 бит в секунду. Пока все их получишь, могут минуты пройти. Но ведь у нас есть сотовые вышки и довольно могучие сотовые каналы передачи данных. А сотовые вышки могут иметь GPS-приемники и тоже принимать все эти ваши эфемериды и сообщения WAAS! Так почему бы не запоминать их и не рассылать своим смартфонам, когда они попросят? От вышки-то их все за пару миллисекунд можно запулить по мегабитному каналу 3G или 4G. А WAAS-сигналы валидны в течение 6 минут, так что вышка может не спешить с обновлением.
А теперь высший пилотаж сотовых операторов. Сигналы WAAS - это очень хорошо. Но еще лучше, если у нас есть наземная базовая станция с известными координатами где-то рядом, которая измеряет ионосферные эффекты вот тут, в нашем небе, потому что интерполяция WAAS дает сетку ионосферных задержек с разрешением всего 100 километров и в середине клетки может врать на полметра. Есть ли у нас такая станция? Есть! Это сама сотовая вышка. Если поставить на ней двухчастотный приемник, и измерить ее координаты, то она никуда не денется, ее координаты всегда будут такими, и она может делать то же самое, что и станции WAAS, только передавать не на спутник, а своим подписчикам рядышком. Необходимо это только для атмосферных эффектов, потому что коррекции эфемерид и часов спутников WAAS вычисляет очень хорошо и они от координат приемника не зависят. Ну, то есть, вышка берет с WAAS коррекцию эфемерид и часов для всех спутников, вычисляет со своего приемника атмосферную коррекцию для тех спутников, которые сейчас над горизонтом, и формирует из этого корректирующий пакет для своих подписчиков в округе, которые у нее таковой спросят. Подписчики получат точность плюс-минус полметра.
Это, значит, был второй слой, под названием Differential GPS. А теперь будет третий.
Некоторым особо требовательным ребятам нужен сантиметр. Землемеры, например, проводя межевание, измеряют координаты участков именно с такой точностью. А даже осреднение дальностей спутников, измеряемых по приходу сигналов, такой точности не даст. Что делать?
Вот что. Частота L1 - полтора гигагерца. То есть, длина волны несущей - двадцать сантиметров. Если измерить фазу несущей, то есть, то, в какой точке волны несущей мы получили сигнал, с точностью в один процент, то расстояние можно получить с разрешением в два миллиметра. Сравнивая фазы несущих с разных спутников, можно получать свою координату с миллиметровой точностью.
Но есть одна проблема. Дробную часть длины волны мы можем измерить с точностью один процент, а сколько еще между нами и спутником ЦЕЛЫХ волн, мы не знаем никак. Мы можем только угадать. Или не угадать. И вот тут начинаются ухищрения.
Во-первых, мы не знаем, сколько этих целых волн было между нами и спутником, когда мы вервые поймали сигнал. Но дальше, если мы сигнал не теряем, мы можем заметить, когда проскочили в следующую волну, и (неизвестное) количество волн увеличить на единицу. Пока не потеряем спутник, можем точно сказать, насколько это количество волн увеличилось.
Во-вторых, мы вообще-то примерно знаем расстояние до спутника со всеми нашими WAAS'ами. То есть, с точностью до метра мы расстояние до спутника уже знаем. Нам надо понять только, сколько там этих волн в неизвестной добавке к метру - одна, две, три, четыре, или пять.
Кроме того, мы знаем, куда и как спутник летит. Изменение дробной части с движением спутника зависит от того, сколько было целых волн в начальный момент. Подождав некоторое время, если мы не теряли несущую, можно выбрать наиболее вероятное число целых волн в начальный момент, и вместе с ним, во все следующие.
Это один вариант третьего слоя под названием Precise Point Positioning. Там, на самом деле, нужно учитывать много интересных эффектов, типа вращения Земли за время прохождения сигнала и искривления пространства-времени в поле тяготения Земли.
Есть второй вариант. Он работает, если у нас есть рядом (несколько километров) базовая станция и мы знаем ее точные координаты и можем получить с нее каким-то образом ее измерения расстояний до спутников и фаз несущих прямо сейчас. Мы сравниваем то, что видит она, с тем, что видим мы, и по разницам и их изменению во времени сможем оптимизированным перебором подобрать комбинацию неизвестных целых количеств волн несущей для каждого из спутников. Это называется Real-Time Kinematic (RTK) и это - то, чем пользуются землемеры. Оно работает настолько точно, насколько определены координаты базовой станции. У землемеров есть такие базовые станции. Более того, есть сети базовых станций и серверы, которые содержатся дорожными службами почти каждого штата. На них можно бесплатно подписаться и получать измерения в реальном времени по стандартному протоколу. Есть и опенсорсный софт RTKLib, использующий это. Он написан и прекрасно документирован японцем Томодзи Такасу, которому надо сказать огромное спасибо от всего GPS-сообщества.
Тут возникает четвертый слой: про точность координат базовых станций, и вообще, про широту, долготу, и высоту. Дойдя досюда, начинаешь понимать, насколько вообще все эфемерно и насколько вопрос "где я на Земле" не имеет смысла, когда меряем в попугаях сантиметрах.
Во-первых, система координат. Спутники GPS летают довольно стабильно и их координаты определены довольно точно в так называемой системе ECEF (Earth-Centered, Earth-Fixed). Это искусственная система координат с началом в центре и вращающаяся вместе с Землей. Ее ось X торчит из Гвинейского залива, где пересекаются экватор и нулевой меридиан, ось Y торчит из Индийского океана к западу от Суматры, где пересекаются экватор и 90-й меридиан, а ось Z торчит из Северного полюса. Вообще-то, и координаты приемников изначально вычисляются именно в этой системе, только они на поверхности Земли никому нафиг не нужны. Мы-то тут ползаем да иногда подпрыгиваем и привыкли, что ось Z направлена вдоль вектора силы тяжести, ось Y - вдоль меридиана, и ось X - вдоль параллели. А которые игрушки пишут, так те вообще уверяют, что ось X вправо, ось Y вверх, а ось Z протыкает экран, ну да аллах с ними. Короче, эти ваши ECEF-координаты для пользователей конвертят в широту, долготу и высоту. И все бы ничего, но возникают вопросы.
Откуда будем лить воду мерить высоту? От уровня моря? А где это? На каком расстоянии от центра Земли, вот от этого нашего начала координат ECEF? Ну ладно, придумаем некий стандартный эллипсоид, который где-то рядом. Назовем его WGS84 и договоримся считать высоту от него. Тогда, например, в наших палестинах уровень Атлантики - минус 34 метра от этого эллипсоида. То есть, в Вирджиния-Бич этот эллипсоид где-то в воздухе висит. Неудобно местным. Ладно, придумаем еще геоид, как эквипотенциальную поверхность гравитационного поля Земли. То есть, если срезать все горы и устроить всемирный потоп, то вода бы плескалась как раз здесь. Ну или если бы вся вода гладенько замерзла, то шарик бы по этой поверхности никуда не катился. Тогда геодезическая высота от уровня моря будет как раз совпадать с высотой от этого геоида. Это слегка бугристо-ямистое тело назовем EGM96.
А теперь вспомним, что есть приливы и отливы: Солнце и Луна растягивают Землю своим тяготением так, что вода в океане вспучивается там, где эти силы максимальны и там, где они минимальны. Земля вертится и эти два горба как бы гуляют по ней, два раза в сутки проходя по каждому меридиану. И ладно бы только в океане. Оказывается, континенты тоже поднимаются и опускаются на несколько сантиметров! То есть, поставили это мы базовую станцию, думаем, что определили ее координаты, а она, скотина, гуляет по высоте на несколько сантиметров каждые сутки!
А теперь широта и долгота. Определили мы их с сантиметровой точностью. Потом померили через год. Опа! А они на пару сантиметров изменились. Что это было? [спойлер]Америка уплыла. Как раз на пару сантиметров за год.
А потом, есть еще меридиан, как направление на полюс, и параллель как расстояние до него. А что такое полюс? Ну, вроде, место, где трутся спиной медведи (или пингвины) о земную ось. А она тоже колеблется на несколько угловых секунд по широте и долготе с периодом в 18 лет, то есть, медведям и пингвинам надо гулять на сотню метров туда-сюда, чтобы спинку потереть.
И вот тут начинаешь понимать выражение "танцевать от печки". Нафиг нам не нужны абсолютные координаты в системе ECEF. Нам нужно знать, как домой добраться. Или как далеко мы от вон того угла соседнего дома. Поэтому если есть базовая станция и мы договорились, что ее координаты такие, то и будем танцевать от нее, от печки нашей. И дом от нее определим, и себя, потому что все мы дрейфуем хором, вместе с ней. Тогда, действительно, можно определяться с сантиметровой точностью, если у нас есть спутники и база, которая рассказывает нам, что она видит. И такой приемник уже можно, например, поставить в автомобиль или в самолетик и управлять им по GPS довольно точно. Правда, с высокой частотой точное GPS-решение получать не удастся, но там еще много всяких инерциальных и оптических методов есть. Но об этом как-нибудь в другой раз.