В этом примере показано, как использовать протокол параметра MAVLink в MATLAB и связаться с внешними станциями наземного управления. Демонстрационный протокол параметра предоставлен для отправки обновлений параметра от симулированного беспилотного воздушного транспортного средства (UAV) до станции наземного управления с помощью протоколов связи MAVLink. Вы устанавливаете связь между двумя компонентами MAVLink, UAV и станцией наземного управления. Затем вы отправляете и получаете обновления параметра значений настройки параметров для UAV. Наконец, если вы используете QGroundControl© в качестве станции наземного управления, можно получить эти обновления параметра от QGroundControl и видеть их отраженный в окне программы.
Клиенты MAVLink обмениваются информацией в сети, использующей обычно задаваемые структуры данных в качестве сообщений. Протокол параметра MAVLink используется, чтобы обмениваться параметрами конфигурации между UAV и станцией наземного управления (GCS). Протокол параметра следует за шаблоном клиент-сервер. Например, GCS инициирует запрос в форме сообщений, и UAV отвечает данными.
Сообщения MAVLink заданы в XML-файле. Стандартные сообщения, которые характерны для всех систем, заданы в "common.xml"
файл. Другие специфичные для поставщика сообщения хранятся в отдельных XML-файлах. В данном примере используйте "common.xml"
файл, чтобы установить общий диалект между клиентами MAVLink.
dialect = mavlinkdialect("common.xml");
Этот диалект используется, чтобы создать mavlinkio
объекты, которые могут изучить сообщения в диалекте.
Создайте 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);
Создайте симулированную станцию наземного управления (GCS), которая слушает на различном порте UDP.
gcsNode = mavlinkio(dialect); gcsPort = 14560; connect(gcsNode,"UDP", 'LocalPort', gcsPort);
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, которые описывают рабочий процесс протокола параметра. Каждый перечисленный тип сообщения имеет краткое описание, что сообщение выполняет на основе заданного протокола параметра.
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'
. Эти значения представляют максимальный уровень для списка, подачи и отклонения от курса для UAV в градусах в секунду. В действительные Системы БПЛА, эти уровни могут быть настроены, чтобы настроить производительность для более или менее акробатического управления.
Чтобы считать все параметры из Системы БПЛА, отправьте "PARAM_REQUEST_LIST"
обменивайтесь сообщениями от gcsNode
к uavNode
. Последовательность операций следующие:
Узел GCS отправляет сообщение, темой которого является "PARAM_REQUEST_LIST"
к узлу UAV, задающему целевую систему и компонент с помощью uavClient, как задано выше.
Узел 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© является приложением, которое используется, чтобы выполнить управление полетом и миссию, планирующую любой MAVLink-поддерживающий UAV. Можно использовать QGroundControl в качестве GCS, чтобы продемонстрировать, как получить доступ к параметрам нашего симулированного UAV:
Загрузите и запустите QGroundControl. Задайте qgcPort
номер как 14 550, который является портом UDP по умолчанию для приложения QGroundControl.
Создайте сообщение heartbeat.
Отправьте сообщение heartbeat от узла UAV до QGroundControl с помощью timer
MATLAB объект. По умолчанию,
timer
объект выполняет TimerFcn
каждая 1 секунда. TimerFcn
sendudpmsg
вызовите, который отправляет сообщение heartbeat.
Если 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 не распознает связь известным типом автопилота. Это не влияет на связь, и значения параметров должны все еще обновиться как показано.
После экспериментирования с виджетом параметра QGroundControl остановите heartbeatTimer
прекратить отправлять больше сообщения heartbeat. Удалите heartbeatTimer
и paramProtocol
объекты. Наконец, отключите UAV и узлы GCS, чтобы очистить связь между системами.
stop(heartbeatTimer); delete(heartbeatTimer); delete(paramProtocol); disconnect(uavNode); disconnect(gcsNode);