Визуализация и воспроизведение журнала рейсов MAVLink

В этом примере показано, как загрузить журнал телеметрии (TLOG), содержащий пакеты MAVLink, в MATLAB ®. Детали сообщений извлекаются для графического изображения. Затем, чтобы снова симулировать рейс, сообщения переиздаются через коммуникационный интерфейс MAVLink. Эта публикация имитирует беспилотное летательное транспортное средство (БПЛА), выполняющий рейс, записанный в tlog .

Загрузка MAVLink TLOG

Создайте mavlinkdialect объект с использованием "common.xml" диалект. Использование mavlinktlog с помощью этого диалекта для загрузки данных TLOG.

dialect = mavlinkdialect('common.xml');
logimport = mavlinktlog('mavlink_flightlog.tlog',dialect);

Извлеките GPS-сообщения из TLOG и визуализируйте их с помощью geoplot.

msgs = readmsg(logimport, 'MessageName', 'GPS_RAW_INT', ...
                          'Time',[0 100]);
latlon = msgs.Messages{1};
% filter out zero-valued messages
latlon = latlon(latlon.lat ~= 0 & latlon.lon ~= 0, :);
figure()
geoplot(double(latlon.lat)/1e7, double(latlon.lon)/1e7);

Figure contains an axes. The axes contains an object of type line.

Извлеките сообщения о положении из TLOG. Укажите имя сообщения для сообщений о положении. Постройте график данных крена, тангажа, рыскания с помощью stackedplot.

msgs = readmsg(logimport,'MessageName','ATTITUDE','Time',[0 100]);

figure()
stackedplot(msgs.Messages{1},{'roll','pitch','yaw'});

Figure contains an object of type stackedplot.

Воспроизведение записей журнала MAVLink

Создайте коммуникационный интерфейс MAVLink и опубликуйте сообщения от TLOG в пользовательский порт UDP. Создайте отправителя и приемник для передачи сообщений MAVLink. Эта система связи работает так же, как реальное оборудование будет публиковать сообщения с помощью протоколов связи MAVLink.

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

destinationPort = 14550;
destinationHost = '127.0.0.1';

receiver = mavlinkio(dialect);
connect(receiver,'UDP','LocalPort',destinationPort);

subscriber = mavlinksub(receiver,'ATTITUDE','NewMessageFcn',@(~,msg)disp(msg.Payload));

Отправляйте первые 100 сообщений со скоростью 50 Гц.

payloads = table2struct(msgs.Messages{1});
attitudeDefinition = msginfo(dialect, 'ATTITUDE');
for msgIdx = 1:100
    sendudpmsg(sender,struct('MsgID', attitudeDefinition.MessageID, 'Payload', payloads(msgIdx)),destinationHost,destinationPort);
    pause(1/50);
end

Отсоедините оба интерфейса коммуникации MAVLink.

disconnect(receiver)
disconnect(sender)