Настройте параметры UAV Используя протокол параметра MAVLink

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

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

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

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

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

dialect = mavlinkdialect("common.xml");

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

Setup связь UAV

Создайте mavlinkio объект представлять симулированный UAV. Задайте SystemID, ComponentID, AutoPilotType, и ComponentType параметры как пары "имя-значение". В данном примере мы используем типовой тип автопилота, 'MAV_AUTOPILOT_GENERIC', с quadrotor типом компонента, 'MAV_TYPE_QUADROTOR'.

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

Симулированный UAV слушает на порте 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 клиент взаимодействует через интерфейс для симулированного UAV, чтобы связаться со станцией наземного управления. Получите LocalClient информация как структура и задает систему и информацию о ID компонента к mavlinkclient объект.

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

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

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

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

Теперь, когда вы имеете, устанавливают связи между станцией наземного управления и UAV. Можно теперь запросить и обновить симулированные операции использования настройки UAV, заданные в протоколе параметра, 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'. Эти значения представляют максимальный уровень для крена, тангажа и рыскания для UAV в градусах в секунду. В действительные Системы БПЛА, эти уровни могут быть настроены, чтобы настроить эффективность для более или менее акробатического управления.

Считайте все параметры

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

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

  2. Узел UAV отсылает все параметры индивидуально в форме "PARAM_VALUE" сообщения, поскольку у нас есть подписчик на узле GCS, который подписан на тему 'PARAM_VALUE', полезная нагрузка сообщения, отображаются сразу же.

msg = createmsg(dialect,"PARAM_REQUEST_LIST");

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

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

Отправьте запрос параметра к UAV, который слушает на порте в локальном 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 до узла UAV. Отправьте сообщение на "PARAM_REQUEST_READ" тема к UAVnode. Задайте индекс параметра 0, который относится к 'MAX_ROLL_RATE' параметр. Это значение индекса запрашивает первое значение параметров.

UAV отправляет обновленный параметр как "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 до узла UAV. Задайте ID, введите, и значение сообщения и отправьте использование gcsNode объект. UAV передает обновленное значение параметров обратно, и подписчик GCS отображает полезную нагрузку сообщения. Это сообщение обновляет максимальный уровень рыскания UAV путем сокращения его до 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-поддерживающий UAV. Можно использовать QGroundControl в качестве GCS, чтобы продемонстрировать, как получить доступ к параметрам нашего симулированного UAV:

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

  2. Создайте сообщение heartbeat.

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

  4. Если QGroundControl получает heartbeat от симулированного UAV, QGroundControl создает виджет панели Параметра для пользователя, чтобы считать и обновить параметры UAV

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 показывает, что это получило сообщение heartbeat и соединяется с UAV. Во вкладке Vehicle Setup нажмите Other> Misc, чтобы видеть, что набор значений параметров отражается в приложении.

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

Закройте связи MAVLink

После экспериментирования с виджетом параметра QGroundControl остановите heartbeatTimer прекратить отправлять больше сообщения heartbeat. Удалите heartbeatTimer и paramProtocol объекты. Наконец, отключите UAV и узлы GCS, чтобы очистить связь между системами.

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

disconnect(uavNode);
disconnect(gcsNode);