mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-07-14 07:30:35 +08:00
d42aebe100
Co-authored-by: Crowdin Bot <support+bot@crowdin.com>
168 lines
12 KiB
Markdown
168 lines
12 KiB
Markdown
# Керування Загальним Приводом
|
||
|
||
Ви можете під'єднати довільне обладнання до невикористаних виводів 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).
|
||
|
||

|
||
|
||
`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`.
|
||
|
||
<!-- PX4 v1.14 bug https://github.com/PX4/PX4-Autopilot/issues/21966 -->
|
||
|
||
## Керування загальним приводом за допомогою 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»:
|
||
|
||

|
||
|
||
- Виберіть заголовок у редакторі маршрутної точки місії, щоб відкрити редактор **Select Mission Command**.
|
||
- Виберіть категорію **Advanced**, а потім пункт **Set actuator** (якщо елемента немає, спробуйте новішу версію _QGroundControl_ або щоденну збірку).
|
||
Це змінить тип елемента місії на «Set actuator».
|
||
|
||
3. Виберіть підключені приводи та встановіть їхні значення (вони нормалізовані між -1 і 1).
|
||
|
||

|
||
|
||
## 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 <mavsdk/mavsdk.h>
|
||
#include <mavsdk/plugins/action/action.h>
|
||
#include <chrono>
|
||
#include <cstdint>
|
||
#include <iostream>
|
||
#include <future>
|
||
|
||
using namespace mavsdk;
|
||
|
||
void usage(const std::string& bin_name)
|
||
{
|
||
std::cerr << "Usage :" << bin_name << " <connection_url> <actuator_index> <actuator_value>\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<std::shared_ptr<System>>{};
|
||
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), який вимикає мотори, але дозволяє приводам рухатися.
|
||
|
||
Це безпечніше, ніж тестування, коли апарат увімкнено.
|
||
|
||
Корисне навантаження камери можна запустити та перевірити в будь-який час.
|