Запуск приймача проти експортованого сценарію
Виробник приймачів, який має лабораторний симулятор GNSS, може відтворити через нього рух транспортного засобу зі сценарію Kshana, записати, що робить випробовуваний приймач, і оцінити цей журнал за допомогою kshana receiver-trust щодо подій, заявлених до прогону. Kshana надає рух, часи подій і оцінювання. Вона не записує жодного сигналу: ніщо з експортованого тут не синтезує, не моделює і не передає радіочастотну чи базову форму хвилі, а експортована подія — це позначений часовий інтервал, а не рецепт створення завад. Сигнали забезпечують симулятор і його оператор, а оператор відповідає за запуск їх лише там, де це дозволено (кондуктивно або в екрануванні, за власними інструкціями безпеки симулятора).
Ця сторінка описує метод. Вона не публікує результатів.
1. Експорт#
kshana bench-export scenarios/gnss-ins.toml --out run1 --epoch 2025-03-01T10:00:00Z
Стосується типу gnss-ins (профіль руху з орієнтацією; збої навігаційного стану — це події), а також jamming і gnss-sim (нерухомий приймач протягом тривалості сценарію; джамер сценарію jamming — одна подія протягом прогону). Інші типи пояснюють, чому вони не мають траєкторії транспортного засобу. --epoch — момент UTC нульового часу руху (типово 2024-01-01T00:00:00Z); сценарії не мають власної календарної дати для руху транспортного засобу. Це має бути реальний момент UTC у форматі YYYY-MM-DDTHH:MM:SS (кінцевий Z приймається) з роком від 2000 до 2099 і кожним полем у межах діапазону; усе інше відхиляється. Вихідні дані побайтово ідентичні для того самого сценарію та епохи.
| Файл | Вміст |
|---|---|
run1.motion.csv |
один рядок на відлік: time_s, земні фіксовані x_m,y_m,z_m, vx_m_s,vy_m_s,vz_m_s, геодезичні lat_deg,lon_deg,h_m, heading_deg,pitch_deg,roll_deg, utc, kshana_row |
run1.motion.json |
епоха, системи відліку, одиниці, стовпці та допуски кругового обміну цього CSV |
run1.nmea |
речення NMEA 0183 GGA і RMC на відлік, із контрольними сумами |
run1.waypoints.txt |
рядок RESOLUTION: <ms>, потім рядки longitude,latitude,altitude (записується лише тоді, коли кожен інтервал між відліками дорівнює одному й тому самому цілому числу мілісекунд; якщо його пропущено, команда пояснює причину у стандартному потоці помилок) |
run1.events.csv |
label,kind,onset_s,end_s,description |
run1.events.toml |
ті самі події як блоки [[events]] для сценарію receiver-trust |
run1.conditions.json |
виконання як документ kshana.test-conditions/1 для запису receiver-log: події як заявлена істина, а recording.path, recording.sha256, receiver.*, type кожної події та потужність залишено лабораторії для заповнення |
Системи відліку та умовності#
- Позиція: WGS 84, земна фіксована (ECEF:
xчерез екватор на нульовому меридіані,zчерез полюс);lat_deg,lon_deg,h_mдають ту саму позицію геодезично,h_mнад еліпсоїдом. - Швидкість: земні фіксовані осі, відносно Землі.
- Attitude:
heading_degза годинниковою стрілкою від істинного напряму на північ в [0, 360),pitch_degносом угору додатний,roll_degправим крилом униз додатний; рискання-тангаж-крен (3-2-1) від локальної системи північ-схід-униз до осей корпусу: x уперед, y праворуч, z униз. Нерухоме джерело записує нулі. NMEA і текст шляхових точок не містять орієнтації. - Курс — це рискання корпусу, а не напрям руху. У профілі руху
gnss-insкорпус рискає прямокутними хвилями, тоді як швидкість слідує за рухом, тож курс і шляховий кут можуть відрізнятися на десятки градусів (до близько 77 градусів у вбудованому сценаріїautomotive-urban-canyon). Курс NMEARMC— це шляховий кут, напрям вектора швидкості, тож симулятор, що читає курс із файлу руху, і той, що читає шляховий кут із файлу NMEA, бачать різні кути. Шляховий кут із CSV — цеatan2(v_east, v_north)його швидкості, повернутої до північ-схід-униз. - Висота відповідає сценарію. Для
gnss-insвеличинаh_m— це власне кроковання типу сценарію в дотичній площині за його істинними даними, і вона не є сталою (близько 7 m за 180 s уautomotive-urban-canyon); це рух сценарію, записаний як є. - Заповнювачі NMEA
GGA. Якість розв'язку (1), кількість використаних супутників (12) і HDOP (1,0) записуються лише для того, щоб речення було правильно сформоване. Вони нічого не кажуть про геометрію сценарію чи стан будь-якого приймача. - Time:
time_sпісля епохи, UTC, зміни секунд не моделюються. - Висоти NMEA є еліпсоїдальними. Висота
GGAмістить еліпсоїдальну висоту, а геоїдальне відокремлення записується як 0,0. Симулятор, що розглядає висоту як висоту над середнім рівнем моря, розмістить транспортний засіб із похибкою на місцеву ундуляцію геоїда. - Допуски кругового обміну (перевіряються зчитуванням кожного файлу назад): позиція CSV 0,1 mm, широта і довгота 1e-9 градуса, швидкість 0,1 mm/s, кути 1e-6 градуса; горизонтальна позиція NMEA 5 mm, висота 1 mm, швидкість 0,001 вузла, курс 0,001 градуса.
Завантаження файлів у симулятор#
Лабораторні симулятори різняться, і цей репозиторій не відтворює посібник жодного симулятора. З'ясуйте, які з наведених вище форматів читає ваш, і його заявлені вимоги:
- Багато імпортерів руху очікують фіксовану частоту оновлення, зазвичай 10 Hz. Сценарій
gnss-insкрокує з 0,1 s; для нерухомого сценарію встановіть[time] step_sна частоту, яку хоче ваш симулятор. - Деякі імпортери пропускають відліки, що припадають між цілими секундами, або ігнорують стовпець часу та використовують порядок рядків. Починайте рух із цілої секунди й зберігайте регулярну сітку.
- Імпортер CSV, що дає змогу зіставляти стовпці, може читати
run1.motion.csvбезпосередньо: оберіть земні фіксовані або геодезичні стовпці та задайте їхні одиниці зrun1.motion.json. Відкидання десяткових знаків породжує хибне прискорення, тож зберігайте записану точність. - Файл містить лише рух. Налаштуйте орбітальне угруповання, завади та приймальний тракт у симуляторі й узгодьте їх за часом із подіями в
run1.events.csv.
Kshana не записує жодного інтерфейсу скриптів постачальника.
Перевірено за читачами одного симулятора з відкритим кодом
Читачам руху gps-sdr-sim (MIT, коміт 28ca29a6) надали експорти восьми вбудованих сценаріїв. Кожен читач повернув експортовану траєкторію (tests/testbench_gpssdrsim_oracle.rs, попередньо зареєстровано в xval/testbench-gpssdrsim/PREREGISTRATION.md):
| Параметр gps-sdr-sim | Що йому подати | Найгірша різниця з CSV |
|---|---|---|
-g (NMEA GGA) |
run1.nmea як записано |
1,2 mm |
-x (час, широта, довгота, висота) |
tail -n +2 run1.motion.csv | cut -d, -f1,8,9,10 |
0,15 mm |
-u (час, x, y, z) |
tail -n +2 run1.motion.csv | cut -d, -f1-4 |
точно |
- Не подавайте
-uповний CSV руху. Його читач вміщує 100 символів на рядок, а рядок CSV має близько 160 символів, тож кожен рядок читається як два відліки. Рядок заголовка читається як ще один відлік без жодних чисел. - gps-sdr-sim вміщує щонайбільше 3000 відліків, тобто 300 s за його фіксованої частоти 10 Hz, і ігнорує стовпець часу. Експорти
gnss-insкроковані рівно з 0,1 s. Довші сценарії, як-от 20-хвилиннийgnss-ins-maritime, читаються лише до перших 300 s. - Це перевіряє, що файли читаються так, як записані. Це не перевіряє фізику сценарію чи будь-що, що передає симулятор.
2. Заявіть, що ви оцінюватимете, до прогону#
Файл подій містить інтервали, які визначає сценарій. Скопіюйте run1.events.toml у сценарій receiver-trust, додайте будь-який прогноз, який хочете перевірити, і зафіксуйте пороги моніторів і допуски до запуску приймача. Не коригуйте їх після перегляду журналу; сценарій, пороги та SHA-256 журналу входять у хеш результату.
kind = "receiver-trust"
name = "bench session 1"
[log]
format = "ubx" # ubx, rinex, android or nmea
path = "receiver-log.ubx"
[monitors]
calibration_s = 60.0
# paste run1.events.toml here, and shift onsets by the log offset (step 4)
[[events]]
label = "gnss-denied-1"
kind = "other"
onset_s = 100.0
end_s = 160.0
Експортовані події несуть власний тип сценарію: джамер сценарію jamming — це jamming; збій навігаційного стану — це other, бо сценарій стверджує, що GNSS була недоступна, а не яким способом. Змініть kind відповідно до того, що ви налаштовуєте симулятор робити.
3. Запустіть приймач#
Запустіть приймач і його реєстратор, запустіть сценарій симулятора з файлом руху й нехай прогін охопить інтервал калібрування, кожну подію та запас після останньої. Зберігайте власний журнал приймача (UBX, спостереження RINEX 3, CSV журналу Android або NMEA з реченнями стану супутників). Журнал без потужності сигналу по супутниках усе ще можна оцінити за власною позицією приймача, але монітори відношення несівної до шуму його потребують.
4. Узгодьте годинники#
receiver-trust відлічує часи подій від першої епохи журналу приймача; файл руху відлічує від свого першого відліку. Якщо журнал починається на d секунд раніше за перший відлік руху, додайте d до кожного onset_s і end_s. Запишіть зміщення і спосіб його вимірювання та вкажіть його в name сценарію або в коментарі, бо хибне зміщення зсуває кожну оцінку. Самі часи подій не можуть підказати зміщення; використовуйте маркер початку сценарію симулятора або власні мітки часу приймача.
5. Оцініть#
kshana receiver-trust bench-session.toml
записує bench-session.result.json, .trust.csv і .trust.svg. Для кожної події результат містить хибні тривоги до початку, першу тривогу та її монітори, затримку та підсумок (detected, late, missed, not-evaluable), а також передбачене й спостережене падіння відношення несівної до шуму там, де ви заявили прогноз. Розбіжність повідомляється і ніколи не підганяється. Див. RECEIVER-TRUST.md.
Щоб побачити, які рядки публічних рамок сесія підтримує доказами:
kshana compliance-report bench-session.result.json
Див. compliance/README.md. Цей звіт описує докази в наданих йому прогонах; він не робить жодного висновку про приймач чи будь-яку рамку.
6. З'єднайте круговий обмін в одному підписаному пакеті#
Після оцінювання kshana evidence round-trip зв'язує чотири записи: експортований вами сценарій, умови випробування лабораторії, журнал приймача та оцінку. Заповніть run1.conditions.json (шлях і SHA-256 журналу, випробовуваний приймач, тип і заявлена потужність кожної події), потім:
kshana evidence keygen --out lab.key
kshana evidence round-trip bench-session.toml --scenario scenarios/gnss-ins.toml \
--conditions run1.conditions.json --from 0 --to 180 --key lab.key --out round-trip-pack
kshana evidence verify round-trip-pack --pubkey <signer public key>
round-trip-pack/config.json містить блок round_trip (kshana.round-trip/1) з scenario_sha256, conditions_hash, log_sha256 та оцінкою (виявлені події з тих, що піддаються оцінці, перша тривога), що охоплюється хешами маніфесту і підписом. Команда відхиляє пакет, умови якого й події оцінювання розходяться або заявлений хеш журналу не є хешем журналу. Як і кожен пакет доказів, це технічний запис, а не юридичний висновок.
Робочий приклад: gps-sdr-sim записує файл#
Цей приклад використовує симулятор з відкритим кодом gps-sdr-sim лише для того, щоб записати файл у базовій смузі з експортованого руху. Kshana нічого не передає, і ніщо на цій сторінці не автоматизує відтворення цього файлу через радіо. Якщо ваша лабораторія подає такий файл на приймач, це відповідальність вашого оператора, і робиться це лише там, де це дозволено (кабельно або в екрануванні, за інструкціями безпеки симулятора та самого радіо), а Kshana цього ні документує, ні обгортає.
kshana bench-export scenarios/gnss-ins.toml --out run1 --epoch 2025-03-01T10:00:00Z
tail -n +2 run1.motion.csv | cut -d, -f1-4 > run1.xyz # time, x, y, z (see above)
gps-sdr-sim -e brdc0600.25n -u run1.xyz -b 8 -o run1.iq # writes a file, nothing else
Усе, що лабораторія далі робить із run1.iq, відбувається поза Kshana. Власний журнал приймача, як би його не отримали, — це те, що оцінює крок 5 і з'єднує крок 6. Файли та перевірки, які Kshana виконує над власними експортами, випробувано лише на синтетичних даних (tests/round_trip_pack.rs); жодного лабораторного прогону тут не заявлено.
Чого цей метод не робить#
- Він не створює сигналу і не каже, які завади має генерувати симулятор. Події кажуть, коли, а не що.
- Один сеанс — це одна точка даних. Результат описує цей журнал за цієї конфігурації й нічого не каже про інші приймачі, мікропрограми, антени чи реальні завади.
- Висоти, швидкості та вирівнювання часу оператор перевіряє щодо симулятора; експорт заявляє власні умовності й допуски і не більше.