用MATLAB绘制实时数据
我试图从一个频率为25赫兹的传感器中绘制实时数据。我使用TCPIP协议从传感器读取数据,解析数据,然后绘制数据。但是,绘图部分不是很快,过了一段时间后开始滞后。例如,如果我移动传感器,我会在5秒钟后看到响应。我在Arduino中使用了串行绘图仪(它的规格比我的笔记本电脑小得多),但它能够绘制实时数据,没有任何延迟/问题 我的代码看起来有点像下面的代码用MATLAB绘制实时数据,matlab,real-time-updates,Matlab,Real Time Updates,我试图从一个频率为25赫兹的传感器中绘制实时数据。我使用TCPIP协议从传感器读取数据,解析数据,然后绘制数据。但是,绘图部分不是很快,过了一段时间后开始滞后。例如,如果我移动传感器,我会在5秒钟后看到响应。我在Arduino中使用了串行绘图仪(它的规格比我的笔记本电脑小得多),但它能够绘制实时数据,没有任何延迟/问题 我的代码看起来有点像下面的代码 IMUData = nan(1500,6); InterfaceObject = tcpip('my_ip_address',50001); In
IMUData = nan(1500,6);
InterfaceObject = tcpip('my_ip_address',50001);
InterfaceObject.BytesAvailableFcn ={@PlotSensorData};
PlotSensorData函数如下所示
function PlotSensorData(~,~)
RecievedData = fscanf(InterfaceObject,'%s');
Identifier = RecievedData(6); % 6th byte is the sensor identifier
DataStartIdx = 28; % For each sensor, data start position is common
if Identifier == 'I'
DataEndIdx = DataEndPosition(RecievedData, 1);
SlicedData = RecievedData(DataStartIdx:DataEndIdx);
ParsedData = textscan(SlicedData,'%f', 'Delimiter',',');
% Append new data to IMUData matrices
prevval = IMUData;
val = [prevval(2:end,:); ParsedData{1}'];
IMUData = val;
set(PlotHandle{1},'ydata',val(:,3));
set(TopAxes,'ylim',[-15 15]);
drawnow limitrate;
end
end
另外,我已经尝试了动画线条,而不是使用plot。起初它看起来更快,因为它的绘图速度非常快,但过了一段时间,它也开始滞后,滞后时间超过10秒
所以我的问题是
- 如何在MATLAB中加速实时数据李>
- 此外,我已经尝试在收到一定数量的样本(比如10、20)后绘制数据,而不是在每次收到样本后绘制,但结果仍然滞后,GUI也挂起。我还有其他的策略可以使用吗?在Python中,我使用了多线程,但在这里也可以使用它吗?还是有更好的方法来处理这种数据速率
- 我知道Arduino只运行一个脚本,但是计算机有很多开销,但是当MATLAB挂断时,Arduino怎么能够如此快速地绘制数据呢
感谢您以异步方式读取数据,而不是不断地解决我的问题。您是否分析了您的代码,以检查延迟的是绘图,而不是分配给和来自的不断增长的数组?当
ylim
属性保持不变时,您是否需要始终设置该属性?您好,谢谢您回来。我确实初始化了我的数组。在这种情况下,您不需要,此行通过中间变量val
和prevval
向IMUData
添加新数据:val=[prevval(2:end,:);ParsedData{1}]代码>。您是否使用了探查器,或者至少使用了tic
/toc
来检查瓶颈在哪里?Hi Wolfie profiler在fscanf以及prevval=IMUData和IMUData=val中显示了最多的时间。现在我们正在取得进展-如果是这种情况,那么绘图不会导致您的延迟!请提供一个示例来显示InterfaceObject
的外观,也许您可以做一些比fscanf
更有效的事情。正如我所说,利用预分配可以提高速度,避免你所说的两项任务需要很长时间。将IMUData
初始化为一个NAN数组,但立即扩展它,而不是索引到其中。创建一个计数器(每次迭代递增),并将数据分配到IMUData
的x
行,而不是使用prevval
和val
。