5 шагов навстречу GPSСтепан «Step» Ильин Хакер, номер #103, стр. 034 (step@gameland.ru) Система глобального позиционирования — это просто! Слово GPS у многих людей вызывает смешанные чувства. Они начинают открещиваться, заявляя: «Не, с этим зверем я дело не имел» - и считая эту технологию чем-то нереальным и уж точно дорогим в использовании. На самом деле приемники GPS, подключаемые к компьютеру, стоят сейчас чуть больше тысячи рублей, а в основе технологии лежат предельно простые принципы. И если разобраться, что к чему, приложив определенные усилия, вполне возможно сварганить свою собственную навигационную систему! А почему бы, собственно, и нет? Для начала мы познакомимся с основными принципами, заложенными в глобальную систему позиционирования, выяснив, каким именно образом GPS-приемник определяет свои координаты. Дальше подключим его к компьютеру и попробуем с помощью него получить информацию о своем местонахождении. Для этого, правда, придется разобраться в специальном формате данных, но зато потом можно будет сразу отобразить полученные координаты на спутниковой карте мира Google Maps. По-моему, очень неплохая идея. Поехали! Шаг №1. Принцип определение координат на пальцах В основе глобальной системы позиционирования (Global Position System, GPS) лежит около 30 спутников, которые расположены примерно в 20 350 км от нашей планеты и перемещаются по шести орбитам, наклоненным к экватору под углом в 55 градусов. Угол между самими орбитами равен 60 градусам, а период обращения составляет около 12 часов. Подобная траектория выбрана специально для того, чтобы в любой момент времени сигнал хотя бы от нескольких спутников беспрепятственно достигал любой точки Земли. Получая сигнал от спутников, GPS-приемник определяет свое местоположение, используя специальный математический прием, который называется «трилатерация». Проще говоря, это метод вычисления координат объекта по измерению его удаленности от нескольких точек с уже заданными координатами. Допустим, в нашем распоряжении имеется расстояние до одного спутника, назовем это расстояние А. Можем ли мы в этом случае говорить о точном месте нахождения удаленного от него на это расстояние объекта? Разумеется, нет. Сам посуди, ведь он может располагаться в любой точке сферы с радиусом А, описанной вокруг этого спутника. Диапазон поиска значительно сузится, если знать расстояние от объекта до другого спутника - В. В этом случае результатом пересечения двух сфер будет одна-единственная замкнутая линия – окружность. К окончательной же ясности приводит измерение расстояния до третьего спутника, которое сводит варианты возможного местоположения объекта к всего двум точкам. Причем одна из них нам заведомо не подходит, поскольку находится либо глубоко внутри земли, либо очень высоко над ее поверхностью. Любой GPS-приемник такую ерунду отсекает, оставляя таким образом единственный верный вариант. Посмотри на иллюстрацию - и все сразу станет ясно. Справедливости ради стоит отметить, что в реальных условиях, когда определить точное расстояние до спутника невозможно, трех спутников для нахождения координат недостаточно. Нужен по меньшей мере еще один, а лучше - два и более. Правило простое: чем больше спутников находится в «поле зрения» приемника, тем точнее он вычислит координаты, применяя различные приемы для корректировки результата. Каким образом определяется расстояние от GPS-приемника до каждого спутника? Разумный вопрос. Ответить на него очень просто, если вспомнить известное со школьной скамьи равенство: расстояние есть скорость, помноженная на время. Если зафиксировать момент, когда спутник начал отсылать радиосигнал, и включить таймер, то можно вычислить время. А если, плюс к этому, вспомнить, что радиоволны распространяются по определенному закону, то мы легко получаем интересующее нас расстояние. Главная трудность заключается в определении точного времени отсылки сигнала со спутника. Чтобы решить эту проблему, пришлось синхронизировать работу спутников и приемников так, чтобы они генерировали код по одному и тому же закону в одно и то же время. Так, каждым из GPS-спутников постоянно испускаются радиоволны двух частот: L1 - 1575,42 МГц и L2 - 1227,60 МГц. На этих частотах передается специальный навигационный сигнал, представляющий собой уникальный псевдослучайный код, PRN (Pseudo Random Number code). Так как этот уникальный код генерируется одновременно и передатчиком, и спутником, по времени задержки между сгенерированным и идентичным полученным кодами можно вычислить время распространения сигнала. А значит, и расстояние до спутника. Помимо всего прочего, приемникам постоянно передается различная служебная информация, в том числе дифференциальные поправки. Сами поправки вносятся вспомогательными наземными центрами, а спутники являются лишь ретрансляторами служебной информация. Шаг №2. Протокол взаимодействия устройств На прилавках магазинов лежат приемники десятков брендов, а на запрос «gps software» поисковик тебе выдаст по меньшей мере с десяток известных навигационных систем как для обычной винды, так и для портируемых платформ. Но, несмотря на большое разнообразие железа и софта, в большинстве своем они совместимы друг с другом, и, покупая приемник, можно не заморачиваться по поводу того, что он, возможно, не заработает с выбранной тобой навигационной системой, например, TomTom navigator. Тут дело в специальном протоколе NMEA, который используют корабельные приборы для общения между собой. Помимо всего прочего, формат включает в себя систему сообщений для обмена информацией между навигационными GPS-приемниками и потребителями навигационной информации, то есть программными средствами. Все команды и сообщения передаются в текстовом ASCII-виде, относящиеся к GPS-приемникам начинаются с $GP и заканчиваются символами <CR><LF>. Для нас наиболее важны сообщения, начинающиеся со служебного слова $GPGGA, которое обозначает, что после него идет GPS-информация о местоположении, качестве данных, количестве использованных спутников, HDOP (фактор ухудшения точности плановых координат), информация о дифференциальных поправках и их возраст. Разберем подробнее. Шаг №3. Разбираем сообщение, содержащее координаты Самое важное здесь: 1. Гринвичское время на момент определения местоположения. 2. Географическая широта местоположения. 3. Север/юг (N/S). 4. Географическая долгота местоположения. 5. Запад/восток (E/W). 6. Индикатор качества GPS-сигнала. 0 - определение местоположения невозможно или неверно; 1 - GPS-режим обычной точности, возможно определение местоположения; 2 - дифференциальный GPS-режим, точность обычная, возможно определение местоположения; 3 - GPS-режим прецизионной точности, возможно определение местоположения. 7. Количество используемых спутников (00-12, может отличаться от числа видимых). 9. Высота антенны приемника над уровнем/ниже уровня моря. 10. Единица измерения высоты расположения антенны, метры. 15. Контрольная сумма строки. Пропущенные параметры носят узкоспециализированный характер, а среди перечисленного интерес представляют параметры 2-5, то есть не что иное, как текущие координаты. Пример сообщения:
$GPGGA,004241.47,5532.8492,N,03729.0987,E,1,04,2.0,-0015,M,,,,*31 Шаг №4. Пишем свою собственную навигационную систему Попробуем применить полученные знания о протоколе на практике. Для экспериментов нам подойдет практически любой GPS-адаптер, с тем лишь условием, что он будет поддерживать формат NMEA (а он будет поддерживать!). Способ подключения к компьютеру (будь то USB, Bluetooth или вообще PCMCIA) никакого значения не имеет, поскольку в любом случае в систему будет установлен драйвер виртуального COM-порта. Вот как раз через него мы и будем получать информацию от приемника. Причем для этого нам потребуется знать лишь элементарные функции для чтения информация с обычного последовательного порта. Как тебе нравится идея сделать навигационную систему, которая будет отображать текущее расположение на картах Google Maps? Здорово? А знал бы ты, насколько это просто… Это доказал гражданин Bjoern Hartmann, который написал специальный скрипт на языке Python 2.6. Повторим фокус, предварительно подключив к интерпретатору библиотеку для работы с COM-портом - pySerial (http://pyserial.sourceforge.net) и работы под Windows - pywin32 (http://sourceforge.net/projects/pywin32). Полную версию сценария ты найдешь на диске (там всего-то 40 строк), но основные моменты мы разберем подробно. Итак, для начала нам надо установить соединение с NMEA-совместимым девайсом через COM-порт. Пусть это будет COM2, а скорость передачи данных - 4800 бод/с: ser = serial.Serial(port='COM2',baudrate=4800,bytesize=8, parity='N', stopbits=1,timeout=3) Далее начинаем читать из серийного порта все подряд, пока не получим сообщение, содержащие координаты, иными словами, пока не дождемся сообщения со служебным словом $GPGGA. line = "" while not(line.startswith("$GPGGA")): line= ser.readline() ser.close() Выделяем из сообщения отдельные его элементы (токены), благо они четко отделены запятыми: tokens = line.split(",") Любой GPS-приемник возвращает координаты (среди полученных токенов #[2] — долгота, #[4] — широта) в формате: градусы, минуты, направление (юг или запад). Но для использования Google Maps нам потребуются координаты в формате с десятыми долями градуса, поэтому напишем небольшую функцию-конвертер: def dmmm2dec(degrees,sw): deg= math.floor(degrees/100.0) #десятые доли градуса frac= ((degrees/100.0)-deg)/0.6 # десятичная дробь ret = deg+frac #возращение положительного результата if ((sw=="S") or (sw=="W")): ret=ret*(-1) #если указан параметр «Юг» или «Восток», то переворачиваем знак return ret Собственно, теперь можно подсчитать наши координаты в нужном формате: lat = dmmm2dec(float(tokens[2]),tokens[3]) # [2] — это долгота, [3] – направление {N|S|W|E} lng = dmmm2dec(float(tokens[4]),tokens[5]) # [4] — широта, [5] — направление {N|S|W|E} Все, теперь координаты в нужном формате содержатся в переменных lat и lng. Остается только составить URL для доступа к Google Maps с учетом этих координат и скормить полученный адрес браузеру (указав его в качестве параметра запуска), что, собственно, мы и делаем: query = "sandwiches" url = r'"http://maps.google.com/maps?f=l&hl=en&q='+query+'&near='+str(lat)+','+str(lng)+'&ie=UTF8&z=12&om=1"'; run("firefox",url) Вот так буквально за считанные минуты можно отобразить свое текущее местоположение на спутниковых фотографиях или картах Земли. Кстати говоря, для отладки скрипта даже не обязательно использовать GPS-приемник (который в квартире все равно ни на что не способен), эмулируй его присутствие с помощью программы NMEA GPS device simulator (http://avangardo.com/gps/gpsgen). Сразу после установки в системе можно активировать виртуальный последовательный порт, с которого и будут поступать результаты. Сама же информация о местоположении и перемещениях задается в удобной графической оболочке на карте мира. Словом, если ты еще не успел обзавестись своим GPS-приемником, но собираешься сделать это в ближайшее время, то для тебя это идеальный вариант! Шаг №5 Отображение своих координат на картах Google в реальном времени Просто определять свое месторасположение — хорошо. Но намного приятнее было бы в любой момент отслеживать свои перемещения, скорость движения — и все это с фотографиями Google Maps. Подобную возможность предоставляет программа geepeeyes (http://geepeeyes.sourceforge.net), работающая в связке с Google Earth Desktop. Во всей этой схеме есть одна загвоздка: для подкачки карт требуется доступ в сеть. А что делать, если под рукой есть только GPS-модуль? Ведь по GPRS карты особенно не покачаешь? Так вот если тратить кровно заработанные деньги (а еще время и нервы) на мобильный интернет тебе не хочется, то советую провести некоторые офлайновые работы, включающие предварительную загрузку карт из интернета. Для этого нужно лишь посерфить местности, планируемые для посещения. Полученные текстуры программа автоматически занесет в кэш, и в дальнейшем при полном отсутствии инета ты сможешь запустить Google Earth и нагло игнорировать все запросы о подключении к сети. Скэшированные дома данные (находящиеся в C:\Documents and Settings\PCname\ApplicationData\Google\GoogleEarth) будут тут же выводиться на экран. Можно ли заглушить сигнал GPS? Владельцы сногсшибательных суперкаров не скупятся на дорогие спутниковые сигнализации и системы слежения. Но все это по большому счету ерунда, поскольку сигнал GPS легко глушится! Сейчас легко можно купить так называемый GPS Jammer, который сведет с ума все GPS-приемники в определенном радиусе. Злоумышленникам даже необязательно знать, где именно установлен модуль слежения, - глушилка работает на приличном расстоянии. Некоторые факты GPS – это вовсе не первая система глобального функционирования. Первый отечественный навигационный спутник «Космос-192» был выведен на орбиту 27 ноября 1967 года. А в 1979 году была создана навигационная система «Цикада», в составе которой было 4 низкоорбитальных спутника. Первый же GPS-спутник был запущен только в феврале 1978 года. Каждый спутник весит более 900 кг и с раскрытыми солнечными батареями имеет размер около 5 м. Мощность установленного радиопередатчика не более 50 ватт. Передатчики посылают сигналы на двух частотах. Каждый спутник рассчитан на десятилетнюю работу. WWW http://gpsd.berlios.de/NMEA.txt — полное и доходчивое описание формата NMEA 0183; http://mapbuilder.net service — отличный сервис для того, чтобы обозначить нужные места на картах Google Earth; http://enp.berlios.de — парсер сообщений протокола NMEA, который работает как под консолью, так и через web-интерфейс. |