Skip to content

Відтворення усієї системи

Можливо записувати та відтворювати довільні частини системи на основі повідомлень ORB.

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

Передумови

Перший крок - визначити модуль або модулі, які слід відтворити. Потім визначте всі вхідні дані для цих модулів, тобто підписані теми ORB. Для системного відтворення це включає в себе всі апаратні вхідні дані: сенсори, вхід RC, команди MAVLink та файлову систему.

Всі виявлені теми потрібно реєструвати з повною швидкістю (див. журналювання). Для ekf2 це вже є випадок зі стандартним набором залогованих тем.

Важливо, щоб усі повторені теми містили лише один абсолютний відмітковий час, який є автоматично створеним полем timestamp. Якщо потрібно додати більше відміток часу, вони повинні бути відносно основної відмітки. Наприклад, див. SensorCombined.msg. Причини цього наведено нижче.

Використання

  • Спочатку виберіть файл для відтворення та побудуйте ціль (з каталогу PX4-Autopilot):

    sh
    export 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. Цей файл визначає модулі, які мають право публікувати певні повідомлення. Має наступний формат:

    sh
    restrict_topics: <topic1>, <topic2>, ..., <topicN>
    module: <module>
    ignore_others: <true/false>

    Це означає, що заданий список тем повинен бути опублікований лише за допомогою <module> (яке є ім'ям команди). Публікації з будь-якої з цих тем з іншого модуля мовчки ігноруються. Якщо ignore_others встановлено в true, публікації в інші теми від <module> ігноруються.

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

    sh
    restrict_topics: sensor_combined, vehicle_gps_position, vehicle_land_detected
    module: replay
    ignore_others: true

    З цим модулями, які зазвичай публікують ці теми, не потрібно вимикати для повторення.

  • (Опціонально) Налаштуйте заміщення параметрів (див. інструкції нижче).

  • (Необов'язково) Скопіюйте файл місії dataman з SD-карти в каталог збірки. Це потрібно лише у випадку, якщо місію слід переграти.

  • Почніть відтворення:

    sh
    make px4_sitl_default jmavsim

    Це автоматично відкриє файл журналу, застосує параметри та почне відтворення. Після завершення буде повідомляти про результат і вихід. Новостворений файл журналу можна потім проаналізувати. Це можна знайти в rootfs/fs/microsd/log, у підкаталогах, організованих за датою. Імена файлів журналу повторення матимуть суфікс _replayed.

    Зверніть увагу, що вищезазначена команда також покаже симулятор, але - в залежності від того, що відтворюється - вона не покаже, що насправді відбувається. Ще завжди можна підключитися через QGC та, наприклад, переглянути зміну ставлення під час відтворення.

  • Нарешті, скасуйте змінну середовища, щоб знову використовувалися звичайні цілі збирання:

    sh
    unset replay

Перевизначення параметрів у вихідному журналі

За замовчуванням, під час відтворення застосовуються всі параметри зі стартового файлу журналу. Якщо параметр змінюється під час запису, він буде змінений у відповідний час під час відтворення.

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

  • Фіксовані заміщення параметрів замінять параметри з початку відтворення. Вони визначені у файлі build/px4_sitl_default_replay/rootfs/replay_params.txt, де кожний рядок повинен мати формат <param_name> <value>. Наприклад:

    sh
    EKF2_RNG_NOISE 0.1
  • Заміщення динамічних параметрів оновить значення параметрів у вказані часи. Ці параметри все ще будуть ініціалізовані до значень у журналі або в зафіксованих замінах. Події оновлення параметрів повинні бути визначені у файлі build/px4_sitl_default_replay/rootfs/replay_params_dynamic.txt, де кожний рядок має формат <param_name> <value> <timestamp>. Відмітка часу - це час у секундах з моменту початку журналу. Наприклад:

    sh
    EKF2_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:

    sh
    export replay_mode=ekf2
    export replay=<absolute_path_to_log.ulg>
  • Виконайте відтворення з метою none:

    sh
    make px4_sitl none
  • Після завершення скиньте як replay, так і replay_mode.

    sh
    unset 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.

Обробка часу все ще є відкритою точкою, і її потрібно реалізувати.