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