| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | 
					
						
							|  |  |  | % GTSAM Copyright 2010, Georgia Tech Research Corporation,  | 
					
						
							|  |  |  | % Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  | % All Rights Reserved | 
					
						
							|  |  |  | % Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | %  | 
					
						
							|  |  |  | % See LICENSE for the license information | 
					
						
							|  |  |  | % | 
					
						
							|  |  |  | % @brief A camera flying example through a field of cylinder landmarks | 
					
						
							|  |  |  | % @author Zhaoyang Lv | 
					
						
							|  |  |  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | clear all; | 
					
						
							|  |  |  | clc; | 
					
						
							| 
									
										
										
										
											2015-01-13 12:27:50 +08:00
										 |  |  | clf; | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | import gtsam.* | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | % test or run | 
					
						
							|  |  |  | options.enableTests = false; | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  | %% cylinder options | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | % the number of cylinders in the field | 
					
						
							|  |  |  | options.cylinder.cylinderNum = 15; % pls be smaller than 20 | 
					
						
							|  |  |  | % cylinder size | 
					
						
							|  |  |  | options.cylinder.radius = 3;  % pls be smaller than 5 | 
					
						
							|  |  |  | options.cylinder.height = 10; | 
					
						
							|  |  |  | % point density on cylinder | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  | options.cylinder.pointDensity = 0.1; | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  | %% camera options | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | %   parameters set according to the stereo camera: | 
					
						
							|  |  |  | %   http://www.matrix-vision.com/USB2.0-single-board-camera-mvbluefox-mlc.html | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | % set up monocular camera or stereo camera | 
					
						
							|  |  |  | options.camera.IS_MONO = false; | 
					
						
							|  |  |  | % the field of view of camera | 
					
						
							|  |  |  | options.camera.fov = 120; | 
					
						
							|  |  |  | % fps for image | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  | options.camera.fps = 25; | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | % camera pixel resolution | 
					
						
							|  |  |  | options.camera.resolution = Point2(752, 480); | 
					
						
							|  |  |  | % camera horizon | 
					
						
							|  |  |  | options.camera.horizon = 60; | 
					
						
							|  |  |  | % camera baseline | 
					
						
							|  |  |  | options.camera.baseline = 0.05; | 
					
						
							|  |  |  | % camera focal length | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | options.camera.f = round(options.camera.resolution(1) * options.camera.horizon / ... | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |     options.camera.fov); | 
					
						
							|  |  |  | % camera focal baseline | 
					
						
							|  |  |  | options.camera.fB = options.camera.f * options.camera.baseline; | 
					
						
							|  |  |  | % camera disparity | 
					
						
							|  |  |  | options.camera.disparity = options.camera.fB / options.camera.horizon; | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | % Monocular Camera Calibration | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | options.camera.monoK = Cal3_S2(options.camera.f, options.camera.f, 0, ... | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     options.camera.resolution(1)/2, options.camera.resolution(2)/2); | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | % Stereo Camera Calibration | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | options.camera.stereoK = Cal3_S2Stereo(options.camera.f, options.camera.f, 0, ... | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     options.camera.resolution(1)/2, options.camera.resolution(2)/2, options.camera.disparity); | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | % write video output | 
					
						
							|  |  |  | options.writeVideo = true; | 
					
						
							|  |  |  | % the testing field size (unit: meter) | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | options.fieldSize = Point2(100, 100); | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | % camera flying speed (unit: meter / second) | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | options.speed = 20; | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  | % camera flying height | 
					
						
							|  |  |  | options.height = 30; | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  | %% ploting options | 
					
						
							| 
									
										
										
										
											2015-01-23 09:39:02 +08:00
										 |  |  | % display covariance scaling factor, default to be 1. | 
					
						
							|  |  |  | % The covariance visualization default models 99% of all probablity  | 
					
						
							|  |  |  | options.plot.covarianceScale = 1; | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  | % plot the trajectory covariance | 
					
						
							|  |  |  | options.plot.DISP_TRAJ_COV = true; | 
					
						
							|  |  |  | % plot points covariance | 
					
						
							|  |  |  | options.plot.POINTS_COV = true; | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | %% This is for tests | 
					
						
							|  |  |  | if options.enableTests | 
					
						
							|  |  |  |     % test1: visibility test in monocular camera  | 
					
						
							|  |  |  |     cylinders{1}.centroid = Point3(30, 50, 5); | 
					
						
							|  |  |  |     cylinders{2}.centroid = Point3(50, 50, 5); | 
					
						
							|  |  |  |     cylinders{3}.centroid = Point3(70, 50, 5); | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |     for i = 1:3 | 
					
						
							|  |  |  |         cylinders{i}.radius = 5; | 
					
						
							|  |  |  |         cylinders{i}.height = 10; | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |         cylinders{i}.Points{1} = cylinders{i}.centroid.compose(Point3(-cylinders{i}.radius, 0, 0)); | 
					
						
							|  |  |  |         cylinders{i}.Points{2} = cylinders{i}.centroid.compose(Point3(cylinders{i}.radius, 0, 0)); | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2015-01-14 12:36:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-22 08:42:55 +08:00
										 |  |  |     camera = PinholeCameraCal3_S2.Lookat(Point3(10, 50, 10), ...  | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |         Point3(options.fieldSize.x/2, options.fieldSize.y/2, 0), ... | 
					
						
							|  |  |  |         Point3([0,0,1]'), options.monoK);  | 
					
						
							| 
									
										
										
										
											2015-01-14 12:36:19 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |     pose = camera.pose; | 
					
						
							|  |  |  |     prjMonoResult = cylinderSampleProjection(options.camera.monoK, pose, ... | 
					
						
							|  |  |  |         options.camera.resolution, cylinders); | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |     % test2: visibility test in stereo camera   | 
					
						
							|  |  |  |     prjStereoResult = cylinderSampleProjectionStereo(options.camera.stereoK, ... | 
					
						
							|  |  |  |         pose, options.camera.resolution, cylinders); | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | %% generate a set of cylinders and point samples on cylinders | 
					
						
							|  |  |  | cylinderNum = options.cylinder.cylinderNum; | 
					
						
							|  |  |  | cylinders = cell(cylinderNum, 1); | 
					
						
							|  |  |  | baseCentroid = cell(cylinderNum, 1); | 
					
						
							| 
									
										
										
										
											2015-01-13 14:32:59 +08:00
										 |  |  | theta = 0; | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | i = 1; | 
					
						
							|  |  |  | while i <= cylinderNum | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  |     theta = theta + 2*pi/10; | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     x = 40 * rand * cos(theta) + options.fieldSize(1)/2; | 
					
						
							|  |  |  |     y = 20 * rand * sin(theta) + options.fieldSize(2)/2; | 
					
						
							|  |  |  |     baseCentroid{i} = Point2(x, y); | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     % prevent two cylinders interact with each other | 
					
						
							|  |  |  |     regenerate = false; | 
					
						
							|  |  |  |     for j = 1:i-1 | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |         if i > 1 && norm(baseCentroid{i} - baseCentroid{j}) < options.cylinder.radius * 2 | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |             regenerate = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     if regenerate  | 
					
						
							|  |  |  |        continue; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     cylinders{i,1} = cylinderSampling(baseCentroid{i}, options.cylinder.radius, ... | 
					
						
							|  |  |  |          options.cylinder.height, options.cylinder.pointDensity); | 
					
						
							|  |  |  |     i = i+1; | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-15 12:36:15 +08:00
										 |  |  | %% generate ground truth camera trajectories: a line | 
					
						
							| 
									
										
										
										
											2015-01-14 05:33:47 +08:00
										 |  |  | KMono = Cal3_S2(525,525,0,320,240); | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  | cameraPoses = cell(0); | 
					
						
							| 
									
										
										
										
											2015-01-13 14:32:59 +08:00
										 |  |  | theta = 0; | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  | t = Point3(5, 5, options.height); | 
					
						
							|  |  |  | i = 0; | 
					
						
							|  |  |  | while 1 | 
					
						
							|  |  |  |     i = i+1; | 
					
						
							|  |  |  |     distance = options.speed / options.camera.fps; | 
					
						
							|  |  |  |     angle = 0.1*pi*(rand-0.5); | 
					
						
							|  |  |  |     inc_t = Point3(distance * cos(angle), ... | 
					
						
							|  |  |  |         distance * sin(angle), 0); | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     t = t + inc_t; | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     if t(1) > options.fieldSize(1) - 10 || t(2) > options.fieldSize(2) - 10; | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  |         break; | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     %t = Point3([(i-1)*(options.fieldSize.x - 10)/options.poseNum + 10, ... | 
					
						
							|  |  |  |     %    15, 10]'); | 
					
						
							| 
									
										
										
										
											2020-02-22 08:42:55 +08:00
										 |  |  |     camera = PinholeCameraCal3_S2.Lookat(t, ...  | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |         Point3(options.fieldSize(1)/2, options.fieldSize(2)/2, 0), ... | 
					
						
							|  |  |  |         Point3(0,0,1), options.camera.monoK);     | 
					
						
							| 
									
										
										
										
											2015-01-23 09:25:01 +08:00
										 |  |  |     cameraPoses{end+1} = camera.pose; | 
					
						
							| 
									
										
										
										
											2015-01-12 12:22:42 +08:00
										 |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | %% set up camera and get measurements | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  | if options.camera.IS_MONO  | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  |     % use Monocular Camera | 
					
						
							| 
									
										
										
										
											2015-01-20 05:18:18 +08:00
										 |  |  |     pts2dTracksMono = points2DTrackMonocular(options.camera.monoK, cameraPoses, ... | 
					
						
							|  |  |  |         options.camera.resolution, cylinders); | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | else  | 
					
						
							|  |  |  |     % use Stereo Camera | 
					
						
							| 
									
										
										
										
											2015-01-21 13:14:37 +08:00
										 |  |  |     pts2dTracksStereo = points2DTrackStereo(options.camera.stereoK, ... | 
					
						
							| 
									
										
										
										
											2015-01-20 12:56:04 +08:00
										 |  |  |         cameraPoses, options, cylinders); | 
					
						
							| 
									
										
										
										
											2015-01-14 12:25:44 +08:00
										 |  |  | end | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-09 23:33:53 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-09 23:33:53 +08:00
										 |  |  |   | 
					
						
							| 
									
										
										
										
											2015-01-07 22:56:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 |