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