Польотні завдання
Польотні завдання використовуються у Режимах польоту для забезпечення певної поведінки під час руху, наприклад "слідуй за мною" або пом'якшування польоту.
Загальний огляд
Польотне завдання є класом в програмному каркасі польотних завдань похідним від базового класу FlightTask. Його мета - генерувати задані значення для контролера з довільних вхідних даних, де кожне завдання реалізує бажану поведінку рухомого засобу для певного режиму. Розробники як правило перевизначаються віртуальні методи activate()
та update()
викликаючи мінімальну реалізацію базового завдання та розширяючи її реалізацією бажаної поведінки. Метод activate()
викликається при перемиканні на завдання та дозволяє ініціалізувати його стан й м'яко перебрати на себе функціонал базуючись на заданих значеннях які попереднє завдання тільки передало.
update()
викликається на кожній ітерації циклу під час виконання і містить реалізацію базової поведінки створення заданих значень.
За загальним правилом, завдання містяться у піддиректорії PX4-Autopilot/src/modules/flight_mode_manager/tasks за назвою завдання, а назви файлів вихідного коду мають префікс "FlightTask".
:::note Відео огляди із зібрань розробників PX4 надано нижче. :::
Створення польотного завдання
Нижченаведені інструкції можуть бути використані для створення завдання MyTask:
Створіть каталог для нової польотної задачі в PX4-Autopilot/src/modules/flight_mode_manager/tasks. За правилами директорія називається за завданням, тому ми назвемо її /MyTask.
shmkdir PX4-Autopilot/src/modules/flight_mode_manager/tasks/MyTask
Створіть порожні файли вихідного коду та налаштування cmake для нового завдання у директорії MyTask використовуючи префікс "FlightTask":
- CMakeLists.txt
- FlightTaskMyTask.hpp
- FlightTaskMyTask.cpp
Оновіть CMakeLists.txt для нового завдання
Скопіюйте вміст CMakeLists.txt з іншого завдання, наприклад, Orbit/CMakeLists.txt
Оновіть відмітку про авторське право до поточного року
cmake############################################################################ # # Copyright (c) 2021 PX4 Development Team. All rights reserved. #
Модифікуйте код щоб він відповідав новому завданню, наприклад замініть
FlightTaskOrbit
наFlightTaskMyTask
. Код буде виглядати приблизно так:cmakepx4_add_library(FlightTaskMyTask FlightTaskMyTask.cpp ) target_link_libraries(FlightTaskMyTask PUBLIC FlightTask) target_include_directories(FlightTaskMyTask PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Оновіть файл заголовків (у цьому випадку FlightTaskMyTask. pp): Більшість завдань повторно реалізує віртуальні методи
activate()
іupdate()
, в цьому прикладі ми також маємо приватну змінну.cpp#pragma once #include "FlightTask.hpp" class FlightTaskMyTask : public FlightTask { public: FlightTaskMyTask() = default; virtual ~FlightTaskMyTask() = default; bool update(); bool activate(const trajectory_setpoint_s &last_setpoint) override; private: float _origin_z{0.f}; };
Оновіть cpp файли відповідно. Цей приклад надає як просту реалізацію FlightTaskMyTask.cpp, яка просто показує, що методи завдань викликаються.
cpp#include "FlightTaskMyTask.hpp" bool FlightTaskMyTask::activate(const trajectory_setpoint_s &last_setpoint) { bool ret = FlightTask::activate(last_setpoint); PX4_INFO("FlightTaskMyTask activate was called! ret: %d", ret); // report if activation was successful return ret; } bool FlightTaskMyTask::update() { PX4_INFO("FlightTaskMyTask update was called!"); // report update return true; }
Додайте нове завдання до списку завдань, які будуть зібрані в PX4-Autopilot/src/modules/flight_mode_manager/CMakeLists.txt:
cmake... if(NOT px4_constrained_flash_build) list(APPEND flight_tasks_all AutoFollowTarget Orbit MyTask ) endif() ...
Оновіть режим польоту, щоб переконатися, що завдання було викликано. Зазвичай для обрання певного польотного завдання використовується параметр.
Наприклад, щоб активувати наше нове завдання
MyTask
в позиційному режимі мультикоптера:Оновіть
MPC_POS_MODE
(multicopter_position_mode_params.), щоб додати варіант для вибору "MyTask", якщо параметр має раніше невикористане значення, наприклад 5:c... * @value 0 Direct velocity * @value 3 Smoothed velocity * @value 4 Acceleration based * @value 5 My task * @group Multicopter Position Control */ PARAM_DEFINE_INT32(MPC_POS_MODE, 5);
Додайте мітку case для нового варіанту в операторі switch для параметра в FlightModeManager.cpp, щоб увімкнути завдання коли
_param_mpc_pos_mode
має відповідне значення.cpp... // manual position control ... switch (_param_mpc_pos_mode.get()) { ... case 3: error = switchTask(FlightTaskIndex::ManualPositionSmoothVel); break; case 5: // Add case for new task: MyTask error = switchTask(FlightTaskIndex::MyTask); break; case 4: .... ...
Перевірка нового польотного завдання
Щоб перевірити польотне завдання треба запустити рухомий засіб з увімкненим завданням. Для прикладу вище це означає встановити параметр MPC_POS_MODE
у 5, злетіти та перемикнути засіб у Режим позиціювання.
:::note Завдання, визначене вище, повинно перевірятися тільки на симуляторі. Код не створює заданих значень, тому засіб не полетить. :::
Зберіть симуляцію SITL (gazebo-classic)
sh
make px4_sitl gazebo-classic
Відкрийте QGroundControl (якщо не відкрито, жодне повідомлення не буде надруковано). В консолі, злетіть та перемкніться у режим позиціювання:
sh
pxh> commander takeoff
pxh> commander mode posctl
Консоль постійно буде показувати: INFO [FlightTaskMyTask] FlightTaskMyTask update was called!
. Якщо ви хочете змінити режим польоту на інший, ви можете ввести команду для зміни режиму, наприклад commander mode altctl
.
Відео
Наступні відео дають огляд польотних завдань в PX4. Перше охоплює стан програмного каркаса для польотних завдань в PX4 v1.9. Друге - це оновлення, яке охоплює зміни в PX4 v1.11.
Огляд архітектури польотних завдань PX4 (PX4 Developer Summit 2019)
Опис того, як працюють режими польоту у PX4 v1.9 (Dennis Mannhart, Matthias Grob).
Огляд управління мультикоптером від датчиків до двигунів (PX4 Developer Summit Virtual 2020)
Відповідний розділ цього відео з оновленою інформацією про польотні завдання в PX4 v11.1 на (9 мін. 20 сек.). Слайди знаходяться тут (PDF), відповідні слайди - 9 та 12.