Настройка параметров БПЛА с помощью протокола параметра MAVLink

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

Параметрический протокол

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

Setup общего диалекта

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

dialect = mavlinkdialect("common.xml");

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

Setup соединения БПЛА

Создайте 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);

Setup соединения GCS

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

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

Setup клиента и абонента

Setup интерфейса клиента для моделируемого БПЛА для связи с наземной станцией управления. Получите 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" к узлу БПЛА, определяющему целевую систему и компонент с помощью БПЛАКлиент, как определено выше.

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

msg = createmsg(dialect,"PARAM_REQUEST_LIST");

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

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" тема к БПЛАузлу. Задайте индекс параметра 0, который относится к 'MAX_ROLL_RATE' параметр. Это значение индекса запрашивает первое значение параметров.

БПЛА отправляет обновленный параметр как a "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" сообщение от узла GCS к узлу БПЛА. Укажите идентификатор, тип и значение сообщения и отправьте с помощью 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 с помощью timer MATLAB объект. По умолчанию в timer объект выполняет TimerFcn каждые 1 секунду. The TimerFcn является sendudpmsg вызов, который отправляет сообщение пульса.

  4. Когда QGroundControl получает сердцебиение от моделируемого БПЛА, QGroundControl создает виджет панели Parameter для чтения и обновления параметров БПЛА

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 показывает, что он получил сообщение сердцебиения и соединяется с БПЛА. На вкладке Транспортного средства Setup щелкните Другое > Разное, чтобы увидеть, как набор значений параметров отражается в приложении.

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

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

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

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

disconnect(uavNode);
disconnect(gcsNode);