Используйте протокол параметра MAVLink для настройки параметров UAV в MATLAB

Этот пример показывает, как использовать протокол параметра 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 к communincate со станцией наземного управления. Получите информацию 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. ParamValue : Широковещательно передает текущее значение параметра в ответ на вышеупомянутые запросы (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 компонента в сообщение, используйте индексацию (:)=, чтобы убедиться, что assignement не изменяет полевой тип данных 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 к demonstate, как получить доступ к параметрам нашего моделируемого UAV:

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

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

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

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

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, чтобы очистить communcation между системами.

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

disconnect(uavNode);
disconnect(gcsNode);