Как написать программу навигатор

Привет. В этой статье хочу поделится инфой о программировании GPS-устройств, работающих под управлением Windows CE. ИМХО проще всего писать софт под винду на C#. Конечно, для работы программы придётся скачать и установить .Net Compact Framework, но это вовсе не проблема. Сразу оговорюсь — IGO в названии статьи — лишь для привлечения большего внимания )).

В рамках этой статьи описываются лишь некоторые основы. Остальное — дело твоей фантазии и твоего желания.

  • MS Visual Studio 2008 (лицензионная, конечно ));
  • мозги;
  • прямые руки;
  • GPS девайс, подключённый к компу (для отладки);
  1. Получать данные о местоположении.
  2. Отображать местоположение на карте.

RMC – pекомендуемый минимум GPS / навигационных данных
$GPRMC, Hhmmss.ss, A, 1111.11, A, yyyyy.yy, a,
x.x, x.x, ddmmyy, x.x, A *hh
1. Время фиксации местоположения UTC
2. Состояние: А = действительный, V = предупреждение навигационного приёмника

Урок 6. Как создать приложение навигатора за 20 минут!


3,4. Географическая широта местоположения, Север/Юг
5,6. Географическая долгота местоположения, Запад/Восток (E/W)
7. Скорость над поверхностью (SOG) в узлах
8. Истинное направление курса в градусах
9. Дата: dd/mm/yy
10. Магнитное склонение в градусах
11. Запад/Восток (E/W)
12. Контрольная сумма строки (обязательно)
Пример сообщения:
$GPRMC,113650.0,A,5548.607,N,03739.387,E,0 00.01,255.6,210403,08.7,E*69

Теперь можно перейти к коду. Запускаем студию, создаём Smart Device Project. Кидаем
на форму listBox. В констукторе формы пишем:

Передаются данные через COM-порт, на моём JJ Connect — через COM1. Мы открыли порт и
подписались на событие-получение данных. Обработчик события выглядит так:

void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
SerialPort port = sender as SerialPort;
if (e.EventType == SerialData.Eof)
string str=port.ReadLine();
Ivoke(new AddLineDel(AddLine),str);
>
>
void AddLine(string str)
listBox1.Items.Add(str);
>
delegate void AddLineDel(string str);

Если событие — конец строки, то читаем строку и добавляем listBox. Т.к. событие вызывается в другом потоке, приходится использовать Ivoke. Собираем, закачиваем на девайс, пробуем. Если не работает — смотрим ошибку, экспериментируем.
Заполнять литбокс — это, конечно, хорошо, ном нужно знать наше местоположение. Для этого пишем парсер.
Объявим структуры, в которых будем хранить распарсенные данные:
public struct GPGGAData
//широта
public double lat;
//долгота
public double lon;
//время
public DateTime time;
//качество сигнала
public int signalQuality;
//кол-во спутников
public int satellitesCount;
//Фактор Ухудшения Точности Плановых Координат
public double hdop;
// Высота антенны приёмника над/ниже уровня моря.

Создание карточки программы в «Навигаторе»


public int hgeo;
// Единица измерения высоты расположения антенны, метры.
public string hgeoUnit;
//Геоидальное различие
public double hmet;
//Единица измерения различия
public string hmetUnit;
//Возраст Дифференциальных данных GPS
public double sc104;
//Индификатор станции,
public string id;

Читайте также:
Определите объем памяти в байтах отводимый этой программой для записи 40 паролей

Класс парсера выглядит примерно так:

public class GPSStringParser
//последние данные
private GPGGAData GPGGAdata;
private GPRMCData GPRMCdata;

//широта
public double lat
get
return (GPGGAdata.time > GPRMCdata.time) ? GPGGAdata.lat : GPRMCdata.lat;
>
>
//долгота
public double lon
get
return (GPGGAdata.time > GPRMCdata.time) ? GPGGAdata.lon : GPRMCdata.lon;
>
>
//время
public DateTime dateTime
get

DateTime time = (GPGGAdata.time > GPRMCdata.time) ? GPGGAdata.time : GPRMCdata.time;
return new DateTime(GPRMCdata.date.Year, GPRMCdata.date.Month, GPRMCdata.date.Day,
time.Hour, time.Minute, time.Second, time.Millisecond);
>
>

//качество сгнала
public int signalQuality
get
return GPGGAdata.signalQuality;
>
>

//кол-во спутников
public int satellitesCount
get
return GPGGAdata.satellitesCount;
>

//конструкторы
public GPSStringParser()

//порсим согласно описанию, приведённому выше
switch (data[0])
case «$GPGGA»:
GPGGAdata.time = new DateTime(
DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day,
Convert.ToInt32(data[1].Substring(0, 2)),
Convert.ToInt32(data[1].Substring(2, 2)),
Convert.ToInt32(data[1].Substring(4, 2)),
Convert.ToInt32(data[1].Substring(7, 2)) * 10);

GPGGAdata.lat = Convert.ToInt32(data[2].Substring(0, 2)) +
Convert.ToDouble(data[2].Substring(2)) / 60;
if (data[3] == «S»)
GPGGAdata.lat = -GPGGAdata.lat;
GPGGAdata.lon = Convert.ToInt32(data[4].Substring(0, 3)) +
Convert.ToDouble(data[4].Substring(3)) / 60;
if (data[5] == «W»)
GPGGAdata.lon = -GPGGAdata.lon;

GPGGAdata.signalQuality = Convert.ToInt32(data[6]);
GPGGAdata.satellitesCount = Convert.ToInt32(data[7]);
GPGGAdata.hdop = Convert.ToDouble(data[8]);
GPGGAdata.hgeo = Convert.ToInt32(data[9]);
GPGGAdata.hgeoUnit = data[10];
GPGGAdata.hmet = Convert.ToDouble(data[11]);
GPGGAdata.hmetUnit = data[12];
GPGGAdata.sc104 = Convert.ToDouble(data[13]);
GPGGAdata.id = data[14].Split(‘*’)[0];

GPRMCdata.time = new DateTime(
1, 1, 1,
Convert.ToInt32(data[1].Substring(0, 2)),
Convert.ToInt32(data[1].Substring(2, 2)),
Convert.ToInt32(data[1].Substring(4, 2)),
Convert.ToInt32(data[1].Substring(7, 1)) * 100);
GPRMCdata.state = data[2];

GPRMCdata.lat = Convert.ToInt32(data[3].Substring(0, 2)) +
Convert.ToDouble(data[3].Substring(2)) / 60;

if (data[4] == «S»)
GPRMCdata.lat = -GPRMCdata.lat;

GPRMCdata.lon = Convert.ToInt32(data[5].Substring(0, 3)) +
Convert.ToDouble(data[5].Substring(3)) / 60;
if (data[6] == «W»)
GPRMCdata.lon = -GPRMCdata.lon;

GPRMCdata.date = new DateTime(
Convert.ToInt32(data[9].Substring(4, 2)),
Convert.ToInt32(data[9].Substring(2, 2)),
Convert.ToInt32(data[9].Substring(0, 2)));

Добававляем в класс формы поле
GPSStringParser parser = new GPSStringParser();

Добавляем на форму 2 текстБокса: latTextBox и lonTextBox; модифицируем AddLine:
void AddLine(string str)
listBox1.Items.Add(str);
latTextBox.Text=parser.lat.ToString();
lonTextBox.Text=parser.lon.ToString();
>

Проверяем, экспериментируем.
Ну что же, теперь нашу программу нужно научить не только показывать текущие координаты, но и отображать на карте. В одной из следующих статей я планирую рассказать, как работать с картами Гугла, что вполне может быть применимо и здесь. Так что не переключайся 😉

Источник: il-agent.livejournal.com

RTKLib + Python + Google Maps JS API. Делаем свой навигатор

Год назад я закончил свое славное обучение в университете на факультете геоинженерии и кадастра. Я, как и, наверняка, многие студенты, стремился написать диплом с пользой для себя, чтобы не было жалко потраченного времени и сил, поэтому и тему дипломного проекта выбирал поинтереснее. В поисках интересного материала я наткнулся на эту статью и загорелся желанием попробовать что-то похожее.

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

Понятное дело, что применять одночастотники в земельном кадастре, да и в геодезии — дело неразумное: помехи, точность, продолжительность приема сигнала. Но мне было важно посмотреть и разобраться, как работает приемник, как обрабатываются данные, как можно визуализировать результат. Мне было интересно.

Читайте также:
Какая программа лучше для монтирования образов

Диплом я защитил, но интерес к теме не угас. Я продолжил работать в этом направлении и поставил перед собой задачу: наладить систему позиционирования в реальном времени с передачей данных через Интернет. В этой статье я хочу рассказать, что у меня получилось.

image

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

  • Raspberry pi — 2 штуки;
  • NVS NV08C-CSM — 2 штуки;
  • Антенна NV2410 — 2 штуки;
  • Powerbank на 3000 мАч и дисплей (для передвижной станции).

image

Внешний вид ровера. За неимением второго USB преобразователя подключил приемник через Arduino

Далее по моей задумке: должен быть сервер, который будет принимать и сохранять данные с базовой станции, затем по требованию выдавать их роверам, а роверы уже самостоятельно рассчитывают свое положение и отправляют координаты на сервер или еще куда-нибудь.

Сказано — сделано. Сначала я написал python-скрипты, которые настраивают приемники для работы и записывают данные в файл/отправляют данные на сервер. Потом наступила очередь сервера: зарегистрировался на OpenShift и запустил сервис с использованием Tornado и MongoDB, для отладки подключил RockMongo, написал нужные handler-ы.

С ровером оказалось немного сложнее. Проблем с компиляцией RTKLib под Raspbian не возникло: программы для *nix в консольном варианте, все замечательно собирается одним sh makeall.sh. Нам нужен rtkrcv — это линуксовый аналог rtknavi, используемый для реализации RTK.

Я обрадовался, когда обнаружил, что rtkrcv уже поддерживает http в качестве входного потока. Но потом понял, что мне это не подходит. Значит использовать один rtkrcv не получится. Тогда я написал передатчик между сервером и rtkrcv, который отправляет запросы, принимает данные и по сокету отправляет их в rtkrcv.

Если интересно более подробное описание, то весь написанный код, файлы конфигурации, *.pos и сырые данные для тестирования есть в открытом доступе на github.

Написал, проверил, попробовал. Пришло время первого теста: поставил антенну на крышу машины, на пассажирском сидении лежит приемник, телефон в режиме точки доступа. Антенна базовой станции установлена на крыше загородного дома, запущена заранее, с запасом в час. Ровер работает без ошибок, данные передаются корректно. В rtkrcv наблюдается 9-11 валидных спутников.

Решения нет.

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

Читайте также:
Топ программ для Андроид для создания музыки

image

Весь трек полностью

image

Здесь я еще стою на парковке, но по треку не скажешь

image

А здесь я очень медленно и законопослушно ползу в плотном потоке машин

image

Вверху окна: график с количеством спутников

Затем попробовал провести постобработку: сначала конвертируем сырые данные в RINEX, производим постобработку и получаем трек. И получилось.

image

Весь трек полностью. Зеленые точки — есть решение, желтые — решение есть, но неточное

image

Здесь я еще стою на парковке, обратите внимание на шаг сетки в нижнем правом углу

image

Вверху окна: график с количеством спутников. Добавил для сравнения с аналогичным рисунком выше

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

Но нужно двигаться дальше. Я подумал: если у меня получилось получить координаты вручную, то может попробовать каждый раз так обрабатывать данные? Обработка стала занимать больше времени, появились промежуточные файлы и стадии, получается не совсем RTK, да и в целом это неграмотно. Но это работает.

Для красоты и удобства сделал страницу с обновляющимися каждые десять секунд маркерами, получился такой своеобразный трекер.

Условия использования Google Maps API накладывает ряд ограничений на использование сервиса. В нашем случае нам интересен пункт 10.4.c.iii, который гласит:

No navigation. You will not use the Service or Content for or in connection with (a) real-time navigation or route guidance; or (b) automatic or autonomous vehicle control.

Технически настроить и запустить RTK мне так и не удалось, навигации по маршруту так же не ведется. Но я на всякий случай все-таки уточню, не нарушают ли подобные действия условия использования.

image

Сейчас я собираю такую же систему, но для связи буду использовать радиоканал и nRF24L01+, должно получиться что-то больше похожее на RTK, но на небольшом расстоянии. Статью об этом напишу позже.

Источник: habr.com

Как разработать мобильное приложение с геолокацией: пошаговое руководство от Purrweb

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

Время чтения: 8 минут

как разработать мобильное приложение с геолокацией

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru