| 
									
										
										
										
											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)'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  | 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-22 13:25:06 +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-22 13:25:06 +08:00
										 |  |  |         | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  |     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)], ... | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  |                 pts3d{j}.cov{i}, options.plot.covarianceScale); | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  |     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 09:39:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  | camzoom(0.8); | 
					
						
							| 
									
										
										
										
											2015-01-22 13:25:06 +08:00
										 |  |  | for i = 1 : posesSize | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     hold on | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2015-01-22 13:25:06 +08:00
										 |  |  |     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]); | 
					
						
							| 
									
										
										
										
											2015-01-22 13:25:06 +08:00
										 |  |  |     camlight(hlight, 'headlight'); | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2015-01-23 00:24:43 +08:00
										 |  |  |     if options.writeVideo | 
					
						
							|  |  |  |         currFrame = getframe(gcf); | 
					
						
							|  |  |  |         writeVideo(videoObj, currFrame); | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-01-22 13:25:06 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     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 |