Search code examples
matlabreal-time-updates

PLot Realtime data using MATLAB


I am trying to plot real-time data from a sensor that has a frequency of 25 Hz. I read data from the sensor using TCPIP protocol, parse it and then plot the data. However, the plotting part is not very fast and starts to lag after some time. So for e.g. if I move the sensor, I see the response 5 seconds later. I used Serial Plotter in Arduino (which has much less specifications than my laptop) but it is able to plot real-time data without any delays / problems.

My code looks a bit like the following

IMUData = nan(1500,6);
InterfaceObject = tcpip('my_ip_address',50001);
InterfaceObject.BytesAvailableFcn ={@PlotSensorData};

And the PlotSensorData function looks like

    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

Also, instead using plot, I have already tried animatedLine. It seems faster initially as it plots very fast, but after sometime, it starts to lag as well and the lag is more than 10 Sec.

So my questions are

  • What can be done to speed up the real-time data in MATLAB.
  • Also, I have already tried plotting the data after a certain number of samples (say 10, 20) are received instead of plotting after every received sample, but the results are still lagging and the GUI hangs as well. Is there any other strategy that I can use? In Python I used Multi-threading, but can I use it here as well? Or is there a better approach to handle this data rate?
  • I understand that Arduino is only running one script but the computer has a lot of overhead, but how is Arduino able to plot the data so fast while MATLAB just hangs up?

Thanks


Solution

  • Reading Data Asynchronously instead of continuously solved my problem.