本文主要是介绍第四十一篇,一次matlab与spdlog的合作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
做了一次matlab解析spdlog日志文件并动态绘制行车轨迹的尝试,大获成功。
spdlog的存储,数据头有固定格式如下:
日志类型一个字符+空格+[日期时间]+空格+[日志内容tag]+空格+日志内容
有了固定的格式,做解析就好办了。
(日志内容格式自由,我设计的是多个数据间用英文逗号间隔,解析的时候一个split就行了)
这次解析,日志头是用不到的,所以像吃虾一样把头掐掉,代码如下:
function str = WashData(str)
i=1;
sign2 = 0;
while (i <= length(str))if (str(i) == ']')sign2 = sign2 + 1;endif sign2 == 2str = str(i+2 : length(str));return;endi = i + 1;
end
end
- 从spdlog的格式分析可知,只要找到第二个“]”就算把头找齐了,别的不用管,所以WashData()里前几行是找到第二个“]”的操作;
- 找到之后就可以做字符串截取了,注意还有一个空格别漏了,所以用了i+2;
- 截取完直接return返回即可;
- WashData()的IO接口用了MATLAB的引用技巧,即I和O参数做同样的命名,这样达到c/c++里引用传递的效果,节省空间与操作数;
- 传给WashData()的str是用fgetl()读取的一行日志字符串。
按理应该放上轨迹随时间动态变化的视频,但因为公司的电脑打了水印不方便录屏,就先不放了,脑补一下吧,主要就是用h=plot()画出xy,然后用while或for循环每帧delete(h)再重绘,就做成了动态变化的效果,代码如下,ts_打头的是上面解析出来的数据:
figure;
grid on;
hold on;SampleTime = 0.02;
for i = 1 : 1 : DataCounttitle((i-1)*SampleTime);traj_size = 1 : 1 : ts_TrajSize(i,2);ego_x = ts_EgoX(i, 2);ego_y = ts_EgoY(i, 2);traj_x = ts_points_x(i, 2:ts_TrajSize(i,2)+1);traj_y = ts_points_y(i, 2:ts_TrajSize(i,2)+1);plot_traj = plot(traj_x, traj_y, 'r');plot_ego = plot(ego_x, ego_y, 'r-o');pause(SampleTime);delete(plot_traj);delete(plot_ego);
end
这篇关于第四十一篇,一次matlab与spdlog的合作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!