# Керування Загальним Приводом Ви можете під'єднати довільне обладнання до невикористаних виводів PX4 і керувати ним за допомогою [Пристрою дистанційного керування](#generic-actuator-control-with-rc) або [MAVLink](#generic-actuator-control-with-mavlink) (як окремі команди, так і у [місії](#generic-actuator-control-in-missions)). Це корисно, коли вам потрібно використовувати тип корисного навантаження, для якого немає пов’язаної команди MAVLink, або для якого PX4 не має відповідної інтеграції. :::info Віддавайте перевагу використанню інтегрованого апаратного забезпечення та команд MAVLink відповідно до конкретного апаратного забезпечення, наприклад для [Захватів](../peripherals/gripper.md), замість керування загальним приводом, коли це можливо. Використання інтегрованого обладнання дозволяє оптимізувати [планування та поведінку місії](../flying/package_delivery_mission.md), оскільки місія може знати ключові факти про апаратне забезпечення, наприклад, скільки часу потрібно для запуску. ::: ## Керування загальним приводом за допомогою MAVLink [MAV_CMD_DO_SET_ACTUATOR](https://mavlink.io/en/messages/common.html#MAV_CMD_DO_SET_ACTUATOR) може бути використано для встановлення значення для до 6 приводів (одночасно). Цю команду можна використовувати в [місіях](#generic-actuator-control-in-missions), створивши елемент місії «Set actuator», або як окрему команду. Виводи, якими потрібно керувати, вказуються на екрані конфігурації [Actuators](../config/actuators.md#actuator-outputs) шляхом призначення функцій від `Peripheral via Actuator Set 1` до `Peripheral via Actuator Set 6` для бажаних [виводів приводу](../config/actuators.md#actuator-outputs). ![Налаштування виводу загального приводу в QGC](../../assets/peripherals/qgc_generic_actuator_output_setting_example.png) `MAV_CMD_DO_SET_ACTUATOR` `param1` до `param6` контролюють виводи, пов'язані `Peripheral via Actuator Set 1` до `Peripheral via Actuator Set 6` відповідно. Наприклад, на зображенні вище, вивід `AUX5` пов'язано з функцією `Peripheral via Actuator Set 1`. Щоб керувати приводом, підключеним до `AUX5`, потрібно встановити значення `MAV_CMD_DO_SET_ACTUATOR.param1`. ## Керування загальним приводом за допомогою RC За допомогою каналів пристрою дистанційного керування можна керувати до 6 PWM чи CAN виводами автопілота. Виводи, якими потрібно керувати, вказуються на екрані конфігурації [Actuators](../config/actuators.md#actuator-outputs) шляхом призначення функцій від `RC AUX 1` до `RC AUX 6` потрібним [виводам приводу](../config/actuators.md#actuator-outputs). Щоб зіставити певний RC канал із функцією виводу `RC AUX n` (і, отже, з її призначеним виводом), ви використовуєте параметр [RC_MAP_AUXn](../advanced_config/parameter_reference.md#RC_MAP_AUX1), який має той самий номер `n`. Наприклад, щоб керувати приводом, приєднаним до AUX контакту 3 (скажімо), ви повинні призначити функцію виводу `RC AUX 5` виводу `AUX3`. Потім ви можете використовувати RC канал для керування виводом `AUX3` за допомогою `RC_MAP_AUX5`. ## Керування загальним приводом у місіях Щоб використовувати керування загальним приводом у місії, ви повинні спочатку [налаштувати виводи, якими ви хочете керувати за допомогою MAVLink](#generic-actuator-control-with-mavlink). Потім у _QGroundControl_ ви можете встановити значення виводів приводу в місії за допомогою елементу місії **Set actuator** (це додає [MAV_CMD_DO_SET_ACTUATOR](https://mavlink.io/en/messages/common.html#MAV_CMD_DO_SET_ACTUATOR) до завантаженого плану місії). Важливо зазначити, що при керуванні загальним приводом ані _QGroundControl_, ані PX4 нічого не знають про апаратне забезпечення, яке запускається. Під час обробки елемента місії PX4 просто встановить виводи відповідно до наданих значень, а потім негайно перейде до наступного елемента місії. Якщо апаратне забезпечення вимагає часу для активації, і вам потрібно зупинитися на поточній точці маршруту, щоб це сталося, тоді вам потрібно буде спланувати місію з додатковими елементами, щоб досягти бажаної поведінки. :::info Це одна з причин переваги інтегрованого апаратного забезпечення! Це дозволяє будувати місії в загальному вигляді, з будь-якою поведінкою, що залежить від апаратного забезпечення, або часом, керованим конфігурацією політного стека. ::: Щоб використовувати загальний привід у місії: 1. Створіть елемент місії waypoint, де вам потрібна команда приводу. 2. Змініть елемент місії waypoint на елемент місії «Set actuator»: ![Елемент місії Set actuator](../../assets/qgc/plan/mission_item_editors/mission_item_select_set_actuator.png) - Виберіть заголовок у редакторі маршрутної точки місії, щоб відкрити редактор **Select Mission Command**. - Виберіть категорію **Advanced**, а потім пункт **Set actuator** (якщо елемента немає, спробуйте новішу версію _QGroundControl_ або щоденну збірку). Це змінить тип елемента місії на «Set actuator». 3. Виберіть підключені приводи та встановіть їхні значення (вони нормалізовані між -1 і 1). ![Елемент місії Set actuator](../../assets/qgc/plan/mission_item_editors/set_actuator.png) ## MAVSDK (приклад скрипту) Наступний [MAVSDK](https://mavsdk.mavlink.io/main/en/index.html) [приклад коду](https://github.com/mavlink/MAVSDK/blob/main/examples/set_actuator/set_actuator.cpp) показує, як ініціювати випуск корисного навантаження за допомогою методу [`set_actuator()`](https://mavsdk.mavlink.io/main/en/cpp/api_reference/classmavsdk_1_1_action.html#classmavsdk_1_1_action_1ad30beac27f05c62dcf6a3d0928b86e4c) плагіну MAVSDK Action. Значення індексів в `set_actuator()` зіставляються з виводами корисного навантаження MAVLink, визначених для вашого планера. :::info MAVSDK надсилає MAVLink команду [MAV_CMD_DO_SET_ACTUATOR](https://mavlink.io/en/messages/common.html#MAV_CMD_DO_SET_ACTUATOR). ::: ```cpp #include #include #include #include #include #include using namespace mavsdk; void usage(const std::string& bin_name) { std::cerr << "Usage :" << bin_name << " \n" << "Connection URL format should be :\n" << " For TCP : tcp://[server_host][:server_port]\n" << " For UDP : udp://[bind_host][:bind_port]\n" << " For Serial : serial:///path/to/serial/dev[:baudrate]\n" << "For example, to connect to the simulator use URL: udp://:14540\n"; } int main(int argc, char** argv) { if (argc != 4) { usage(argv[0]); return 1; } const std::string connection_url = argv[1]; const int index = std::stod(argv[2]); const float value = std::stof(argv[3]); Mavsdk mavsdk; const ConnectionResult connection_result = mavsdk.add_any_connection(connection_url); if (connection_result != ConnectionResult::Success) { std::cerr << "Connection failed: " << connection_result << '\n'; return 1; } std::cout << "Waiting to discover system...\n"; auto prom = std::promise>{}; auto fut = prom.get_future(); // We wait for new systems to be discovered, once we find one that has an // autopilot, we decide to use it. mavsdk.subscribe_on_new_system([&mavsdk, &prom]() { auto system = mavsdk.systems().back(); if (system->has_autopilot()) { std::cout << "Discovered autopilot\n"; // Unsubscribe again as we only want to find one system. mavsdk.subscribe_on_new_system(nullptr); prom.set_value(system); } }); // We usually receive heartbeats at 1Hz, therefore we should find a // system after around 3 seconds max, surely. if (fut.wait_for(std::chrono::seconds(3)) == std::future_status::timeout) { std::cerr << "No autopilot found, exiting.\n"; return 1; } // Get discovered system now. auto system = fut.get(); // Instantiate plugins. auto action = Action{system}; std::cout << "Setting actuator...\n"; const Action::Result set_actuator_result = action.set_actuator(index, value); if (set_actuator_result != Action::Result::Success) { std::cerr << "Setting actuator failed:" << set_actuator_result << '\n'; return 1; } return 0; } ``` ## Тестування Корисні навантаження, які запускаються сервоприводами та іншими приводами, наприклад захватами, можна протестувати в [стані pre-arm](../getting_started/px4_basic_concepts.md#arming-and-disarming), який вимикає мотори, але дозволяє приводам рухатися. Це безпечніше, ніж тестування, коли апарат увімкнено. Корисне навантаження камери можна запустити та перевірити в будь-який час.