Русский
Русский
English
Статистика
Реклама

Навигация

Иван Чашкин Мне нравится, что OpenStreetMap это открытые данные, которые доступны всем и всегда

17.06.2020 12:21:27 | Автор: admin

Иван Чашкин web-программист и владелец небольшого интернет-магазина из Нижнего Новгорода. Но после работы он волонтер. Причем в абсолютно разных проектах: он и куратор Добрых крышечек в своем городе и опытный картограф OSM, который сделал несколько интересных инструментов. Почему он кайфует от JOSM, зачем надо отмечать подъезды и как лучше всего это сделать обо всем этом он рассказал в интервью.

Когда и как вы познакомились с проектом OpenStreetMap?

10-15 лет назад был проект Пробковорот, который строил карту пробок. Я им активно пользовался. И то ли он в какой-то момент перешел на OSM, то ли сразу его использовал. Но вот через это приложение я и узнал про существование OSM.

Почему вы начали редактировать карту в OSM? Как это случилось?

Незадолго до того, как я узнал про OSM, у меня была мысль сделать свою навигационную программу, так как тогда для Windows CE ничего подобного не было. Я стал интересоваться картографией и изучать соответствующие сервисы. Не знаю почему, но уже на этом этапе я стал собирать GPS-треки улиц своего города. В то время я жил в небольшом городке Воронежской области и обошел практически все его улицы. Кстати, он тогда был весьма плохо отрисован даже в Яндекс.Картах буквально пару улиц и всё. И представьте мою радость, когда я узнал про OSM и стал это белое пятно превращать в плотную сеть улиц, домов и пр. Тут-то мне и пригодились ранее собранные треки. Буквально на твоих глазах пустое место превращается в нормальную карту, а потом ты можешь загрузить всё это в навигатор и построить маршрут прямо до своего дома. Тогда это было чем-то невероятным.

Сложно ли вам было влиться в проект, изучить его теги, структуру, архитектуру?

Нет, не сложно, так как я увлекаюсь программированием. По мне так, OSM спроектирован достаточно логично. К тому же, есть WikiOSM, где все подробно написано практически о каждом теге. Если чего-то нет на русском, то это точно есть на английском языке. Если же все равно остались вопросы, всегда можно зайти на форум и попытать его обитателей, которые сразу же подскажут направление.



Сейчас продолжаете картографировать?

Продолжаю, но, в основном, отмечаю подъезды с номерами квартир, иногда магазины, а также, если иду или еду по незнакомой для меня территории и вижу какие-то интересные POI или нестандартное дорожное ограничение, то ставлю точку в навигаторе с комментарием. Потом уже дома, когда доходят руки, сверяюсь с OSM и вношу если необходимо правки. Помимо этого, если еду куда-то далеко или когда бываю в небольших деревнях, стараюсь всегда записывать GPS-треки, а после загружать их в OSM, чтобы потом по ним можно было выровнять спутниковые карты. А вообще есть идея сделать сервис, который бы показывал, где треков нет или они уже устарели и неплохо бы съездить туда ещё разок.

Как вы картографируете? Поделитесь своими секретами? Какие используете программы, как собираете информацию и пр.

Сейчас много правок вношу через мобильный навигатор Maps.Me. Он позволяет делать простейшие правки, в том числе оставлять заметки. Иногда использую Keypad-Mapper_3 это мобильное приложение, с помощью которого удобно собирать информацию, а именно номера домов. Треки пишу в OSM Tracker, когда это делаю, параллельно запускаю приложение Tower Collector, которое сопоставляется координаты с сигналом сотовой связи для проекта OpenCellId. Также как-то пробовал снимать панорамы улиц для Mapillary и OpenStreetCam, прикольная штука. Рекомендую. Неплохо так упрощает картирование.

Если же возникает желание отрисовать какую-то большую территорию, по-старинке распечатываю обходной лист и иду в поля: хожу, например, по дворам, смотрю их устройство и делаю пометки ручкой на листочке. Потом дома неспешно открываю JOSM и начинаю рисовать Когда так ходишь, нередко люди тебя принимают за какую-то важную персону, которая что-то проверяет, и начинают задавать странные вопросы.

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

Все-таки, почему подъезды?

Как-то я узнал, что в одном из регионов России OSM активно используется водителями скорой помощи. Тогда я подумал, что было бы неплохо отмечать так же и подъезды, чтобы можно было знать, куда именно подъезжать и оптимальнее строить маршрут. Впоследствии оказалось, что нумерация некоторых домов и их подъездов бывает не совсем очевидной, поэтому это довольно важная информация.

К тому же, их достаточно просто отмечать: идёшь по улице и записываешь с табличек номера подъездов и квартир в них. Обычно я это делаю через Maps.Me: ставлю в нем маркер и делаю к нему подпись вида 3:21-40 это означает, что здесь находится подъезд 3, в котором располагаются квартиры с 21 по 40. Когда дом более-менее стандартный, то можно записывать только последнее число, например, 1:-20, -40, 3:-60 и т.д. Сейчас мне также периодически приходится ездить развозить заказы по адресам и если есть номера квартир в подъезде, то сразу можно построить маршрут к финишу и даже приблизительно прикинуть этаж квартиры. Кстати, недавно мне пришла мысль попробовать сделать геокодер, который бы по адресу выдавал бы координаты места с точностью до подъезда, сделал небольшой прототип и сейчас тестирую когда есть время.



Вы автор многих полезных валидаторов. Самый известный из которых валидатор подъездов. Ни одна картоакция в сообществе, связанная с номерами подъездов, не обходится без него. Расскажите о них. Как они создавались? Зачем их делали?

Мои инструменты сложно назвать валидаторами, так как они ничто ни с чем не сравнивают. Они всего лишь удобным образом в режиме онлайн показывают какой-то определенный вид информации, который уже хранится в OSM. Почти все они основаны на замечательном сервисе Overpass Turbo, благодаря которому использование OSM в исследовательских целях превратилось просто в праздник. На API этого сервиса и основаны почти все мои инструменты, которые, наверное, правильно было бы назвать другим словом визуализаторы.

Как я выбираю то, что отображать? Исходя из личных потребностей. С чем я часто работаю в OSM или сталкиваюсь в жизни, то под это и делаю очередную версию визуализатора. Начал картировать подъезды сделал инструмент, который их показывает, чтобы понимать, где они еще не отмечены.

Когда искал земельный участок для покупки в Нижегородской области, обнаружилось, что неподалёку есть скотомогильник с сибирской язвой. Тогда я нашёл официальный документ и оказалось, что их вообще-то довольно много. После этого я сознательно изучил планы застройки многих районов своей области с целью поиска на них подобных объектов. Затем все их отметил в OSM и сделал карту опасных мест. И уже с учетом этих данных стал выбирать себе земельный участок.

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

Штабы Навального внёс, когда была президентская кампания. Было интересно посмотреть, сколько их всего по стране. Сейчас половина закрылась, поэтому периодически захожу и сверяю, для этого опять же добавил функцию подсветки на тот случай, если где-то данные различаются. Вертолётные площадки появились после очередного расследования ФБК, по ним прикольно находить большие поместья.

Одна из последних карта границ регионов. Мне на одном сайте потребовалось раскрасить регионы России по цветам. Поискал в интернете, где можно взять координаты, не нашёл. Мне показалось, что эта задача довольно интересная: нужно выгрузить координаты всех регионов и упростить линии, так чтобы было минимум точек. Можно, конечно, ещё немного оптимизировать, но в целом получилось довольно неплохое приближение.

Исходный код всех моих визуализаторов или карт есть на GitHub, в основном это JavaScript, минимум серверной части на PHP и да, если нужно, можно свободно использовать для своих целей.



Что вам нравится в OSM? Что не нравится? Что бы сделали лучше?

Мне нравится, что OSM это открытые данные, которые доступны всем и всегда. Их в любой момент можно выгрузить и с их помощью решить какую-либо свою геоинфомационную задачу. Одно время я очень старательно редактировал Народную карту Яндекса, но потом понял, что я сам не могу использовать то, что я туда внес. И я перестал это делать.

Мне нравится редактор JOSM. Многие его ругают, а я от него кайфую. Сколько лет в OSM, а до сих пор узнаю про него что-то новое, то оказывается, что у него есть эта функция, то другая. К тому же, его можно использовать не только для OSM, но и для других ГИС-задач. У него куча плагинов и невероятная гибкость.

Мне нравится ширина и глубина OSM. Это чуть больше, чем просто карта. Многие говорят, что это база данных, но это цифровая модель мира. Поэтому в нем хранится гораздо больше, чем вы видите на первый взгляд. В нем есть место, как информации о качестве дорог, так и даже 3D.

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

Что бы сделал лучше? Наверное, я пожелаю разработчикам многочисленных программ, которые есть в мире OSM, терпения, сил и ярких идей. Мы пользуемся вашими наработками почти каждый день и хотим, чтобы они были еще лучше! Например, я очень жду, когда Maps.Me начнет показывать полосы на дорогах и перекрестках. Я их вношу, вношу, а он их всё не показывает.



Какие бы вы порекомендовали проекты, инструменты, приложения, которые как-то связаны с OSM?

Если говорить про мобильные навигаторы, однозначно рекомендую Maps.Me и OsmAnd. Первый вам пригодится, если вы собираетесь путешествовать по городам, второй если вас ждет поход, у него есть крутые функции, например, водная навигация. Недавно видел отличный проект OpenRecycleMap ребята из Пскова сделали карту на базе OSM, где можно найти или добавить контейнер для раздельного сбора мусора.

Что бы вы сказали тому человеку, который сомневается: использовать данные OSM или нет; участвовать в проекте или нет?

OSM это как Википедия или волонтерство. Ты, как и многие другие участники, делаешь свой небольшой вклад в общее дело, а в итоге получается, что проделана большая работа. Лично мне приятно чувствовать себя сопричастным к таким проектам, которыми пользуется большое количество людей. Вроде бы ты в удовольствие что-то делаешь и для себя, а в итоге это приносит пользу всем :-)



Используете данные OSM по работе? В личной жизни?

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

Что скажете в завершении беседы?

Если однажды попробовать поредактировать карту в OSM, то это дело может затянуть всерьёз и надолго. Поэтому будьте осторожны. :-)



Общение российских участников OpenStreetMap идёт в чатике Telegram и на форуме.
Также есть группы в социальных сетях ВКонтакте, Facebook, но в них, в основном, публикуются новости.

Присоединяйтесь к OSM!



Подробнее..

Определяем направление на аэропорт с помощью RTL-SDR и GNU Radio

10.10.2020 00:13:06 | Автор: admin
Привет Хабр.

В настоящее время существует не так уж много стандартов связи, которые с одной стороны, любопытны и интересны, с другой стороны, их описание не занимает 500 страниц в формате PDF. Одним из таких, несложных для декодирования, является сигнал VHF Omni-directional Radio Beacon (VOR), используемый в аэронавигации.


VOR Beacon (с) wikimedia.org

Для начала вопрос читателям как сформировать сигнал так, чтобы с помощью ненаправленной приемной антенны можно было определять направление? Ответ под катом.

Общая информация


Система Very high frequency Omni-directional Range (VOR) используется для аэронавигации еще с 50х годов прошлого века, и состоит из радиомаяков относительно небольшой дальности (100-200 км), работающих в диапазоне частот УКВ 108-117 МГц (частота называется very high frequency вероятно потому, что есть еще маяки NDB, работающие в диапазоне средних волн 400-900 КГц). Размещение направленной антенны на самолете конструктивно неудобно, поэтому возникла задача, как закодировать в самом сигнале информацию о направлении на маяк.

Принцип работы на пальцах можно объяснить следующим образом. Представим, что у нас есть обычный маяк, посылающий узкий луч зеленого света, лампа которого вращается 1 раз в минуту. Очевидно, что раз в минуту мы будем видеть вспышку света, но одна такая вспышка много информации не несет. Добавим к маяку вторую ненаправленную лампу цвета красного цвета, вспыхивающую в момент, когда луч маяка проходит направление на север. Т.к. период вспышек и координаты маяка известны, посчитав задержку между красной и зеленой вспышками, можно узнать азимут на север. Все просто. Осталось сделать то же самое, но с помощью радио. Решено это было с помощью изменения фаз. Для передачи используется два сигнала: фаза первого является постоянной (reference), фаза второго (variable) меняется сложным образом в зависимости от направления излучения каждому углу соответствует свой сдвиг фазы. Таким образом, каждый приемник будет получать сигнал со своим сдвигом фаз, пропорциональным азимуту на маяк. Технология пространственной модуляции осуществляется с помощью специальной антенны (Alford Loop, см КДПВ) и особой, довольно хитрой модуляции. Которая собственно и является темой этой статьи.

Представим, что у нас есть обычный legacy-маяк, работающий с 50х годов, и передающий сигналы в обычной АМ-модуляции азбукой Морзе. Вероятно, когда-то давно, штурман действительно слушал эти сигналы в наушниках и отмечал направления линейкой и циркулем на карте. Мы хотим добавить к сигналу новые функции, но так, чтобы не порушить совместимость со старыми. Тема знакомая, ничто не ново Было сделано следующим образом к АМ сигналу добавили низкочастотный 30 Гц тон, исполняющий функцию reference-phase сигнала, и высокочастотную компоненту, закодированную частотной модуляцией на частоте 9.96 КГц, передающую variable phase сигнал. Выделив два сигнала и сравнив фазы, мы получаем искомый угол от 0 до 360 градусов, который и является нужным азимутом. При этом, всё это не помешает слушать маяк обычным образом и остается совместимым со старыми АМ-приемниками.

Перейдем от теории к практике. Запустим SDR-приемник, выберем модуляцию АМ и ширину полосы 12 КГц. Частоты маяков VOR можно легко найти в сети. На спектре сигнал выглядит следующим образом:



В данном случае сигнал маяка передается на частоте 113.950 МГц. В центре видна легко узнаваемая линия амплитудной модуляции и сигналы азбукой морзе (.- что значит AMS, Амстердам, аэропорт Schiphol). Вокруг на расстоянии 9.6 КГц от несущей видны два пика, передающие второй сигнал.

Запишем сигнал в WAV (не MP3 сжатие с потерями убьет всю структуру сигнала) и откроем его в GNU Radio.

Декодирование


Шаг 1. Откроем файл с записанным сигналом, и применим к нему фильтр низких частот, чтобы получить первый reference-сигнал. Граф GNU Radio показан на рисунке.



Результат: низкочастотный сигнал с частотой 30 Гц.



Шаг 2: декодируем variable phase сигнал. Как говорилось выше, он расположен на частоте 9.96 КГц, нам нужно перенести его на нулевую частоту и подать на FM-демодулятор.

Граф GNU Radio:



Все, задача решена. Мы видим два сигнала, разность фаз которых указывает на угол от приемника до VOR-маяка:



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

К счастью, все это вручную можно не делать: существует уже готовый проект на Python, декодирующий сигналы VOR из WAV-файлов. Собственно, его изучение и вдохновило меня на изучение этой темы.

Желающие могут запустить программу в консоли и получить готовый угол в градусах из уже записанного файла:



Фанаты авиации могут даже сделать себе портативный приемник из RTL-SDR и Raspberry Pi. Кстати, на настоящем самолете данный индикатор выглядит примерно так:


Image www.aopa.org

Заключение


Подобные сигналы из прошлого века определенно интересны для анализа. Во-первых, они достаточно простые, современный DRM или тем более GSM, вот так на пальцах декодировать уже не получится. Они открыты для приема, в них нет ключей и криптографии. Во-вторых, возможно, в будущем они уйдут в историю и будут заменены спутниковой навигацией и более современными цифровыми системами. Так что владельцам приемников можно посоветовать принять такие сигналы, пока они еще работают.

Как обычно, всем удачных экспериментов.
Подробнее..

Тесла верит своим Богам! Так она находит путь

20.05.2021 10:09:10 | Автор: admin

Как устроена навигация в автомобилях Tesla. В чем трудности поиска пути по земли русской?

C 2018 года все счастливые обладатели Tesla в России получили обновление Европейской навигации в которой России уже не было, официально это объясняется поддержанием баланса веса карт и удалением регионов, не входящих в зону официального обслуживания.

Как же использовать большой экран Tesla на полную силу? Видеть маршрут, какой процент батареи останется? С какой скоростью ехать? Можно ли сделать даунгрейд на старые карты?

Тесла использует для построения маршрутов Valhalla -это механизм маршрутизации с открытым исходным кодом и сопутствующие библиотеки для использования с данными OpenStreetMap.

Valhalla в Tesla и Тесла в ВальхаллеValhalla в Tesla и Тесла в Вальхалле

Вальхалла - это не только пантеон германских Богов и "чертог мёртвых ", но и отличный движок для построения маршрутов с дополнительными инструментами и модульной структурой, API на основе C++, с возможностью перекрестной компиляции различных фрагментов. И да, все это open source https://github.com/valhalla/valhalla.

Работает на Linux и Mac OS и частично на Windows.

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

Midgard - базовые географические и геометрические алгоритмы для использования в различных других проектах.

Baldr - базовые структуры данных для доступа и кэширования данных маршрута.

Sif - библиотека, используемая при расчете стоимости узлов графа. Это может быть использовано в качестве входных данных для Loki и Thor.

Skadi - библиотека и сервис для доступа к данным о высоте. Это может быть использовано в качестве входных данных для Mjolnir или в качестве автономной службы.

Mjolnir - Инструменты для превращения открытых данных в части графа Valhalla.

Loki - библиотека, используемая для поиска участка графа и корреляции входных местоположений с объектом внутри участка. Эта коррелированная сущность (ребро или вершина) может использоваться в качестве входных данных для Thor.

Meili - библиотека, используемая для сопоставления карт.

Thor - библиотека, используемая для создания пути через иерархию участков графа. Этот путь и атрибуция вдоль пути могут быть использованы в качестве входных данных для Odin.

Odin - библиотека, используемая для создания маневров в пути. Этот набор информации о направлениях может использоваться в качестве входных данных для Tyr.

Tyr - сервис, используемый для обработки http-запросов для маршрута, связывающегося со всеми другими API valhalla. Tyr форматирует вывод из Odin.

Установка

Если у Вас Ubuntu 20.04 отличный гайд по установке.

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

Для ЦФО РФ

curl -O http://download.geofabrik.de/russia/central-fed-district-latest.osm.pbf

Рендерим карты

valhalla_build_tiles -c ./conf/valhalla.json central-fed-district-latest.osm.pbf

Запускаем

valhalla_service ~/valhalla/scripts/conf/valhalla.json 2

Давайте найдем маршрут на автомобиле из Москвы в Подольск

curl http://localhost:8002/route \--data '{"locations":[              {"lat":55.7522,"lon":37.6156},              {"lat":55.4242,"lon":37.5547}           ],         "costing":"auto"        }' | jq '.'

В ответ получаем JSON с узловыми токами маневров.

Файл навигации в Тесла

Я обратился https://teesla.ru/ и мне передали файл с европейской навигацией из Тесла. Весит файл около 8гб и на мое удивление содержит вовсе не карты, а уже проложенные пути.

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

Пример

json { "trip": { "language": "en-US", "status": 0, "units": "miles", "status_message": "Found route between points", "legs": [ { "shape": "yx{xmA_lybd@oClBqWxRqWhRsFlEeKlHaChBiGbFqGtEkWxRyQbN", "summary": { "max_lon": 19.461329, "max_lat": 41.321014, "time": 28, "length": 0.178, "min_lat": 41.318813, "min_lon": 19.45956 }, "maneuvers": [ { "travel_mode": "drive", "begin_shape_index": 0, "length": 0.154, "time": 24, "type": 1, "end_shape_index": 9, "instruction": "Drive northwest on Rruga Stefan Kaulini.", "verbal_pre_transition_instruction": "Drive northwest on Rruga Stefan Kaulini for 2 tenths of a mile.", "travel_type": "car", "street_names": [ "Rruga Stefan Kaulini" ] }, { "travel_type": "car", "travel_mode": "drive", "verbal_pre_transition_instruction": "Continue on Rruga Glaukia for 100 feet. Then You will arrive at your destination.", "verbal_transition_alert_instruction": "Continue on Rruga Glaukia.", "length": 0.024, "instruction": "Continue on Rruga Glaukia.", "end_shape_index": 10, "type": 8, "time": 4, "verbal_multi_cue": true, "street_names": [ "Rruga Glaukia" ], "begin_shape_index": 9 }, { "travel_type": "car", "travel_mode": "drive", "begin_shape_index": 10, "time": 0, "type": 4, "end_shape_index": 10, "instruction": "You have arrived at your destination.", "length": 0, "verbal_transition_alert_instruction": "You will arrive at your destination.", "verbal_pre_transition_instruction": "You have arrived at your destination." } ] } ], "summary": { "max_lon": 19.461329, "max_lat": 41.321014, "time": 28, "length": 0.178, "min_lat": 41.318813, "min_lon": 19.45956 }, "locations": [ { "original_index": 0, "lon": 19.461336, "lat": 41.318817, "type": "break" }, { "original_index": 1, "lon": 19.459599, "lat": 41.320999, "type": "break" } ] } }

Для адресов используются данные из карт Tomtom

Пример импорта в файле карт tesla из tomtom

mport_db:schema tomtom_eur_2019_03_007:eur_schema_0329export_db:schema tomtom_eur_2019_03_007:allagash_eur_schema_0329_02_05_2019_a665978_10482

EU-2019.20-10482valhalla_allagash_eur_schema_0329_02_05_2019_a665978_10482_02_05_2019_a665978_10482.pbf-tiles-1ee14c0.tarimport a665978export a665978build 1ee14c0 VE-3.0.0 common pro/dad pro/dun pro/eng pro/frf pro/ged pro/iti high/non pro/spe pro/swsaddress-eur-tomtom_eur_2019_03_007-19.mt./valhalla/build-filesync.shcbe7391137bb Fri May 3 23:42:49 UTC 2019import_db:schema tomtom_eur_2019_03_007:eur_schema_0329export_db:schema tomtom_eur_2019_03_007:allagash_eur_schema_0329_02_05_2019_a665978_10482supplement

Файл карт в файловой системе Squashfs (.sfs)

Последние 2кб очень странные, в них и вся соль. Файлы подписаны ключом. Шифрование AES.

При загрузке карт в машину, Тесла проверяет подпись поэтому модифицированные карты не удалось загрузить.

P.S.

Можно ли подписать карты? Найти ключ и порядок S-box? Тесла на Тегра хранят файл навигации на отдельной карте памяти в MCU. Тесла на Intel хранят файл навигации на в основной eMMC. С картой памяти все просто, разбираем половину торпеды, вытаскиваем из MCU, заливаем дамп с картами и вставляем обратно, с eMMC не так все однозначно. Если карты просто залить на чип eMMC, апдейтер в автомобиле с живыми сертификатами загрузит обновление и заменит их.

От cебя готов предоставить приз целый день аренды самой заряженной Tesla model 3 Performance за способ генерации и загрузки карт в Tesla model 3 с РФ. Пишите в личку.

Подробнее..

Пишем свою навигацию в Qt

02.04.2021 18:19:41 | Автор: admin

Всем привет. Я android разработчик с небольшим стажем. И сегодня я бы хотел поделиться опытом разработки учебного проекта на C++ и Qt с простой навигацией между экранами. Буду рад услышать критику или дополнения к моему решению и надеюсь, что оно сможет кому-то помочь и упростить жизнь.

Задача

Прежде чем начать, определимся с двумя терминами, чтобы в итоге не возникало путаницы.
Окно самое обычное окно в windows или любой другой os.
Экран какой-то контент, который может сменяться другим внутри окна.

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

Чтобы отказаться от главного окна, нужно написать навигатор, который будет уметь заменять экраны внутри QStackedWidget и предоставит различные сценарии переходов от одного экрана к другому. Также необходимо знать о предыдущих экранах для возможности вернуться к ним и как-то передавать данные.

На изображении ниже представлена схема приложения и переходы. Когда приложение запускается, мы видим заставку, потом выполняется замена экрана на стартовый или на главный. При этом вернуться с главного экрана на загрузку мы не можем.

В итоге, посмотрев на схему, мы можем составить небольшой список подзадач, которые хотим реализовать:

  1. Общий родитель у экранов для реализации взаимодействий.

  2. Фабрика экранов.

  3. Определение команд для навигации у экранов.

  4. Хранение стека экранов.

Общая модель экрана

Очевидный этап проработки навигатора вынесение связанных с ним методов в отдельный класс BaseFragment. Это базовый экран, от которого мы унаследуем все остальные. Пока это просто абстракция, но мы к нему еще вернемся и допишем.

class BaseFragment: public QFrame {    Q_OBJECTsignals:    //тут мы потом определим сигналы для навигатора public:    BaseFragment();    ~BaseFragment();    //тут реализуем что-то из жизненного цикла};

Далее реализуем несколько экранов опираясь на BaseFragment. Каждый из фрагментов является виджетом, который мы можем поместить в QStackedWidget и выбрать отображаемый.

class LoginFragment: public BaseFragmentclass StartFragment: public BaseFragmentclass RegistrationFragment : public BaseFragment

Фабрика фрагментов

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

class BaseScreensFactory {public:    BaseScreensFactory();    ~BaseScreensFactory();    virtual BaseFragment* create(QString tag);    virtual QString createStart();};

Фабрика имеет всего два виртуальных метода:

  1. create(QString tag) создает экран по его идентификатору (идентификатор мы указываем в конкретной реализации фабрики);

  2. createStart() возвращает идентификатор стартового экрана.

Ниже реализация фабрики в моем проекте:

// screensfacrory.h заголовочный файлnamespace screens {    static const QString SPLASH_TAG = "splash";    static const QString START_TAG = "start";    static const QString LOGIN_TAG = "login";    static const QString REGISTRATION_TAG = "registration";  // и так далее.....};class ScreensFactory: public BaseScreensFactory {public:    ScreensFactory();    ~ScreensFactory();    BaseFragment* create(QString tag) override;    QString createStart() override;};// screensfacrory.cpp исходникиBaseFragment* ScreensFactory::create(QString tag) {    qDebug("ScreensFactory create");    if (tag == SPLASH_TAG) {        return new SplashFragment;    } else if (tag == START_TAG) {        return new StartFragment;    } else if (tag == LOGIN_TAG) {        return new LoginFragment;    } else if (tag == REGISTRATION_TAG) {       // и так далее.....    }}QString ScreensFactory::createStart() {    return SPLASH_TAG; // идентификатор стартового экрана.}

Наконец сама навигация

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

Нужные нам методы навигации:

  • navigateTo(tag) переход к новому экрану с добавлением этого экрана в цепочку открытых живущих.

  • back() переход к предыдущему экрану с в цепочке с удалением текущего из нее.

  • replace(tag) замена текущего экрана в цепочке на новый.

  • newRootScreen(tag) удаление текущей цепочки и создание нового экрана.

  • navigateToWhithData(tag, data) то же самое, что и navigateTo(tag), только вместе с именем экрана передается ссылка на какой-то объект.

Например, когда мы открываем экран с регистрацией, находясь на экране приветствия, выполняется метод navigateTo(REGISTRATION_TAG), после регистрации нужно открыть главный экран, но запретить переход назад. Для этого выполняем newRootScreen(MAIN_TAG).

Чтобы навигатор понимал, что нужно текущему фрагменту, в класс BaseFragment нужно дописать сигналы для методов навигации, описанных выше.

class BaseFragment: public QFrame {    Q_OBJECTsignals:  //дописанные сигналы    void back();    void navigateTo(QString tag);    void newRootScreen(QString tag);    void replace(QString tag);        void navigateWhithData(QString tag, BaseModel* model); public:    BaseFragment();    ~BaseFragment();  //дописанные методы для жизненного цикла    virtual void onPause();    virtual void onResume();    virtual void setData(BaseModel* model);};

Поскольку фрагменты не все время находятся на экране, мы можем ставить на паузу процессы, выполняющиеся в нем, вызывая onPause(), и возобновлять, вызывая onResume() из навигатора, который мы скоро напишем. И метод setData() мы вызываем при передаче данных в фрагмент.

После долгих подготовок переходим к написанию навигации. Навигатор будет получать QStackedWidget как контейнер для фрагментов и BaseScreensFactory для создания фрагментов.

navigator.h:

class Navigator: public QObject {    Q_OBJECTprivate:    QStackedWidget *currentContainer;    BaseScreensFactory *screensFactory;    QLinkedList<BaseFragment*> stack;    /**     * @brief createAndConnect     * @param tag тэг создаваемого фрагмента.     *     * Создание фрагмента по тегу и его     * прикрепление к навигатору.     *     * @return фрагмент присоединенный к слотам навигатора.     */    BaseFragment* createAndConnect(QString tag);    /**     * @brief connectFragment     * @param fragment фрагмент который переходит     *        в активное состояние.     *     * Прикрепление текущего фрагмента     * к слотам навигатора для быстрого     * и удобного перехода между экранами.     *     */    void connectFragment(BaseFragment *fragment);    /**     * @brief disconnectFragment     * @param fragment     *     * Отключение сигналов от фрагмента.     */    void disconnectFragment(BaseFragment *fragment);public:    Navigator(            QStackedWidget *container,            BaseScreensFactory *screensFactory    );    ~Navigator();    BaseFragment* getStartScreen();public slots:    /**     * @brief navigateTo     * @param tag имя следующего экрана.     *     * Переход к следующему экрану.     */    void navigateTo(QString tag);    /**     * @brief back     *     * Переход назад по цепочке.     */    void back();    /**     * @brief replace     * @param tag имя экрана на который     *        произойдет замена.     *     * Замена текущего экрана с сохранением     * предыдущей цепочки.     */    void replace(QString tag);    /**     * @brief newRootScreen     * @param tag имя экрана на который     *        произойдет замена.     *     * Замена текущего экрана на новый и сброс     * всей цепочки экранов.     */    void newRootScreen(QString tag);    /**     * @brief navigateWhithData     * @param model     *     * Тот же navigateTo но с данными.     */    void navigateWhithData(QString tag, BaseModel* model);};

Во время смены экранов происходит немного магии с их заменой. При создании фрагмента его сигналы нужно прикрепить к слотам навигатора. При смене фрагмента текущий нужно открепить от слотов и прикрепить новый. connectFragment присоединяет все слоты к сигналам, после этого навигатор управляется этим фрагментом. disconnectFragment открепляет все сигналы. createAndConnect создает фрагмент по его имени через фабрику и сразу прикрепляет его к навигатору. getStartScreen создает стартовый экран по имени, указанному в фабрике, и прикрепляет его к навигатору.

BaseFragment* Navigator::getStartScreen() {    return createAndConnect(this->screensFactory->createStart());}void Navigator::connectFragment(BaseFragment *fragment) {    connect(fragment, &BaseFragment::back, this, &Navigator::back);    connect(fragment, &BaseFragment::replace, this, &Navigator::replace);    connect(fragment, &BaseFragment::navigateTo, this, &Navigator::navigateTo);    connect(fragment, &BaseFragment::newRootScreen, this, &Navigator::newRootScreen);    connect(fragment, &BaseFragment::navigateWhithData, this, &Navigator::navigateWhithData);}void Navigator::disconnectFragment(BaseFragment *fragment) {    disconnect(fragment, &BaseFragment::back, this, &Navigator::back);    disconnect(fragment, &BaseFragment::replace, this, &Navigator::replace);    disconnect(fragment, &BaseFragment::navigateTo, this, &Navigator::navigateTo);    disconnect(fragment, &BaseFragment::newRootScreen, this, &Navigator::newRootScreen);    disconnect(fragment, &BaseFragment::navigateWhithData, this, &Navigator::navigateWhithData);}BaseFragment* Navigator::createAndConnect(QString tag) {    BaseFragment *fragment = this->screensFactory->create(tag);    connectFragment(fragment);    return fragment;}

В конструкторе сохраняем ссылки на контейнер и фабрику, создаем стартовый фрагмент и кладем его в контейнер.

Navigator::Navigator(        QStackedWidget *container,        BaseScreensFactory *screensFactory) {    this->screensFactory = screensFactory;    this->currentContainer = container;    BaseFragment* startFragment = getStartScreen();    this->stack.append(startFragment);    currentContainer->addWidget(stack.last());    currentContainer->setCurrentIndex(0);}

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

void Navigator::navigateTo(QString tag) {    BaseFragment *newFragment = this->screensFactory->create(tag);    stack.last()->onPause();    disconnectFragment(stack.last());    connectFragment(newFragment);    stack.append(newFragment);    currentContainer->addWidget(newFragment);    currentContainer->setCurrentWidget(newFragment);}

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

MainWindow::MainWindow(QWidget *parent)    : QMainWindow(parent){       try {        container = new QStackedWidget;        this->factory = new ScreensFactory;        this->navigator = new Navigator(                    this->container,                    this->factory        );        this->setCentralWidget(container);    } catch (std::exception& e) {        qDebug("%s", e.what());    }}

Взгляд со стороны

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

Мне мое решение очень помогло в реализации проекта. Я смог ускорить разработку и разделить код.

Всем дочитавшим спасибо, надеюсь кому-то это поможет.

Вот ссылка GitHub проекта

Подробнее..

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

18.07.2020 22:06:54 | Автор: admin
Расскажем, о направлении Системы управления движением и навигация в Университете ИТМО.


Фото Joline Torres / Unsplash.com

Зачем заниматься этой темой


Порой перемещение по городу становится испытанием. По данным Техасского института транспорта, за год автолюбители в США в среднем тратят 54 часа на стояние в пробках. Но для городов вроде Лос-Анджелеса эта цифра достигает 119 часов. Российские водители проводят в пробках примерно 41 час.

Все это выливается в дополнительные расходы на топливо, временные затраты и замедляет развитие экономики. Но неудобства в городах испытывают не только автолюбители. Страдают велосипедисты, пешеходы, а сильнее всего люди с ограниченными возможностями. Они не могут перемещаться по необорудованным дорожкам и несут дополнительные расходы. В Великобритании инвалиды ежемесячно тратят на 500 фунтов больше среднего, чтобы передвигаться на такси.

Отмеченные проблемы сами по себе не решаются. Наукой и разработкой систем в этой области занимаются специалисты по управлению движением и навигации и тем самым приносят пользу обществу. Так, инженеры из MIT представили алгоритм, который помогает развозить учеников по государственным школам Бостона. В итоге удалось сэкономить 5 млн долларов на топливе эти деньги направили на развитие учебных программ. Специалисты в сфере управления движением также участвуют в разработке беспилотников. В перспективе они сделают поездки менее напряженными.

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


Фото Linda Sndergaard / Unsplash.com

В этой экспертной области можно построить карьеру. Такие специалисты востребованы в крупных ИТ-компаниях. Наш выпускник Роман Яналов сейчас работает над беспилотными автомобилями в Яндексе он пишет системное ПО и драйвера для лидара. Некоторые начинают проектировать собственные продукты сейчас в Университете ИТМО разрабатывают беспилотный авиационный комплекс для зондирования местности. Его будут применять при строительстве железных дорог.

Что мы предлагаем студентам


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

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

Магистранты могут выбрать одну из трех специализаций:

  • Проектирование информационно-навигационных систем;
  • Разработка ПО для навигационных систем;
  • Синтез алгоритмов для управления надводными судами.

Лекции читают ученые из международной организации Академия навигации и управления движением. Практику студенты проходят в АО Концерн ЦНИИ Электроприбор. Компания закрепляет за каждым магистром своего ментора, который помогает им с рабочими задачами они связаны с разработкой навигационной аппаратуры и обработкой данных.

При желании учащиеся могут пройти практику в иностранных вузах Университете Тампере и Технологическом институте в Карлсруэ. Они расположены в Финляндии и Германии соответственно.

Выпускники магистратуры работают крупных отраслевых предприятиях в ЦНИИ Электроприбор, НПО Аврора, ОКБ Электроавтоматика и АО Навис. Они разрабатывают системы управления для самолётов, надводных судов и космических аппаратов. Но некоторые студенты решают продолжить научные изыскания и идут в аспирантуру Университета ИТМО.

Как поступить


Чтобы поступить на Системы управления движением и навигацию нужно:


Если у вас есть вопросы, связанные с образовательным процессом, позвоните или напишите напрямую сотрудникам отдела магистратуры. Они дадут вам ответы и постараются помочь.



Что еще у нас по теме учебного процесса в IT и не только:



Подробнее..

Умная навигация в играх на примере Mafia Definitive Edition

25.11.2020 12:06:49 | Автор: admin

Привет Хабр! Представляю вашему вниманию перевод статьи Mafia: Definitive Editions Clever Navigation System автора Tushar Deb.

Размер игр с открытым миром становится больше с каждым новым релизом: большие карты, больше исследований и еще больше перемещений. Исключение составляют относительно линейные проекты, в которых игроки могут двигаться одними и теми же путями. Например, в серии Need for Speed или Grand Theft Auto: Vice City, где игрок быстро запоминает маленький открытый мир и легко в нем ориентируется. В противном случае искать удобный и короткий путь в опенворлде не самое увлекательное занятие.

И вот тут на помощь приходят мини-карта и метки отмечаете точку и следуете маршруту. Легко!

Red Dead Redemption 2. Метка на карте (слева) и мини-карта, направляющая к нейRed Dead Redemption 2. Метка на карте (слева) и мини-карта, направляющая к ней

Но как сделать эту навигационную систему более захватывающей? Как найти способ, который дает игроку новый опыт, а не добавляет рутины?

Игра происходит не на мини-карте, а на гораздо большей области экрана. Мини-карта помогает игроку получить информацию об окружении, которая существует за границами области игрового экрана. Тогда почему игрок смотрит на мини-карту чаще, чем на игровой мир?

В Mafia: Definitive Edition проделана огромная работа по интеграции навигационной системы в окружающую среду игры. Это дало гораздо более захватывающий опыт, который не кажется рутиной, а наоборот добавляет естественного реализма.

Mafia: Definitive Edition. Навигационный дорожный знак, указывающий прямоMafia: Definitive Edition. Навигационный дорожный знак, указывающий прямоMafia: Definitive Edition. Навигационный дорожный знак, указывающий налевоMafia: Definitive Edition. Навигационный дорожный знак, указывающий налево

Вы не найдете эту навигационную систему в оригинальной Mafia, в которой обычная система посмотрите на мини-карту, как, например, в Red Dead Redemption 2. Мир RDR2 огромен, без меток в нем не обойтись, поэтому постоянно приходится смотреть на мини-карту, отвлекаясь от происходящего на экране.

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

Когда я спешу в игре, то мой навигационный игровой опыт выглядит примерно так:

Mafia: Definitive Edition. Игровой экран и мини-карта поменялись местамиMafia: Definitive Edition. Игровой экран и мини-карта поменялись местами

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

Конечно, в других проектах тоже придумали неплохие решения. Например, в Far Cry 5 синие направляющие на дороге помогают сориентироваться, не отвлекаясь на мини-карту.

Far Cry 5. Синие направляющие к метке на картеFar Cry 5. Синие направляющие к метке на карте

Но, я считаю, Mafia: Definitive Edition сделала это лучше всех. Вы едете по городу, и что может быть лучше, чем поставить навигационные дорожные знаки, которые реалистично интегрируются в открытый мир.

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

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru