В этом примере показано, как использовать протокол параметров 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), которая прослушивает другой порт 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, описывающие рабочий процесс протокола параметров. Каждый из перечисленных типов сообщений содержит краткое описание выполнения сообщения на основе указанного протокола параметров.
PARAM_REQUET_LIST: Запрашивает все параметры у получателей. Все значения передаются в широковещательном режиме с использованием PARAM_VALUE сообщения.
PARAM_REQUEST_READ: Запрашивает один параметр. Указанное значение параметра передается в широковещательном режиме с использованием PARAM_VALUE сообщение.
PARAM_SET: Команды для установки значения конкретного параметра. После установки значения текущее значение передается в широковещательном режиме с использованием PARAM_VALUE message.
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. Последовательность операций следующая:
Узел GCS отправляет сообщение с темой "PARAM_REQUEST_LIST" к узлу БПЛА, определяющему целевую систему и компонент с использованием uavClient, как определено выше.
Узел БПЛА отправляет все параметры по отдельности в виде "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 © - это приложение, которое используется для управления полетами и планирования задач для любого БПЛА с поддержкой MAVLink. Вы можете использовать QGroundControl в качестве GCS, чтобы продемонстрировать, как получить доступ к параметрам нашего моделируемого БПЛА:
Загрузите и запустите QGroundControl. Определить qgcPort номер 14550, который является портом UDP по умолчанию для приложения QGroundControl.
Создание контрольного сообщения.
Передача контрольного сигнала от узла БПЛА в QGroundControl с помощью MATLAB timer объект. По умолчанию timer объект выполняет TimerFcn каждые 1 секунду. TimerFcn является sendudpmsg вызов, который посылает сообщение контрольного сигнала.
Как только 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 не распознает соединение как известный тип автопилота. Это не влияет на соединение, и значения параметров должны обновляться, как показано на рисунке.
После экспериментов с виджетом параметров QGroundControl остановите heartbeatTimer для прекращения отправки дополнительных сообщений с контрольным сигналом. Удалить heartbeatTimer и paramProtocol объекты. Наконец, отсоедините узлы БПЛА и ГСК для очистки связи между системами.
stop(heartbeatTimer); delete(heartbeatTimer); delete(paramProtocol); disconnect(uavNode); disconnect(gcsNode);