You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

325 lines
14 KiB

classdef capture_example < matlab.apps.AppBase
% Properties that correspond to app components
properties (Access = public)
UIFigure matlab.ui.Figure
DepthAX matlab.ui.control.UIAxes
ColorAX matlab.ui.control.UIAxes
AccelAX matlab.ui.control.UIAxes
AccelTextAX matlab.ui.control.UIAxes
GyroAX matlab.ui.control.UIAxes
GyroTextAX matlab.ui.control.UIAxes
StartButton matlab.ui.control.Button
StopButton matlab.ui.control.Button
RsPipeLine realsense.pipeline
RsColorizer realsense.colorizer
end
properties (Access = private, Hidden = true)
tmr % Timer object
SupportDepth % Support Depth Chanel
SupportColor % Support Color Chanel
SupportAccel % Support Accel Chanel
SupportGyro % Support Gyro Chanel
hD % Depth image handle
hC % Color image handle
hA % Accel handles
% hA{1} - Circle Accel.x0y
% hA{2} - Circle Accel.x0z
% hA{3} - Circle Accel.y0z
% hA{4} - Vect Accel.xyz
% hA{5} - String Accel.x
% hA{6} - String Accel.y
% hA{7} - String Accel.z
% hA{8} - String Accel.r
hG % Gyro handles
% hG{1} - Circle Gyro.x0y
% hG{2} - Circle Gyro.x0z
% hG{3} - Circle Gyro.y0z
% hG{4} - Vect Gyro.xyz
% hG{5} - String Gyro.x
% hG{6} - String Gyro.y
% hG{7} - String Gyro.z
% hG{8} - String Gyro.r
dV % Data vectors
% dV{1} - ort line = - 1.15 .. 1.15
% dV{2} - sin(t) , t = 0 .. 2 pi
% dV{3} - cos(t)
% dV{4} - zero = t ; zero(:) = 0;
Period % double ( sec. )
end
methods (Access = private)
function set_motion_data(app,h,d)
x = d(1); y = d(2); z = d(3); R = sqrt(x^2+y^2+z^2);
nx = x/R; ny = y/R; nz = z/R;
zz = app.dV{4}; zz(:) = nz; rr = sqrt(nx^2+ny^2);
xx = rr*app.dV{3}; yy = rr*app.dV{2};
h{1}.XData = xx; h{1}.YData = yy; h{1}.ZData = zz;
xx = app.dV{4}; xx(:) = nx; rr = sqrt(ny^2+nz^2);
yy = rr*app.dV{3}; zz = rr*app.dV{2};
h{3}.XData = xx; h{3}.YData = yy; h{3}.ZData = zz;
yy = app.dV{4}; yy(:) = ny; rr = sqrt(nx^2+nz^2);
xx = rr*app.dV{3}; zz = rr*app.dV{2};
h{2}.XData = xx; h{2}.YData = yy; h{2}.ZData = zz;
h{4}.XData = [0 nx];
h{4}.YData = [0 ny];
h{4}.ZData = [0 nz];
h{5}.String = sprintf('x = %f',x);
h{6}.String = sprintf('y = %f',y);
h{7}.String = sprintf('z = %f',z);
h{8}.String = sprintf('r = %f',R);
end
function h = draw_motion_data(app,ag,at,d,ss)
colorG = [0.1 0.7 0.2];
x = d(1); y = d(2); z = d(3); R = sqrt(x^2+y^2+z^2);
nx = x/R; ny = y/R; nz = z/R;
plot3(ag,app.dV{3},app.dV{2},app.dV{4},'LineStyle','-','Color','b','linewidth',1);
hold(ag,'on');
plot3(ag,app.dV{4},app.dV{3},app.dV{2},'LineStyle','-','Color','r','linewidth',1);
plot3(ag,app.dV{3},app.dV{4},app.dV{2},'LineStyle','-','Color',colorG,'linewidth',1);
zz = app.dV{4}; zz(:) = nz; rr = sqrt(nx^2+ny^2);
xx = rr * app.dV{3}; yy = rr * app.dV{2};
h{1}=plot3(ag,xx,yy,zz,'LineStyle','--','Color','b','linewidth',1);
yy = app.dV{4}; yy(:) = ny; rr = sqrt(nx^2+nz^2);
xx = rr * app.dV{3}; zz = rr * app.dV{2};
h{2}=plot3(ag,xx,yy,zz,'LineStyle','--','Color',colorG,'linewidth',1);
xx = app.dV{4}; xx(:) = nx; rr = sqrt(ny^2+nz^2);
yy = rr * app.dV{3}; zz = rr * app.dV{2};
h{3}=plot3(ag,xx,yy,zz,'LineStyle','--','Color','r','linewidth',1);
xx(:) = 0; yy(:) = 0; zz = app.dV{1};
plot3(ag,xx,yy,zz,'LineStyle','-','Color','b','linewidth',1);
xx(:) = 0; yy(:) = app.dV{1}; zz(:) = 0;
plot3(ag,xx,yy,zz,'LineStyle','-','Color',colorG,'linewidth',1);
xx(:) = app.dV{1}; yy(:) = 0; zz(:) = 0;
plot3(ag,xx,yy,zz,'LineStyle','-','Color','r','linewidth',1);
h{4}=line(ag,[0 nx],[0 ny],[0 nz]); h{4}.Color = 'k';
axis(ag,'off'); hold(ag,'off');
text(at,0.3,0.8,ss,'Color',[0,0,0],'FontSize',14); hold(at,'on');
s=sprintf('x = %f',x);
h{5}=text(at,0.2,0.7,s,'Color','r','FontSize',12);
s=sprintf('y = %f',y);
h{6}=text(at,0.2,0.6,s,'Color',colorG,'FontSize',12);
s=sprintf('z = %f',z);
h{7}=text(at,0.2,0.5,s,'Color','b','FontSize',12);
s=sprintf('r = %f',R);
h{8}=text(at,0.2,0.4,s,'Color','k','FontSize',12);
axis(at,'off'); hold(at,'off');
end
function tmProcess(app,~,~)
RsFrameSet = app.RsPipeLine.wait_for_frames();
if app.SupportDepth ~= 0
df = RsFrameSet.get_depth_frame();
dc = app.RsColorizer.colorize(df);
dd = dc.get_data();
app.hD.CData = permute(reshape(dd',[3,dc.get_width(),dc.get_height()]),[3 2 1]);
end
if app.SupportColor ~= 0
cf = RsFrameSet.get_color_frame();
dd = cf.get_data();
app.hC.CData = permute(reshape(dd',[3,cf.get_width(),cf.get_height()]),[3 2 1]);
end
if app.SupportAccel ~= 0
fa = RsFrameSet.first(realsense.stream.accel);
ma = fa.as('motion_frame');
d = ma.get_motion_data();
app.set_motion_data(app.hA,d);
end
if app.SupportGyro ~= 0
fg = RsFrameSet.first(realsense.stream.gyro);
mg = fg.as('motion_frame');
d = mg.get_motion_data();
app.set_motion_data(app.hG,d);
end
drawnow;
delete(RsFrameSet);
end
function onStartButton(app, ~)
if strcmp(app.tmr.Running, 'off')
app.RsPipeLine.start();
start(app.tmr);
end
end
function onStopButton(app,~)
if strcmp(app.tmr.Running, 'on')
stop(app.tmr);
app.RsPipeLine.stop();
end
end
function UIFigureCloseRequest(app,~)
if strcmp(app.tmr.Running, 'on')
stop(app.tmr);
app.RsPipeLine.stop();
end
delete(app.tmr);
delete(app.RsPipeLine);
delete(app.RsColorizer);
delete(app);
end
function StartUpFunc(app)
RsCtx = realsense.context();
Devs = RsCtx.query_devices();
if ( numel(Devs) < 1 )
error ( 'Not found RealSense device' );
end
RsDev = Devs{1};
cn = RsDev.get_info(realsense.camera_info.name);
delete(RsDev);
delete(RsCtx);
app.UIFigure.Name = sprintf('rs_capture_class < Camera : %s >',cn);
app.RsPipeLine = realsense.pipeline();
app.RsColorizer = realsense.colorizer();
app.RsPipeLine.start();
sProf = app.RsPipeLine.get_active_profile();
Streams = sProf.get_streams();
delete(sProf);
kStreams = numel(Streams);
app.SupportDepth=0;
app.SupportColor=0;
app.SupportAccel=0;
app.SupportGyro=0;
for i=1:kStreams
Stream = Streams{i};
StreamType = Stream.stream_type();
if strcmp(StreamType, 'depth')
app.SupportDepth = 1;
end
if strcmp(StreamType, 'color')
app.SupportColor = 1;
end
if strcmp(StreamType, 'accel')
app.SupportAccel = 1;
end
if strcmp(StreamType, 'gyro')
app.SupportGyro = 1;
end
delete(Stream);
end
RsFrameSet = app.RsPipeLine.wait_for_frames();
if app.SupportDepth ~=0
df = RsFrameSet.get_depth_frame();
dc = app.RsColorizer.colorize(df);
dd = dc.get_data();
d = permute(reshape(dd',[3,dc.get_width(),dc.get_height()]),[3 2 1]);
app.hD = imshow(d,'Parent',app.DepthAX);
else
d = zeros(480,640,3,'uint8'); d(:)=240;
app.hD = imshow(d,'Parent',app.DepthAX);
hold(app.DepthAX,'on');
text(app.DepthAX,140,220,'The <Depth> property is not supported','Color','k','FontSize',16);
hold(app.DepthAX,'off');
end
if app.SupportColor ~= 0
cf = RsFrameSet.get_color_frame();
dd = cf.get_data();
d = permute(reshape(dd',[3,cf.get_width(),cf.get_height()]),[3 2 1]);
app.hC = imshow(d,'Parent',app.ColorAX);
else
d = zeros(480,640,3,'uint8'); d(:)=240;
app.hC = imshow(d,'Parent',app.ColorAX);
hold(app.ColorAX,'on');
text(app.ColorAX,140,220,'The <Color> property is not supported','Color','k','FontSize',16);
hold(app.ColorAX,'off');
end
if app.SupportAccel ~= 0
fa = RsFrameSet.first(realsense.stream.accel);
ma = fa.as('motion_frame');
d = ma.get_motion_data();
app.hA = app.draw_motion_data(app.AccelAX,app.AccelTextAX,d,'Accel');
else
d = [ -0.5, 0.5, sqrt(0.5) ];
app.hA = app.draw_motion_data(app.AccelAX,app.AccelTextAX,d,'Accel');
app.hA{5}.String='-------------';
app.hA{6}.String='-------------';
app.hA{7}.String='-------------';
app.hA{8}.String='not supported';
end
if app.SupportGyro ~= 0
fg = RsFrameSet.first(realsense.stream.gyro);
mg = fg.as('motion_frame');
d = mg.get_motion_data();
app.hG = app.draw_motion_data(app.GyroAX,app.GyroTextAX,d,'Gyro');
else
d = [ 0.5, -0.5, sqrt(0.5) ];
app.hG = app.draw_motion_data(app.GyroAX,app.GyroTextAX,d,'Gyro');
app.hG{5}.String='-------------';
app.hG{6}.String='-------------';
app.hG{7}.String='-------------';
app.hG{8}.String='not supported';
end
app.tmr = timer ...
( ...
'ExecutionMode', 'fixedRate', ... % 'fixedSpacing', ...
'Period',app.Period, ...
'BusyMode', 'queue',... % 'drop', ...
'TimerFcn',@app.tmProcess ...
);
app.RsPipeLine.stop(); %--- STOP ---
drawnow;
delete(RsFrameSet);
end
function createComponents(app)
tVect = 0:pi/60:2*pi;
app.dV{1} = ((0:1/60:2)-1)*1.15;
app.dV{2} = sin(tVect);
app.dV{3} = cos(tVect);
app.dV{4} = tVect; app.dV{4}(:) = 0;
kFramePerSecond = 30; % Number of frames per second
app.Period = double(int64(1000.0/kFramePerSecond+0.5))/1000.0;
app.UIFigure = uifigure('Visible', 'off');
app.UIFigure.Position = [20 20 1310 840];
app.UIFigure.Name = '< Camera : ? >';
app.UIFigure.CloseRequestFcn = createCallbackFcn(app,@UIFigureCloseRequest);
setAutoResize(app,app.UIFigure,false);
app.DepthAX = uiaxes(app.UIFigure);
app.DepthAX.Position = [10 40 640 480];
app.ColorAX = uiaxes(app.UIFigure);
app.ColorAX.Position = [660 40 640 480];
app.AccelAX = uiaxes(app.UIFigure);
app.AccelAX.Position = [30 530 330 300];
app.AccelTextAX = uiaxes(app.UIFigure);
app.AccelTextAX.Position = [390 530 240 300];
app.GyroAX = uiaxes(app.UIFigure);
app.GyroAX.Position = [680 530 330 300];
app.GyroTextAX = uiaxes(app.UIFigure);
app.GyroTextAX.Position = [1040 530 240 300];
app.StartButton = uibutton(app.UIFigure, 'push');
app.StartButton.ButtonPushedFcn = createCallbackFcn(app, @onStartButton, true);
app.StartButton.IconAlignment = 'center';
app.StartButton.Position = [10 10 100 30];
app.StartButton.Text = 'Start';
app.StopButton = uibutton(app.UIFigure, 'push');
app.StopButton.ButtonPushedFcn = createCallbackFcn(app, @onStopButton, true);
app.StopButton.IconAlignment = 'center';
app.StopButton.Position = [120 10 100 30];
app.StopButton.Text = 'Stop';
app.UIFigure.Visible = 'on';
drawnow;
end
end
methods (Access = public)
function app = capture_example
createComponents(app)
registerApp(app, app.UIFigure)
runStartupFcn(app,@StartUpFunc);
if nargout == 0
clear app
end
end
function delete(app)
delete(app.UIFigure)
end
end
end