Аппаратура потребителей спутниковых радионавигационных систем (дисциплина) — различия между версиями
Korogodin (обсуждение | вклад) (→Курсовая работа) |
Korogodin (обсуждение | вклад) (→Этап 1. Использование сторонних средств) |
||
Строка 375: | Строка 375: | ||
Эти приемники осуществляют первичную обработку сигналов, выдавая по интерфейсам соответствующие потоки данных - наблюдения псевдодальностей и эфемериды спутников. | Эти приемники осуществляют первичную обработку сигналов, выдавая по интерфейсам соответствующие потоки данных - наблюдения псевдодальностей и эфемериды спутников. | ||
Данные от приемника Clonicus, записанные вечером 16 февраля 2021 года, доступны в рабочем репозитории в нескольких форматах. | Данные от приемника Clonicus, записанные вечером 16 февраля 2021 года, доступны в рабочем репозитории в нескольких форматах. | ||
+ | |||
Во-первых, это дамп бинарного потока данных от приемника в формате [https://navis.ru/downloads/SOFT/NV08C_BINR_Protocol_Specification_V13_ENG_10082012.pdf NVS BINR]. | Во-первых, это дамп бинарного потока данных от приемника в формате [https://navis.ru/downloads/SOFT/NV08C_BINR_Protocol_Specification_V13_ENG_10082012.pdf NVS BINR]. | ||
+ | |||
Во-вторых, текстовый файл данных пакета 0xF7, полученный из данного дампа - для тех, кому лень разбираться с бинарным файлом и протоколом. | Во-вторых, текстовый файл данных пакета 0xF7, полученный из данного дампа - для тех, кому лень разбираться с бинарным файлом и протоколом. | ||
Он получен подобным printf'ом: | Он получен подобным printf'ом: |
Версия 21:35, 19 февраля 2021
Дисциплина "Аппаратура потребителей спутниковых радионавигационных систем" входит в вариативную часть общенаучного цикла занятий учебного плана подготовки специалистов по направлению 11.05.01 "Радиоэлектронные системы и комплексы".
Преподается осеннем и весеннем семестрах пятого года обучения. В осеннем семестре лекции и лабораторные занятия (итог - экзамен), в весеннем - курсовой проект.
По дисциплине подготовлен электронный учебно-методический комплекс.
Содержание |
Календарный план
Правила аттестации
Обязательным условием для получения допуска к экзамену является выполнение всех контрольных мероприятий: сдача двух контрольных и защита 4 лабораторных работ.
При написании отчетов следует опираться на правила оформления ГОСТ 7.32 (в части форматирования, оформления рисунков, таблиц, списков и т.д.).
Приемка осуществляется через репозиторий на github на базе проекта gnssrecbasics2020.
Демо модели
Прогноз выходного сигнала коррелятора
Производится обработка сигнала Gps L1 C/A, сформированного лабораторным имитатором сигналов, синхронизированным с приемником. Сигнал перенесен с помощью РЧБ NT1065 на промежуточную частоту МГц и преобразован многоразрядным АЦП с частотой сэмплирования МГц. Установленная на имитаторе мощность обеспечивает уровень отношения сигнал/шум дБГц, где - номер вариант по журналу.
В приемнике производтся корреляционная обработка сигнала, интервал накопления составляет мс.
Сигнал имеет сдвиг частоты несущей Гц, при этом опорный сигнал коррелятора имеет аналогичный сдвиг . Задержка огибающей известна точно и используется в опорном сигнале .
Задание: Построить на плоскости I,Q вид множества точек корреляционных сумм, полученных в ходе большого (сотни) числа экспериментов.
N = 30;
Fd = 99.375e6;
Td = 1/Fd;
T = 0.001;
fif = 8.34e6;
fd = 100 * N;
fd_rep = fd;
phi = 10 * N;
phi_rep = 20 * N;
qcno_dB = 27 + N;
qcno = 10^(qcno_dB/10);
stdn = 50/3;
A = sqrt(qcno * Td) * 2 * stdn; % qcno = A^2 / (4 stdn^2 Td)
fprintf('A = %f, stdn = %f\n', A, stdn);
L = fix(T * Fd);
t = (0:(L-1)) * Td;
PRN_Length = 1023;
PRN = (-1).^(rand(1, PRN_Length) > 0.5);
tau = 100500e-6;
tau_rep = tau;
nchip = mod(fix(PRN_Length*(t - tau )/T), PRN_Length) + 1;
nchip_rep = mod(fix(PRN_Length*(t - tau_rep)/T), PRN_Length) + 1;
Gc = PRN(nchip );
Gc_rep = PRN(nchip_rep);
So = A * Gc .* cos(2*pi*fif*t + 2*pi*fd *t + deg2rad(phi) );
S_rep_cos = Gc_rep .* cos(2*pi*fif*t + 2*pi*fd_rep*t + deg2rad(phi_rep));
S_rep_sin = Gc_rep .* sin(2*pi*fif*t + 2*pi*fd_rep*t + deg2rad(phi_rep));
K = 1000; I = nan(1, K); Q = nan(1,K);
for k = 1:K
n = randn(1,L)*stdn;
Gd = (-1).^(rand(1,1) > 0.5);
S = Gd * So;
y = S + n;
I(k) = y * S_rep_cos';
Q(k) = y * S_rep_sin';
end
maxIQ = 1.1*max(abs(I + 1i*Q));
figure(1);
plot(t*1e3, [y; S; A*Gc]);
xlabel('t, ms')
ylabel('y, S');
grid on
figure(2);
plot(I, Q, '*')
hold on
plot([-maxIQ maxIQ], [0 0], 'k');
plot([0 0], [-maxIQ maxIQ], 'k');
quiver(-maxIQ, 0, 2*maxIQ, 0, 1, 'k');
quiver(0, -maxIQ, 0, 2*maxIQ, 1, 'k');
hold off
xlabel('I')
ylabel('Q');
axis equal
grid on
ЧАП и ФАП на стат эквивалентах
T = 0.010;
Xist = [10;
1];
Xfilt = [0;
0];
Xfilt_FLL = [0;
0];
F = [1 T;
0 1];
Tmod = 10;
K = fix(Tmod / T);
G = [0;
1];
std_ksi = 1.3 * T;
ksi = std_ksi * randn(1, K);
qcno_dB = 45;
qcno = 10^(qcno_dB/10);
stdnIQ = 7;
nI = stdnIQ * randn(1, K);
nQ = stdnIQ * randn(1, K);
A_IQ = sqrt(2*qcno*T) * stdnIQ;
dF_PLL = 20;
Kfilt_PLL = [ 8/3 * dF_PLL * T;
32/9 * dF_PLL^2 * T];
dF_FLL = 3;
Kfilt_FLL = [ 8/3 * dF_FLL * T;
32/9 * dF_FLL^2 * T];
t = (1:K)*T;
phi_ist = nan(1, K);
w_ist = nan(1, K);
phi_filt = nan(1, K);
w_filt = nan(1, K);
phi_filt_FLL = nan(1, K);
w_filt_FLL = nan(1, K);
phi_corr = 0; Iold = 0; Qold = 0;
for k = 1:K
Xist = F * Xist + G * ksi(k);
phi_ist(k) = Xist(1);
w_ist(k) = Xist(2);
% PLL
Xfilt_extr = F*Xfilt;
phi_extr = Xfilt_extr(1);
dPhi = phi_ist(k) - phi_extr;
Q = - A_IQ * sin(dPhi) + nQ(k);
Ud = -Q;
Sd = A_IQ;
Xfilt = Xfilt_extr + Kfilt_PLL * Ud/Sd;
phi_filt(k) = Xfilt(1);
w_filt(k) = Xfilt(2);
% FLL
Xfilt_extr_FLL = F*Xfilt_FLL;
w_extr = Xfilt_extr_FLL(1);
dPhi = phi_ist(k) - phi_corr;
phi_corr = phi_corr + w_extr * T;
dW = w_ist(k) - w_extr;
I = - A_IQ * cos(dPhi) + nI(k);
Q = - A_IQ * sin(dPhi) + nQ(k);
Ud = Q*Iold - I*Qold;
Sd = A_IQ;
Iold = I; Qold = Q;
Xfilt_FLL = Xfilt_extr_FLL + Kfilt_FLL * Ud/Sd;
phi_filt_FLL(k) = phi_corr;
w_filt_FLL(k) = Xfilt_FLL(1);
end
figure(1)
subplot(2,1,1)
plot(t, phi_ist/2/pi, t, phi_filt/2/pi, t, phi_filt_FLL/2/pi)
ylabel('\phi, cycles')
subplot(2,1,2)
plot(t, rad2deg(w_ist), t, rad2deg(w_filt), t, rad2deg(w_filt_FLL))
ylabel('\omega, Hz')
xlabel('t, sec')
Вопросы к экзамену
Экзамен проводится в устной форме и содержит два вопроса (экзаменационные вопросы). При подготовке рекомендуется использовать книги по тематике, конспекты лекций и презентации.
Курсовая работа
Название: Разработка модуля расчёта координат спутника Beidou
Курсовая работа по данной дисциплине выполняется во втором семестре. В рамках проекта студенты знакомятся с рядом инструментов и техник, используемых при разработке АП СРНС, что является главной учебной целью проекта.
Техническая цель - добавление в программное обеспечение приемника функции расчета положения спутника ГЛОНАСС на заданное время по данным его эфемерид.
Для достижения цели выполняется ряд задач:
- обработка данных от приемника, работа со сторонними сервисами для подготовки входных и проверочных данных для разрабатываемого модуля;
- моделирование модуля в Matlab/Python;
- реализация программного модуля на С/С++, включая юнит-тестирование в Check.
Требования к программному модулю:
- отсутствие утечек памяти;
- малое время выполнения;
- низкий расход памяти;
- корректное выполнение при аномальных входных данных.
Курсовая работа разбита на три этапа, отличающиеся осваиваемыми инструментами.
Главные правила игры:
- Взаимодействие осуществляется через github (пул реквесты, комментарии)
- Этап сдан тогда, когда принят пул реквест
Этап 1. Использование сторонних средств
Дедлайн: 03.03.21 (устранение замечаний и итоговый мёрдж до 09.03.21)
Конечная цель всего курсового проекта - получить библиотечные функции на Си++, позволяющие рассчитывать положение спутника Beidou по его эфемеридам. На первом этапе подготовим вспомогательные данные для разработки: эфемериды и оценки положения спутника от сторонних сервисов (чтобы было с чем сравниваться на след. этапах)
На крыше корпуса Е МЭИ установлена трехдиапазонная антенна Harxon HX-CSX601A. Она через 50-метровый кабель, сплиттер, bias-tee и усилитель подключена к трем навигационным приемникам:
- Javad Lexon LGDD,
- SwiftNavigation Piksi Multi,
- Clonicus разработки ЛНС МЭИ.
Эти приемники осуществляют первичную обработку сигналов, выдавая по интерфейсам соответствующие потоки данных - наблюдения псевдодальностей и эфемериды спутников. Данные от приемника Clonicus, записанные вечером 16 февраля 2021 года, доступны в рабочем репозитории в нескольких форматах.
Во-первых, это дамп бинарного потока данных от приемника в формате NVS BINR.
Во-вторых, текстовый файл данных пакета 0xF7, полученный из данного дампа - для тех, кому лень разбираться с бинарным файлом и протоколом. Он получен подобным printf'ом:
pack->SatNum, // 1
pack->bds[0].toe, // 2
pack->bds[0].Crs, // 3
pack->bds[0].Dn, // 4
pack->bds[0].M0, // 5
pack->bds[0].Cuc, // 6
pack->bds[0].e, // 7
pack->bds[0].Cus, // 8
pack->bds[0].sqrtA, // 9
pack->bds[0].Cic, // 10
pack->bds[0].Omega0,// 11
pack->bds[0].Cis, // 12
pack->bds[0].i0, // 13
pack->bds[0].Crc, // 14
pack->bds[0].omega, // 15
pack->bds[0].OmegaDot, // 16
pack->bds[0].iDot, // 17
pack->bds[0].Tgd, // 18
pack->bds[0].toc, // 19
pack->bds[0].af2, // 20
pack->bds[0].af1, // 21
pack->bds[0].af0, // 22
pack->bds[0].URA, // 23
pack->bds[0].IODE, // 24
pack->bds[0].IODC, // 25
pack->bds[0].codeL2,// 26
pack->bds[0].L2P, // 27
pack->bds[0].WN // 28
);
Оформить отчёт по результатам этапа:
- Таблица эфемерид собственного спутника (номер спутника Beidou см. в журнале выше)
- Орбита собственного спутника по данным сервиса CelesTrak (общий вид + положение спутника на 18:00 МСК 16 февраля 2021, так, чтобы было видно подспутниковую точку)
- График угла места собственного спутника от времени по данным Trimble GNSS Planning Online на заданный интервал времени (см. задание второго этапа)
- SkyView по данным Trimble GNSS Planning Online на заданный интервал времени (см. задание второго этапа)
Работа осуществляется в репозитории на github на базе glnephexercise. Для этого:
- Завести, если до сих пор нет, аккаунт на github
- Сделать форк проекта glnephexercise (маленькая кнопка сверху справа в вэб-интерфейсе)
- Установить на рабочем компьютере git (для выполнения последующих этапов удобнее будет сделать это в ОС GNU/Linux, вероятно, на виртуальной машине)
- Клонировать свой форк на рабочий компьютер (
git clone https://github.com/MySuperAccount/glnephexercise.git
) - Промежуточные и итоговые результаты по первому этапу хранить в каталоге processing (
git pull; git add <files>; git commit -m "Сделал то-то то-то"; git push
) - По результатам первого этапа завести Pull Request в исходный проект в ветку, название которой совпадает с вашей фамилией (кнопка наверху в вэб-интерфейсе)
- Устранить все замечания, добиться принятия Pull Request'а.
Этап сдан тогда, когда ваш ПР принят.
Запись бинарного потока от приемника расположена в каталоге logs репозитория. Там файл BINR.bin, записанный днем 10.02.2020.
Этап 2. Моделирование
Дедлайн: 02.04.20 (исправления до 09.04.20, в этот день выставляется КМ-2)
На предыдущем этапе получено решение навигационной задачи с помощью программы вторичной обработки измерений, например, RTKLIB. В процессе работы она рассчитывает положение спутников на соответствующий момент сигнального времени. При этом используются эфемериды - параметры некоторой модели движения спутника. В разных ГНСС эти модели разные, а значит отличается и формат эфемерид, и алгоритмы расчета положения спутника.
Для расчета положения спутника ГЛОНАСС по эфемеридным данным системы проводят численное интегрирование дифференциального уравнения.
Требуется реализовать на языке Matlab или Python функцию расчета положения спутника ГЛОНАСС на заданный момент по шкале времени UTC. В качестве эфемерид использовать данные, полученные на предыдущем этапе.
Построить трехмерные графики множества положений спутника ГЛОНАСС с системным номером, соответствующим номеру студента по списку. Графики в двух вариантах: в СК ECEF ПЗ-90.11 и соответствующей ей инерциальной СК. Положения должны соответствовать временному интервалу с 12:00 10.02.20 до 00:00 10.02.19. Допускается использовать одни и те же эфемериды на весь рассматриваемый интервал.
Построить SkyView за указанный временной интервал (напоминаю, антенна на крыше корпуса Е) и сравнить результат с Trimble GNSS Planning Online, полученный на прошлом этапе.
Оформить отчет по результатам этапа:
- Реализация в Matlab или Python
- Таблица использованных эфемерид
- Трехмерные графики положений спутника в ECEF и ECI (не забудьте подписать оси, изобразите соответствующую Земле сферу в начале СК)
- Расчётный и полученный в GNSS Planing Online SkyView
- Выводы
Работы по данному этапу осуществляются в каталоге simulation. Правила приемки этапа те же.
Этап 3. Реализация
Дедлайн: 07.05.20 (исправления до 14.05.20, выставление КМ-3)
Требуется разработать на языке С/С++ функцию расчета положения спутника ГЛОНАСС на заданное время по шкале UTC, минимизируя время её исполнения и количество затрачиваемой оперативной памяти. Вызов функции не должен приводить к выбросу исключений или утечкам памяти при любом наборе входных данных.
Функция расчета положения спутника в Matlab/Python относительно проста, т.к. доступны библиотеки линейной алгебры и решения уравнений. Но при разработке встраиваемого ПО приходится сохранять лицензионную частоту, минимизировать вычислительную нагрузку и затраты памяти. Поэтому отобразить модель из Matlab/Python в прошивку приемника дословно, как правило, не получается. В рассматриваемом примере потребуется, как минимум, выполнить свою реализацию решения дифура методом Рунге-Кутты.
Программный модуль должен сопровождаться unit-тестами под check:
- Тесты функции реализации метода Рунге-Кутты
- Тест расчетного положения спутника в сравнении с Matlab/Python с шагом 0.1 секунды.
Во время второго теста должно вычисляться и выводиться средняя длительность исполнения функции. Допускается использовать одни и те же эфемериды на весь рассматриваемый интервал (как на предыдущем этапе).
Требуется провести проверку на утечки памяти с помощью утилиты valgrind.
Оформить отчет по результатам курсового проекта. В качестве первых двух глав использовать отчёты с предыдущих этапов, в третьей главе отразить результаты этого этапа:
- Код реализации
- Вывод тестов, включая анализ времени исполнения
- Вывод valgrind
- Вывод по этапу
- Заключение по проекту
В репозитории расположен каркас программного модуля libglnsvpos, представленного в виде подключаемой библиотеки на базе системы сборки CMake. Настроена компиляция статической/динамической библиотек компилятором/кросскомпилятором и выполнение юнит-тестов (проверено в GNU/Linux системах). Для примера в библиотеке реализованы две функции: умножения и сложения.
В функцию сложения add внесена ошибка, на которую указывает результат соответствующего юнит-теста:
korogodin@KorPC:~/glnephexercise/libglnsvpos$ cd build
korogodin@KorPC:~/glnephexercise/libglnsvpos/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
-- libglnsvpos version: cd76a7e
-- 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/glnephexercise/libglnsvpos/build
korogodin@KorPC:~/glnephexercise/libglnsvpos/build$ make
[ 33%] Built target glnsvpos-static
[ 66%] Built target glnsvpos
Scanning dependencies of target test_glnsvpos
[ 77%] Building CXX object test/CMakeFiles/test_glnsvpos.dir/check_position.cpp.o
[ 88%] Linking CXX executable test_glnsvpos
Running unit tests
Running suite(s): My test suite
50%: Checks: 2, Failures: 1, Errors: 0
/home/korogodin/glnephexercise/libglnsvpos/test/check_position.cpp:11:F:Main tests:test_add:0: 1+2 should be 3
test/CMakeFiles/test_glnsvpos.dir/build.make:121: ошибка выполнения рецепта для цели «test/test_glnsvpos»
make[2]: *** [test/test_glnsvpos] Ошибка 1
make[2]: *** Удаляется файл «test/test_glnsvpos»
CMakeFiles/Makefile2:179: ошибка выполнения рецепта для цели «test/CMakeFiles/test_glnsvpos.dir/all»
make[1]: *** [test/CMakeFiles/test_glnsvpos.dir/all] Ошибка 2
Makefile:127: ошибка выполнения рецепта для цели «all»
make: *** [all] Ошибка 2
Работы по данному этапу осуществляются в каталоге libglnsvpos. Правила приемки этапа те же.
Курсовая прошлых лет
А в 2019 году задание выглядело так.