gtsam/matlab/+gtsam/plotFlyingResults.m

177 lines
4.1 KiB
Matlab
Raw Normal View History

2015-01-21 13:14:37 +08:00
function plotFlyingResults(pts3d, poses, posesCov, cylinders, options)
2015-01-20 05:18:18 +08:00
% plot the visible points on the cylinders and trajectories
2015-01-23 00:24:43 +08:00
%
2015-01-20 05:18:18 +08:00
% author: Zhaoyang Lv
import gtsam.*
2015-01-23 00:24:43 +08:00
figID = 1;
figure(figID);
set(gcf, 'Position', [80,1,1800,1000]);
2015-01-20 05:18:18 +08:00
2015-01-20 12:56:04 +08:00
%% plot all the cylinders and sampled points
2015-01-23 00:24:43 +08:00
axis equal
2020-08-18 02:37:12 +08:00
axis([0, options.fieldSize(1), 0, options.fieldSize(2), 0, options.height + 30]);
2015-01-23 00:24:43 +08:00
xlabel('X (m)');
ylabel('Y (m)');
zlabel('Height (m)');
h = cameratoolbar('Show');
2015-01-23 00:24:43 +08:00
if options.camera.IS_MONO
h_title = title('Quadrotor Flight Simulation with Monocular Camera');
else
h_title = title('Quadrotor Flight Simulation with Stereo Camera');
end
text(100,1750,0, sprintf('Flying Speed: %0.1f\n', options.speed))
2015-01-20 12:56:04 +08:00
view([30, 30]);
hlight = camlight('headlight');
lighting gouraud
2015-01-20 12:56:04 +08:00
2015-01-23 00:24:43 +08:00
if(options.writeVideo)
videoObj = VideoWriter('Camera_Flying_Example.avi');
videoObj.Quality = 100;
videoObj.FrameRate = options.camera.fps;
open(videoObj);
end
2015-01-20 12:56:04 +08:00
sampleDensity = 120;
cylinderNum = length(cylinders);
2015-01-23 00:24:43 +08:00
h_cylinder = cell(cylinderNum);
for i = 1:cylinderNum
hold on
2015-01-20 12:56:04 +08:00
[X,Y,Z] = cylinder(cylinders{i}.radius, sampleDensity * cylinders{i}.radius * cylinders{i}.height);
2020-08-18 02:37:12 +08:00
X = X + cylinders{i}.centroid(1);
Y = Y + cylinders{i}.centroid(2);
2015-01-20 12:56:04 +08:00
Z = Z * cylinders{i}.height;
2015-01-23 00:24:43 +08:00
h_cylinder{i} = surf(X,Y,Z);
set(h_cylinder{i}, 'FaceColor', [0 0 1], 'FaceAlpha', 0.2);
h_cylinder{i}.AmbientStrength = 0.8;
2015-01-21 03:06:39 +08:00
end
2015-01-21 13:14:37 +08:00
%% plot trajectories and points
2015-01-20 12:56:04 +08:00
posesSize = length(poses);
2015-01-21 13:14:37 +08:00
pointSize = length(pts3d);
2015-01-20 12:56:04 +08:00
for i = 1:posesSize
if i > 1
2015-01-23 00:24:43 +08:00
hold on
2015-01-20 12:56:04 +08:00
plot3([poses{i}.x; poses{i-1}.x], [poses{i}.y; poses{i-1}.y], [poses{i}.z; poses{i-1}.z], '-b');
2015-01-20 05:18:18 +08:00
end
2015-01-23 00:24:43 +08:00
if exist('h_pose_cov', 'var')
2015-01-21 13:14:37 +08:00
delete(h_pose_cov);
2015-01-20 12:56:04 +08:00
end
2015-01-23 00:24:43 +08:00
%plotCamera(poses{i}, 3);
gRp = poses{i}.rotation().matrix(); % rotation from pose to global
2020-08-18 02:37:12 +08:00
C = poses{i}.translation();
2015-01-23 00:24:43 +08:00
axisLength = 3;
xAxis = C+gRp(:,1)*axisLength;
L = [C xAxis]';
line(L(:,1),L(:,2),L(:,3),'Color','r');
yAxis = C+gRp(:,2)*axisLength;
L = [C yAxis]';
line(L(:,1),L(:,2),L(:,3),'Color','g');
zAxis = C+gRp(:,3)*axisLength;
L = [C zAxis]';
line(L(:,1),L(:,2),L(:,3),'Color','b');
2015-01-20 12:56:04 +08:00
pPp = posesCov{i}(4:6,4:6); % covariance matrix in pose coordinate frame
gPp = gRp*pPp*gRp'; % convert the covariance matrix to global coordinate frame
h_pose_cov = gtsam.covarianceEllipse3D(C, gPp, options.plot.covarianceScale);
2015-01-21 13:14:37 +08:00
if exist('h_point', 'var')
for j = 1:pointSize
delete(h_point{j});
end
end
if exist('h_point_cov', 'var')
for j = 1:pointSize
delete(h_point_cov{j});
end
end
h_point = cell(pointSize, 1);
h_point_cov = cell(pointSize, 1);
for j = 1:pointSize
if ~isempty(pts3d{j}.cov{i})
2015-01-23 00:24:43 +08:00
hold on
2020-08-18 02:37:12 +08:00
h_point{j} = plot3(pts3d{j}.data(1), pts3d{j}.data(2), pts3d{j}.data(3));
h_point_cov{j} = gtsam.covarianceEllipse3D([pts3d{j}.data(1); pts3d{j}.data(2); pts3d{j}.data(3)], ...
pts3d{j}.cov{i}, options.plot.covarianceScale);
2015-01-21 13:14:37 +08:00
end
end
2015-01-20 12:56:04 +08:00
2015-01-22 05:18:03 +08:00
axis equal
2020-08-18 02:37:12 +08:00
axis([0, options.fieldSize(1), 0, options.fieldSize(2), 0, options.height + 30]);
2015-01-23 00:24:43 +08:00
drawnow
2015-01-21 03:06:39 +08:00
if options.writeVideo
currFrame = getframe(gcf);
writeVideo(videoObj, currFrame);
end
end
2015-01-21 13:14:37 +08:00
if exist('h_pose_cov', 'var')
delete(h_pose_cov);
2015-01-20 05:18:18 +08:00
end
2015-01-21 03:06:39 +08:00
% wait for two seconds
pause(2);
2015-01-23 00:24:43 +08:00
%% change views angle
for i = 30 : i : 90
view([30, i]);
if options.writeVideo
currFrame = getframe(gcf);
writeVideo(videoObj, currFrame);
end
drawnow
2015-01-22 05:18:03 +08:00
end
2015-01-23 00:24:43 +08:00
% changing perspective
%% camera flying through video
camzoom(0.8);
for i = 1 : posesSize
hold on
campos([poses{i}.x, poses{i}.y, poses{i}.z]);
2020-08-18 02:37:12 +08:00
camtarget([options.fieldSize(1)/2, options.fieldSize(2)/2, 0]);
camlight(hlight, 'headlight');
2015-01-23 00:24:43 +08:00
if options.writeVideo
currFrame = getframe(gcf);
writeVideo(videoObj, currFrame);
end
drawnow
end
2015-01-21 13:14:37 +08:00
2015-01-20 12:56:04 +08:00
%%close video
if(options.writeVideo)
close(videoObj);
end
2015-01-20 05:18:18 +08:00
end