に影響されますプロット。プロットが「通常」のときは~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);
プロパティの設定に関するメモ。特に値が同じ場合に 'set'関数で複数のプロパティを設定することができます: ' set(figure_h.CurrentAxes、{'XLimMode'、 'YLimMode'、 'ZLimMode'、... ' '' ALimMode '、' CLIMMode '、' DataAspectRatioMode '、' CameraPositionMode '、...' '' CameraTargetMode '、' CameraUpVectorMode '、' CameraViewAngleMode '、...' '' GridAlphaMode '}、repmat({' manual '} 、1,11)); ' – Anthony