Керування загальним приводом
Ви можете під'єднати довільне обладнання до невикористаних виводів PX4 і керувати ним за допомогою Пристрою дистанційного керування або MAVLink (як окремі команди, так і у місії).
Це корисно, коли вам потрібно використовувати тип корисного навантаження, для якого немає пов’язаної команди MAVLink, або для якого PX4 не має відповідної інтеграції.
INFO
Віддавайте перевагу використанню інтегрованого апаратного забезпечення та команд MAVLink відповідно до конкретного апаратного забезпечення, наприклад для Захватів, замість керування загальним приводом, коли це можливо. Використання інтегрованого обладнання дозволяє оптимізувати планування та поведінку місії, оскільки місія може знати ключові факти про апаратне забезпечення, наприклад, скільки часу потрібно для запуску.
Керування загальним приводом за допомогою MAVLink
MAV_CMD_DO_SET_ACTUATOR може бути використано для встановлення значення для до 6 приводів (одночасно). Цю команду можна використовувати в місіях, створивши елемент місії «Set actuator», або як окрему команду.
Виводи, якими потрібно керувати, вказуються на екрані конфігурації Actuators шляхом призначення функцій від Peripheral via Actuator Set 1
до Peripheral via Actuator Set 6
для бажаних виводів приводу.
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 шляхом призначення функцій від RC AUX 1
до RC AUX 6
потрібним виводам приводу.
Щоб зіставити певний RC канал із функцією виводу RC AUX n
(і, отже, з її призначеним виводом), ви використовуєте параметр RC_MAP_AUXn, який має той самий номер n
.
Наприклад, щоб керувати приводом, приєднаним до AUX контакту 3 (скажімо), ви повинні призначити функцію виводу RC AUX 5
виводу AUX3
. Потім ви можете використовувати RC канал для керування виводом AUX3
за допомогою RC_MAP_AUX5
.
Керування загальним приводом у місіях
Щоб використовувати керування загальним приводом у місії, ви повинні спочатку налаштувати виводи, якими ви хочете керувати за допомогою MAVLink.
Потім у QGroundControl ви можете встановити значення виводів приводу в місії за допомогою елементу місії Set actuator (це додає MAV_CMD_DO_SET_ACTUATOR до завантаженого плану місії).
Важливо зазначити, що при керуванні загальним приводом ані QGroundControl, ані PX4 нічого не знають про апаратне забезпечення, яке запускається. Під час обробки елемента місії PX4 просто встановить виводи відповідно до наданих значень, а потім негайно перейде до наступного елемента місії. Якщо апаратне забезпечення вимагає часу для активації, і вам потрібно зупинитися на поточній точці маршруту, щоб це сталося, тоді вам потрібно буде спланувати місію з додатковими елементами, щоб досягти бажаної поведінки.
INFO
Це одна з причин переваги інтегрованого апаратного забезпечення! Це дозволяє будувати місії в загальному вигляді, з будь-якою поведінкою, що залежить від апаратного забезпечення, або часом, керованим конфігурацією політного стека.
Щоб використовувати загальний привід у місії:
Створіть елемент місії waypoint, де вам потрібна команда приводу.
Змініть елемент місії waypoint на елемент місії «Set actuator»:
- Виберіть заголовок у редакторі маршрутної точки місії, щоб відкрити редактор Select Mission Command.
- Виберіть категорію Advanced, а потім пункт Set actuator (якщо елемента немає, спробуйте новішу версію QGroundControl або щоденну збірку). Це змінить тип елемента місії на «Set actuator».
Виберіть підключені приводи та встановіть їхні значення (вони нормалізовані між -1 і 1).
MAVSDK (приклад скрипту)
Наступний MAVSDK приклад коду показує, як ініціювати випуск корисного навантаження за допомогою методу set_actuator()
плагіну MAVSDK Action.
Значення індексів в set_actuator()
зіставляються з виводами корисного навантаження MAVLink, визначених для вашого планера.
INFO
MAVSDK надсилає MAVLink команду 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, який вимикає мотори, але дозволяє приводам рухатися.
Це безпечніше, ніж тестування, коли апарат увімкнено.
Корисне навантаження камери можна запустити та перевірити в будь-який час.