Відтворення усієї системи
Можливо записувати та відтворювати довільні частини системи на основі повідомлень ORB.
Перегравання корисне для тестування ефекту різних значень параметрів на основі реальних даних, порівняння різних оцінювачів тощо.
Передумови
Перший крок - визначити модуль або модулі, які слід відтворити. Потім визначте всі вхідні дані для цих модулів, тобто підписані теми ORB. Для системного відтворення це включає в себе всі апаратні вхідні дані: сенсори, вхід RC, команди MAVLink та файлову систему.
Всі виявлені теми потрібно реєструвати з повною швидкістю (див. журналювання). Для ekf2
це вже є випадок зі стандартним набором залогованих тем.
Важливо, щоб усі повторені теми містили лише один абсолютний відмітковий час, який є автоматично створеним полем timestamp
. Якщо потрібно додати більше відміток часу, вони повинні бути відносно основної відмітки. Наприклад, див. SensorCombined.msg. Причини цього наведено нижче.
Використання
Спочатку виберіть файл для відтворення та побудуйте ціль (з каталогу PX4-Autopilot):
shexport replay=<absolute_path_to_log_file.ulg> make px4_sitl_default
Це створить вихід збірки/результат у окремому каталозі збірки
build/px4_sitl_default_replay
(щоб параметри не втручалися в звичайні збірки). Можна вибрати будь-яку ціль побудови posix SITL для відтворення, оскільки система побудови знає через змінну середовищаreplay
, що вона знаходиться в режимі відтворення.Додайте правила видавця ORB у файл
build/px4_sitl_default_replay/rootfs/orb_publisher.rules
. Цей файл визначає модулі, які мають право публікувати певні повідомлення. Має наступний формат:shrestrict_topics: <topic1>, <topic2>, ..., <topicN> module: <module> ignore_others: <true/false>
Це означає, що заданий список тем повинен бути опублікований лише за допомогою
<module>
(яке є ім'ям команди). Публікації з будь-якої з цих тем з іншого модуля мовчки ігноруються. Якщоignore_others
встановлено вtrue
, публікації в інші теми від<module>
ігноруються.Для відтворення ми хочемо, щоб модуль
replay
міг публікувати раніше визначений список тем. Отже, для повторенняekf2
файл правил повинен виглядати так:shrestrict_topics: sensor_combined, vehicle_gps_position, vehicle_land_detected module: replay ignore_others: true
З цим модулями, які зазвичай публікують ці теми, не потрібно вимикати для повторення.
(Опціонально) Налаштуйте заміщення параметрів (див. інструкції нижче).
(Необов'язково) Скопіюйте файл місії
dataman
з SD-карти в каталог збірки. Це потрібно лише у випадку, якщо місію слід переграти.Почніть відтворення:
shmake px4_sitl_default jmavsim
Це автоматично відкриє файл журналу, застосує параметри та почне відтворення. Після завершення буде повідомляти про результат і вихід. Новостворений файл журналу можна потім проаналізувати. Це можна знайти в
rootfs/fs/microsd/log
, у підкаталогах, організованих за датою. Імена файлів журналу повторення матимуть суфікс_replayed
.Зверніть увагу, що вищезазначена команда також покаже симулятор, але - в залежності від того, що відтворюється - вона не покаже, що насправді відбувається. Ще завжди можна підключитися через QGC та, наприклад, переглянути зміну ставлення під час відтворення.
Нарешті, скасуйте змінну середовища, щоб знову використовувалися звичайні цілі збирання:
shunset replay
Перевизначення параметрів у вихідному журналі
За замовчуванням, під час відтворення застосовуються всі параметри зі стартового файлу журналу. Якщо параметр змінюється під час запису, він буде змінений у відповідний час під час відтворення.
Параметри можуть бути замінені під час повторного відтворення двома способами: фіксований та динамічний. Коли параметри перевизначаються, відповідні зміни параметрів в журналі не застосовуються під час повторного відтворення.
Фіксовані заміщення параметрів замінять параметри з початку відтворення. Вони визначені у файлі
build/px4_sitl_default_replay/rootfs/replay_params.txt
, де кожний рядок повинен мати формат<param_name> <value>
. Наприклад:shEKF2_RNG_NOISE 0.1
Заміщення динамічних параметрів оновить значення параметрів у вказані часи. Ці параметри все ще будуть ініціалізовані до значень у журналі або в зафіксованих замінах. Події оновлення параметрів повинні бути визначені у файлі
build/px4_sitl_default_replay/rootfs/replay_params_dynamic.txt
, де кожний рядок має формат<param_name> <value> <timestamp>
. Відмітка часу - це час у секундах з моменту початку журналу. Наприклад:shEKF2_RNG_NOISE 0.15 23.4 EKF2_RNG_NOISE 0.05 56.7 EKF2_RNG_DELAY 4.5 30.0
Важливе зауваження
- Під час відтворення всі відключення в журналі звітуються. Вони мають негативний вплив на повторення, тому слід уникати втрат під час запису.
- Наразі можливо лише відтворення в 'реальному часі': так швидко, як було зроблено запис. Це планується розширити у майбутньому.
- Повідомлення з міткою часу 0 буде вважатися недійсним і не буде відтворено.
EKF2 Повтор
Це спеціалізація системного повторення для швидкого відтворення EKF2.
Запис і відтворення журналів польоту з декількома екземплярами EKF не підтримується. Щоб увімкнути запис для відтворення EKF, ви повинні встановити параметри для увімкнення одного екземпляра EKF.
У режимі EKF2 відтворення автоматично створить правила публікації ORB, описані вище.
Для виконання повторення EKF2:
Запишіть оригінальний журнал. Необов'язково встановіть
SDLOG_MODE
на1
, щоб вести журнал з завантаження.Крім змінної середовища
replay
, встановітьreplay_mode
наekf2
:shexport replay_mode=ekf2 export replay=<absolute_path_to_log.ulg>
Виконайте відтворення з метою
none
:shmake px4_sitl none
Після завершення скиньте як
replay
, так іreplay_mode
.shunset replay; unset replay_mode
Налаштування конкретних параметрів EKF2 для відтворення
Спочатку встановіть pyulog
:
sh
pip install --user pyulog
Видобути параметри початкового журналу в replay_params.txt
:
sh
ulog_params -i "$replay" -d ' ' | grep -e '^EKF2' > build/px4_sitl_default_replay/rootfs/replay_params.txt
Настроїть їх за потребою та додайте динамічні заміни параметрів у replay_params_dynamic.txt
, якщо необхідно.
Позаду кадру
Перегравання розділено на 3 компоненти:
- Модуль повторення Вони мають негативний вплив на повторення, тому слід уникати втрат під час запису.
- Наразі можливо лише відтворення в 'реальному часі': так швидко, як було зроблено запис.
Модуль відтворення читає журнал та публікує повідомлення з тією самою швидкістю, з якою вони були записані. До часового позначення кожного повідомлення додається постійний зсув, щоб відповідати поточному часу системи (це причина, чому всі інші часові позначення повинні бути відносними). Команда replay tryapplyparams
виконується перед завантаженням усіх інших модулів та застосовує параметри з журналу та параметри, встановлені користувачем. Потім як остання команда, replay trystart
знову застосує параметри та розпочне фактичне відтворення. Обидва команди нічого не роблять, якщо змінна середовища replay
не встановлена.
Правила видавця ORB дозволяють вибрати, яка частина системи повторюється, як описано вище. Вони компілюються лише для цільових posix SITL.
Обробка часу все ще є відкритою точкою, і її потрібно реалізувати.