exponenta event banner

Настройка параметров БЛА с использованием MAVLink Parameter Protocol

В этом примере показано, как использовать протокол параметров MAVLink в MATLAB и взаимодействовать с внешними наземными станциями управления. Предусмотрен протокол параметров выборки для отправки обновлений параметров с имитационного беспилотного летательного аппарата (БЛА) на наземную станцию управления с использованием протоколов связи MAVLink. Вы устанавливаете связь между двумя компонентами MAVLink, БПЛА и наземной станцией управления. Затем вы отправляете и получаете обновления параметров для настройки значений параметров БПЛА. Наконец, если вы используете QGroundControl © в качестве наземной станции управления, вы можете получить эти обновления параметров из QGroundControl и увидеть их в окне программы.

Протокол параметров

Клиенты MAVLink обмениваются информацией в сети, используя обычно определяемые структуры данных в качестве сообщений. Протокол параметров MAVLink используется для обмена настройками конфигурации между БПЛА и наземной станцией управления (ГСК). Протокол параметров соответствует шаблону клиент-сервер. Например, GCS инициирует запрос в виде сообщений и БПЛА отвечает данными.

Настройка общего диалекта

Сообщения MAVLink определяются в XML-файле. Стандартные сообщения, общие для всех систем, определяются в "common.xml" файл. Другие сообщения поставщика хранятся в отдельных XML-файлах. В этом примере используйте "common.xml" для установки общего диалекта между клиентами MAVLink.

dialect = mavlinkdialect("common.xml");

Этот диалект используется для создания mavlinkio объекты, которые могут понимать сообщения внутри диалекта.

Установка соединения БЛА

Создать mavlinkio объект для представления имитируемого БПЛА. Укажите SystemID, ComponentID, AutoPilotType, и ComponentType параметры как пары имя-значение. В этом примере мы используем универсальный тип автопилота, 'MAV_AUTOPILOT_GENERIC', с квадратурным компонентом, 'MAV_TYPE_QUADROTOR'.

uavNode = mavlinkio(dialect,'SystemID',1,'ComponentID',1, ...
    'AutopilotType',"MAV_AUTOPILOT_GENERIC",'ComponentType',"MAV_TYPE_QUADROTOR");

Имитированный БПЛА прослушивает на порту UDP входящие сообщения. Подключиться к этому порту UDP с помощью uavNode объект.

uavPort = 14750;
connect(uavNode,"UDP",'LocalPort',uavPort);

Настройка соединения GCS

Создайте моделируемую наземную станцию управления (GCS), которая прослушивает другой порт UDP.

gcsNode = mavlinkio(dialect);
gcsPort = 14560;
connect(gcsNode,"UDP", 'LocalPort', gcsPort);

Настройка клиента и подписчика

Настройка клиентского интерфейса для моделируемого БПЛА для связи с наземной станцией управления. Получить LocalClient информацию в виде структуры и указать информацию об идентификаторе системы и компонента для mavlinkclient объект.

clientStruct = uavNode.LocalClient;
uavClient = mavlinkclient(gcsNode,clientStruct.SystemID,clientStruct.ComponentID);

Создать mavlinksub объект для получения сообщений и обработки этих сообщений с помощью обратного вызова. Этот абонент получает сообщения на 'PARAM_VALUE' тема и, в частности, поиск сообщений, соответствующих идентификатору системы и компонента uavClient. Задана функция обратного вызова для отображения полезной нагрузки каждого нового принятого сообщения.

paramValueSub = mavlinksub(gcsNode,uavClient,'PARAM_VALUE','BufferSize',10,...
                            'NewMessageFcn', @(~,msg)disp(msg.Payload));

Операции с параметрами

Теперь, когда вы установили связи между БПЛА и наземной станцией управления. Теперь можно запрашивать и обновлять смоделированную конфигурацию БПЛА с помощью операций, определенных в протоколе параметров, exampleHelperMAVParamProtocol. Существует 4 операции GCS, описывающие рабочий процесс протокола параметров. Каждый из перечисленных типов сообщений содержит краткое описание выполнения сообщения на основе указанного протокола параметров.

  1. PARAM_REQUET_LIST: Запрашивает все параметры у получателей. Все значения передаются в широковещательном режиме с использованием PARAM_VALUE сообщения.

  2. PARAM_REQUEST_READ: Запрашивает один параметр. Указанное значение параметра передается в широковещательном режиме с использованием PARAM_VALUE сообщение.

  3. PARAM_SET: Команды для установки значения конкретного параметра. После установки значения текущее значение передается в широковещательном режиме с использованием PARAM_VALUE message.

  4. PARAM_VALUE: Широковещательная передача текущего значения параметра в ответ на вышеуказанные запросы (PARAM_REQUEST_LIST, PARAM_REQUEST_READ или PARAM_SET).

paramProtocol = exampleHelperMAVParamProtocol(uavNode);

Этот протокол параметров имеет три значения параметров: 'MAX_ROLL_RATE', 'MAX_PITCH_RATE', и 'MAX_YAW_RATE'. Эти значения представляют максимальную скорость для крена, тангажа и рыскания БПЛА в градусах в секунду. В реальных системах БПЛА эти скорости можно настроить на настройку производительности для более или менее акробатического управления.

Прочитать все параметры

Для считывания всех параметров из системы БПЛА отправьте "PARAM_REQUEST_LIST" сообщение от gcsNode кому uavNode. Последовательность операций следующая:

  1. Узел GCS отправляет сообщение с темой "PARAM_REQUEST_LIST" к узлу БПЛА, определяющему целевую систему и компонент с использованием uavClient, как определено выше.

  2. Узел БПЛА отправляет все параметры по отдельности в виде "PARAM_VALUE" сообщения, поскольку у нас есть абонент на узле GCS, который подписан на тему «PARAM _ VALUE», полезная нагрузка сообщения отображается сразу.

msg = createmsg(dialect,"PARAM_REQUEST_LIST");

Присвоение значений для идентификатора системы и компонента в сообщении, использование (:)= индексирование, чтобы назначение не изменяло тип данных поля структуры.

msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

Отправить запрос параметров в БПЛА, который прослушивает порт по IP-адресу локального хоста '127.0.0.1'. Приостановка, чтобы разрешить обработку сообщения. Список параметров отображается в окне команд.

sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort)
pause(1);
    param_value: 90
    param_count: 3
    param_index: 0
       param_id: 'MAX_ROLL_RATE   '
     param_type: 9

    param_value: 90
    param_count: 3
    param_index: 1
       param_id: 'MAX_YAW_RATE    '
     param_type: 9

    param_value: 90
    param_count: 3
    param_index: 2
       param_id: 'MAX_PITCH_RATE  '
     param_type: 9

Чтение одного параметра

Прочитайте один параметр, отправив сообщение "PARAM_REQUEST_READ" сообщение от узла GCS к узлу БПЛА. Отправить сообщение на "PARAM_REQUEST_READ" к узлу UAV. Укажите индекс параметра 0, который ссылается на 'MAX_ROLL_RATE' параметр. Это значение индекса запрашивает первое значение параметра.

БПЛА отправляет обновленный параметр как "PARAM_VALUE" обратно в узел GCS. Потому что мы устанавливаем абонента на "PARAM_VALUE" в узле GCS полезная нагрузка сообщения отображается в окне команд.

msg = createmsg(gcsNode.Dialect,"PARAM_REQUEST_READ");
msg.Payload.param_index(:) = 0;
msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort);
pause(1);
    param_value: 90
    param_count: 3
    param_index: 0
       param_id: 'MAX_ROLL_RATE   '
     param_type: 9

Параметры записи

Чтобы записать параметр, отправьте "PARAM_SET" сообщение от узла ГСК к узлу БПЛА. Укажите идентификатор, тип и значение сообщения и отправьте с помощью gcsNode объект. БПЛА отправляет обновленное значение параметра обратно, и абонент GCS отображает полезные данные сообщения. Это сообщение обновляет максимальную скорость рыскания БПЛА, уменьшая ее до 45 градусов в секунду.

msg = createmsg(gcsNode.Dialect,"PARAM_SET");
msg.Payload.param_id(1:12) = "MAX_YAW_RATE";
msg.Payload.param_type(:) = 9;
msg.Payload.param_value(:) = 45;
msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

sendudpmsg(gcsNode,msg,"127.0.0.1", uavPort);
pause(1);
    param_value: 45
    param_count: 3
    param_index: 2
       param_id: 'MAX_YAW_RATE    '
     param_type: 9

Работа с QGroundControl

QGroundControl © - это приложение, которое используется для управления полетами и планирования задач для любого БПЛА с поддержкой MAVLink. Вы можете использовать QGroundControl в качестве GCS, чтобы продемонстрировать, как получить доступ к параметрам нашего моделируемого БПЛА:

  1. Загрузите и запустите QGroundControl. Определить qgcPort номер 14550, который является портом UDP по умолчанию для приложения QGroundControl.

  2. Создание контрольного сообщения.

  3. Передача контрольного сигнала от узла БПЛА в QGroundControl с помощью MATLAB timer объект. По умолчанию timer объект выполняет TimerFcn каждые 1 секунду. TimerFcn является sendudpmsg вызов, который посылает сообщение контрольного сигнала.

  4. Как только QGroundControl получает контрольный сигнал от имитированного БПЛА, QGroundControl создает виджет панели «Параметры» для чтения и обновления параметров БПЛА.

qgcPort = 14550;
heartbeat = createmsg(dialect,"HEARTBEAT");
heartbeat.Payload.type(:) = enum2num(dialect,'MAV_TYPE',uavNode.LocalClient.ComponentType);
heartbeat.Payload.autopilot(:) = enum2num(dialect,'MAV_AUTOPILOT',uavNode.LocalClient.AutopilotType);
heartbeat.Payload.system_status(:) = enum2num(dialect,'MAV_STATE',"MAV_STATE_STANDBY");

heartbeatTimer = timer;
heartbeatTimer.ExecutionMode = 'fixedRate';
heartbeatTimer.TimerFcn = @(~,~)sendudpmsg(uavNode,heartbeat,'127.0.0.1',qgcPort);
start(heartbeatTimer);

Пока таймер работает, QGroundControl показывает, что он получил сообщение heartbeast и подключен к БПЛА. На вкладке Настройка транспортного средства щелкните Другое > Прочее, чтобы увидеть, как заданные значения параметров отражаются в приложении.

Примечание.Поскольку мы используем универсальный тип автопилота, "MAV_AUTOPILOT_GENERIC"QGroundControl не распознает соединение как известный тип автопилота. Это не влияет на соединение, и значения параметров должны обновляться, как показано на рисунке.

Закрытие соединений MAVLink

После экспериментов с виджетом параметров QGroundControl остановите heartbeatTimer для прекращения отправки дополнительных сообщений с контрольным сигналом. Удалить heartbeatTimer и paramProtocol объекты. Наконец, отсоедините узлы БПЛА и ГСК для очистки связи между системами.

stop(heartbeatTimer);
delete(heartbeatTimer);
delete(paramProtocol);

disconnect(uavNode);
disconnect(gcsNode);