这个例子将展示如何将包含MAVLink包的遥测日志(TLOG)加载进MATLAB。提取的详细信息用来绘图。然后再次仿真飞行,这些消息通过MAVLink通信接口重新发布。发布的内容则是模仿无人机执行遥测日志记录的飞行情况。
用common.xml
创建一个对象mavlinkdialect
给到dialect
。使用mavlinktlog
和dialect
用于加载遥测日志的数据。
dialect = mavlinkdialect('common.xml');
logimport = mavlinktlog('mavlink_flightlog.tlog',dialect);
从遥测日志中提取GPS信息和用交会图统计分析(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);
从遥测信息中提取姿态信息。指定姿态信息的信息名称。使用叠加图(stackedplot)绘制横滚、俯仰、偏航数据。
msgs = readmsg(logimport,'MessageName','ATTITUDE','Time',[0 100]);
figure()
stackedplot(msgs.Messages{1},{'roll','pitch','yaw'});
创建MAVLink通信接口,并将来自遥测信息的消息发布到自定义的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));
以50Hz的速率发送前100条消息。
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)