Курсовой проект АП СРНС 2019
Содержание |
Курсовой проект 2019
Название проекта: Разработка модуля расчёта координат спутника GPS
Курсовой проект по данной дисциплине выполняется во втором семестре. В рамках проекта студенты знакомятся с рядом инструментов и техник, используемых при разработке АП СРНС:
- обработка данных от приемника ГНСС в RTKLIB;
- обработка данных и моделирование в Matlab/Python;
- разработка программного модуля на С/С++, включая юнит-тестирование в Check.
Консультации по этапу производятся до наступления соответствующего дедлайна.
Этап 1. Использование сторонних средств
Дедлайн: 08.03.19 (устранение замечаний и итоговый мёрдж до 15.03.19)
На крыше корпуса Е МЭИ установлена трехдиапазонная антенна Harxon HX-CSX601A. Она через 50-метровый кабель, сплиттер, bias-tee и усилитель подключена к трем навигационным приемникам:
- Javad Lexon LGDD,
- SwiftNavigation Piksi Multi,
- FPGA-based приемник на основе нашего ядра CoreZh.
Приемники осуществляют первичную обработку сигналов, выдавая по интерфейсам соответствующие потоки данных - наблюдения псевдодальностей и эфемериды спутников. В этом году вы будете обрабатывать данные от приемника CoreZh, представленные в бинарном виде в формате NVS BINR.
Конечная цель проекта - разработать библиотечные функции на Си++, позволяющие рассчитывать положени спутника GPS по эфемеридам. На этом этапе мы получаем входные данные для этой функции - сами эфемериды.
Для этого воспользуемся пакетом RTKLIB, в состав которого входит парсер формата NVS BINR и удобные средства отображения данных.
Программа RTKNAVI позволяет вывести таблицу текущих и предыдущих эфемерид (маленькая, очень маленькая кнопка слева снизу главного окна):
Программа RTKCONV позволяет конвертировать бинарный файл в текстовый формат RINEX, в частности получить тектовый nav-файл с эфемеридами GPS:
Оформить отчёт по результатам этапа:
- Описание процесса использования RTKLIB
- Эфемериды собственного спутника по данным RTKNAVI из состава RTKLIB (номер спутника GPS см. в журнале выше)
- Эфемериды собственного спутника в nav-файле RINEX
- График угла места собственного спутника от времени по данным Trimble GNSS Planning Online на заданный интервал времени (см. задание второго этапа)
- SkyView по данным Trimble GNSS Planning Online на заданный интервал времени (см. задание второго этапа)
Работа осуществляется в репозитории на github на базе gpsephexercise. Для этого:
- Завести, если до сих пор нет, аккаунт на github
- Сделать форк проекта gpsephexercise (маленькая кнопка сверху справа в вэб-интерфейсе)
- Установить на рабочем компьютере git (для выполнения последующих этапов удобнее будет сделать это в ОС GNU/Linux, вероятно, на виртуальной машине)
- Клонировать свой форк на рабочий компьютер (
git clone https://github.com/MySuperAccount/gpsephexercise.git
) - Промежуточные и итоговые результаты по первому этапу хранить в каталоге processing (
git pull; git add <files>; git commit -m "Сделал то-то то-то"; git push
) - По результатам первого этапа завести Pull Request в исходный проект в ветку, название которой совпадает с вашей фамилией (кнопка наверху в вэб-интерфейсе)
- Устранить все замечания, добиться принятия Pull Request'а.
Этап сдан тогда, когда ваш ПР принят.
Запись бинарного потока от приемника расположена в каталоге logs репозитория. Там два файла: BINR_morning.bin и BINR_evening.bin, записанные утром и вечером 13.02.19 соответственно.
Этап 2. Моделирование
Дедлайн: 12.04.19 (исправления до 19.04.19)
На предыдущем этапе получено решение навигационной задачи с помощью программы вторичной обработки измерений, например, RTKLIB. В процессе работы она рассчитывает положение спутников на соответствующий момент сигнального времени. При этом используются эфемериды - параметры некоторой модели движения спутника. В разных ГНСС эти модели разные, а значит отличается и формат эфемерид, и алгоритмы расчета положения спутника.
Одна из самых простых и удобных моделей - в системе GPS.
Требуется реализовать на языке Matlab или Python функцию расчета положения спутника GPS на заданный момент по шкале GPST. В качестве эфемерид использовать данные, полученные на предыдущем этапе.
Построить трехмерные графики множества положений спутника GPS с системным номером, соответствующим номеру студента по списку. Графики в двух вариантах: в СК ECEF WGS84 и соответствующей ей инерциальной СК. Положения должны соответствовать временному интервалу с 12:00 13.02.19 до 00:00 14.02.19. Допускается использовать одни и те же эфемериды на весь рассматриваемый интервал.
Построить SkyView за указанный временной интервал (напоминаю, антенна на крыше корпуса Е) и сравнить результат с Trimble GNSS Planning Online, полученный на прошлом этапе.
Оформить отчет по результатам этапа:
- Реализация в Matlab или Python
- Таблица использованных эфемерид
- Трехмерные графики положений спутника в ECEF и ECI (не забудьте подписать оси, изобразите соответствующую Земле сферу в начале СК)
- Расчётный и полученный в GNSS Planing Online SkyView
- Выводы
Работы по данному этапу осуществляются в каталоге simulation. Правила приемки этапа те же.
Этап 3. Реализация
Дедлайн: 24.05.19
Требуется разработать на языке С/С++ функцию расчета положения спутника GPS на заданное время по шкале GPST, минимизируя время её исполнения и количество затрачиваемой оперативной памяти. Вызов функции не должен приводить к выбросу исключений или утечкам памяти при любом наборе входных данных.
Функция расчета положения спутника в Matlab/Python относительно проста, т.к. доступны библиотеки линейной алгебры и решения уравнений. Но при разработке встраиваемого ПО приходится сохранять лицензионную частоту, минимизировать вычислительную нагрузку и затраты памяти. Поэтому отобразить модель из Matlab/Python в прошивку приемника дословно, как правило, не получается. В рассматриваемом примере потребуется, как минимум, выполнить свою реализацию решения уравнения Кеплера.
Программный модуль должен сопровождаться unit-тестами под check:
- Тесты функции решения уравнения Кеплера
- Тест расчетного положения спутника в сравнении с Matlab/Python с шагом 0.1 секунды.
Во время второго теста должно вычисляться и выводиться средняя длительность исполнения функции. Допускается использовать одни и те же эфемериды на весь рассматриваемый интервал (как на предыдущем этапе).
Требуется провести проверку на утечки памяти с помощью утилиты valgrind.
Оформить отчет по результатам курсового проекта. В качестве первых двух глав использовать отчёты с предыдущих этапов, в третьей главе отразить результаты этого этапа:
- Код реализации
- Вывод тестов, включая анализ времени исполнения
- Вывод valgrind
- Вывод по этапу
- Заключение по проекту
По ссылке доступен архив каркаса программного модуля, представленного в виде подключаемой библиотеки на базе системы сборки CMake. Настроена компиляция статической/динамической библиотек компилятором/кросскомпилятором и выполнение юнит-тестов (проверено в GNU/Linux системах). Для примера в библиотеке реализованы две функции: умножения и сложения.
В функцию сложения add внесена ошибка, на которую указывает результат соответствующего юнит-теста:
korogodin@KorPC:~/Receivers/RecCourse/project/libgpssvpos$ cd build/
korogodin@KorPC:~/Receivers/RecCourse/project/libgpssvpos/build$ cmake ..
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- libgpssvpos version: f143b84
-- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.1")
-- Checking for one of the modules 'check'
-- Configuring done
-- Generating done
-- Build files have been written to: /home/korogodin/Receivers/RecCourse/project/libgpssvpos/build
korogodin@KorPC:~/Receivers/RecCourse/project/libgpssvpos/build$ make
Scanning dependencies of target gpssvpos-static
[ 11%] Building CXX object src/CMakeFiles/gpssvpos-static.dir/gpssvpos.cpp.o
[ 22%] Building CXX object src/CMakeFiles/gpssvpos-static.dir/kepler.cpp.o
[ 33%] Linking CXX static library libgpssvpos-static.a
[ 33%] Built target gpssvpos-static
Scanning dependencies of target gpssvpos
[ 44%] Building CXX object src/CMakeFiles/gpssvpos.dir/gpssvpos.cpp.o
[ 55%] Building CXX object src/CMakeFiles/gpssvpos.dir/kepler.cpp.o
[ 66%] Linking CXX shared library libgpssvpos.so
[ 66%] Built target gpssvpos
Scanning dependencies of target test_gpssvpos
[ 77%] Building CXX object test/CMakeFiles/test_gpssvpos.dir/check_main.cpp.o
[ 88%] Building CXX object test/CMakeFiles/test_gpssvpos.dir/check_position.cpp.o
[100%] Linking CXX executable test_gpssvpos
Running unit tests
Running suite(s): My test suite
50%: Checks: 2, Failures: 1, Errors: 0
/home/korogodin/Receivers/RecCourse/project/libgpssvpos/test/check_position.cpp:11:F:Main tests:test_add:0: 1+2 should be 3
test/CMakeFiles/test_gpssvpos.dir/build.make:121: ошибка выполнения рецепта для цели «test/test_gpssvpos»
make[2]: *** [test/test_gpssvpos] Ошибка 1
Работы по данному этапу осуществляются в каталоге libgpssvpos. Правила приемки этапа те же.