用MATLAB绘制实时数据

用MATLAB绘制实时数据,matlab,real-time-updates,Matlab,Real Time Updates,我试图从一个频率为25赫兹的传感器中绘制实时数据。我使用TCPIP协议从传感器读取数据,解析数据,然后绘制数据。但是,绘图部分不是很快,过了一段时间后开始滞后。例如,如果我移动传感器,我会在5秒钟后看到响应。我在Arduino中使用了串行绘图仪(它的规格比我的笔记本电脑小得多),但它能够绘制实时数据,没有任何延迟/问题 我的代码看起来有点像下面的代码 IMUData = nan(1500,6); InterfaceObject = tcpip('my_ip_address',50001); In

我试图从一个频率为25赫兹的传感器中绘制实时数据。我使用TCPIP协议从传感器读取数据,解析数据,然后绘制数据。但是,绘图部分不是很快,过了一段时间后开始滞后。例如,如果我移动传感器,我会在5秒钟后看到响应。我在Arduino中使用了串行绘图仪(它的规格比我的笔记本电脑小得多),但它能够绘制实时数据,没有任何延迟/问题

我的代码看起来有点像下面的代码

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