2017-05-02 1 views
1

に影響されますプロット。プロットが「通常」のときは~35fpsになり、それを縮小すると120fps以上になります。しかし、まったく同じプロット設定を使用しても、ループごとにランダムに生成されたデータをプロットするだけでは、リフレッシュレートはプロットのサイズの影響を受けません。残念ながら、プロファイルビューア(2017a)はプロット内を見ることができず、上記の可変リフレッシュレートが与えられていれば、すべての待ち時間をシリアルポートに帰属させます。 -bonesシリアルコールとレスポンス、Matlabの往復は8ms(〜120fps)です。リアルタイムMatlabのプロットのリフレッシュレートは、私は(シリアルポート経由で受信)MATLABでリアルタイムのデータをプロットしています、と私はリフレッシュレートに影響を与える好奇心旺盛な方法を発見したプロットサイズ

2つのループの例は、同じフレームレートを取得することを意図したものではなく、単にプロットのサイズを変更したとき(ちょうど手動で角をつけて調整するか、positionパラメータを使用する)シリアル)はサイズの影響を大きく受け、2番目の例(ランダム)はサイズの影響を受けません。

追加:

プロットは、タイマーコールバックによって更新され、この修正版で遊んだ後、私は私が(〜170Hz)の高速シリアルリードループをしたり、プロットを更新することができますいずれかのことを見ます高速(約170Hz)。しかし、もう一方は常に苦しんでいます。そして、タイマの周期を繰り返して同じ更新レートを得るようにしても、驚くことではありませんが、以下に示すループとほぼ同じレートです。 Matlabの別のプロセスを呼び出し、2つの間で通信することなく、プロットの更新を別のスレッドに置くことはいいでしょう。

プロットの設定:シリアル用

figure_h = figure(); 
set(figure_h, 'KeyPressFcn', @key_press_function); 
set(figure_h, 'WindowButtonDownFcn', {@click_callback, obj}) 

%some random things that drastically speed up the plotting 
set(figure_h, 'Position', [100, 100, 350, 350]); %the size has a huge effect on performance 
set(figure_h, 'MenuBar', 'none'); 
set(figure_h, 'GraphicsSmoothing', 'Off'); 
set(figure_h, 'DockControls', 'Off'); 
set(figure_h, 'NumberTitle', 'Off'); 
set(figure_h, 'ToolBar', 'none'); 

%create plots 
scatter_h = plot(number_array(:,1)*scale, number_array(:,2)*scale, 'r.'); 
set(scatter_h, 'MarkerSize',8); 
set(scatter_h, 'Clipping','off'); 
hold on 
axis square 
grid on 
ylim([min_value, max_value*scale]); 
xlim([min_value, max_value*scale]); 
set(figure_h.CurrentAxes, 'xtick', [min_value:max_value/10:max_value]); %#ok<NBRAK> 
set(figure_h.CurrentAxes, 'ytick', [min_value:max_value/10:max_value]); %#ok<NBRAK> 
set(figure_h.CurrentAxes, 'XTickLabel',[]); 
set(figure_h.CurrentAxes, 'YTickLabel',[]); 
set(figure_h.CurrentAxes, 'ZTickLabel',[]); 
set(figure_h.CurrentAxes, 'ZGrid', 'off'); 
set(figure_h.CurrentAxes, 'XLimMode', 'manual'); 
set(figure_h.CurrentAxes, 'YLimMode', 'manual'); 
set(figure_h.CurrentAxes, 'ZLimMode', 'manual'); 
set(figure_h.CurrentAxes, 'ALimMode', 'manual'); 
set(figure_h.CurrentAxes, 'CLimMode', 'manual'); 
set(figure_h.CurrentAxes, 'DataAspectRatioMode', 'manual'); 
set(figure_h.CurrentAxes, 'CameraPositionMode', 'manual'); 
set(figure_h.CurrentAxes, 'CameraPosition', [max_value/2,max_value/2,1]); 
set(figure_h.CurrentAxes, 'CameraTargetMode', 'manual'); 
set(figure_h.CurrentAxes, 'CameraTarget', [max_value/2,max_value/2,0]); 
set(figure_h.CurrentAxes, 'CameraUpVectorMode', 'manual'); 
set(figure_h.CurrentAxes, 'CameraUpVector', [0,1,0]); 
set(figure_h.CurrentAxes, 'CameraViewAngleMode', 'manual'); 
set(figure_h.CurrentAxes, 'CameraViewAngle', 180); 
set(figure_h.CurrentAxes, 'GridAlphaMode', 'manual'); 
set(figure_h.CurrentAxes, 'Clipping', 'off'); 
circle_h = line((radius*cos(theta) + center_x)*scale,(radius*sin(theta) + center_y)*scale); 
hold off 

簡体ループ:

while keep_running 

    %must wait for next packet to arrive 
    bytes = obj.bytes_available; 
    while keep_running && (bytes == 0) 
     bytes = obj.bytes_available; //function call actually directly uses the java serial objects for speed   
    end 

    %send request for next packet 
    obj.send_command(obj.cmd_id.cmd_history, true); //sends synchronously, otherwise, with async, an additional wait loop is necessary to prevent an async call if serial is still transmitting (Matlab throws an error otherwise - why they can't be queued, I don't know) 

    %grab the available buffer 
    new_buffer = obj.buffer_available(bytes); 

    %append new characters to running buffer 
    char_buffer = strcat(char_buffer, new_buffer); 

    %process buffer for all arrays 
    while (~isempty(strfind(char_buffer, '[')) && ~isempty(strfind(char_buffer, ']'))) %#ok<STREMP> 

     %extract a number array 
     [number_array, char_buffer] = extract_hex_array(char_buffer,3,2); 

     if ~isempty(number_array) 
      %remove any duplicate points 
      number_array = unique(number_array, 'rows', 'stable'); 

      frames = frames + 1; 

      %update data 
      set(scatter_h, 'xdata', number_array(:,1)*scale, 'ydata', number_array(:,2)*scale); 

      %update header information (after stabilization, and every 10 frames) 
      if frames > 25 && mod(frames, 10) == 0 
       avg_framerate = frames/toc(total_time); 
       set(figure_h, 'Name', strcat('rate: ', num2str(avg_framerate, '%.1f'), ' Hz buffer: ',num2str(length(char_buffer), '%05d'))); 
      end 

      %just a small delay, but not too small the callbacks stop working 
      pause(0.005); 
     end 
    end 
end 

ダミーランダムデータのループ:

start_tic = tic; 
for i=1:200 
    array1 = 4095*rand(82,2); 
    set(scatter_h, 'xdata', array1(:,1), 'ydata', array1(:,2)); 
    pause(0.005); 
end 
end_tic = toc(start_tic); 
fprintf("fps: %f\n", i/end_tic); 
+0

プロパティの設定に関するメモ。特に値が同じ場合に 'set'関数で複数のプロパティを設定することができます: ' set(figure_h.CurrentAxes、{'XLimMode'、 'YLimMode'、 'ZLimMode'、... ' '' ALimMode '、' CLIMMode '、' DataAspectRatioMode '、' CameraPositionMode '、...' '' CameraTargetMode '、' CameraUpVectorMode '、' CameraViewAngleMode '、...' '' GridAlphaMode '}、repmat({' manual '} 、1,11)); ' – Anthony

答えて

0

Mathworks社とのサービスリクエストを提出した後、公式の回答Matlab 2017aとそれ以前はMac上でOpenGLを使用していないということです(たとえ "opengl info"コマンドsaそれはサポートされています)。したがってプロットは、プロットライブラリを修正するまで、Windowsと同じくらい速くmacOS上で実行されることはありません。

関連する問題