180 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Matlab
		
	
	
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| % 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
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| 
 | |
| 
 | |
| clear all;
 | |
| clc;
 | |
| clf;
 | |
| 
 | |
| import gtsam.*
 | |
| 
 | |
| % test or run
 | |
| options.enableTests = false;
 | |
| 
 | |
| %% cylinder options
 | |
| % 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
 | |
| options.cylinder.pointDensity = 0.1;
 | |
| 
 | |
| %% camera options
 | |
| %   parameters set according to the stereo camera:
 | |
| %   http://www.matrix-vision.com/USB2.0-single-board-camera-mvbluefox-mlc.html
 | |
| 
 | |
| % 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
 | |
| options.camera.fps = 25;
 | |
| % 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
 | |
| options.camera.f = round(options.camera.resolution.x * options.camera.horizon / ...
 | |
|     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;
 | |
| % Monocular Camera Calibration
 | |
| options.camera.monoK = Cal3_S2(options.camera.f, options.camera.f, 0, ...
 | |
|     options.camera.resolution.x/2, options.camera.resolution.y/2);
 | |
| % Stereo Camera Calibration
 | |
| options.camera.stereoK = Cal3_S2Stereo(options.camera.f, options.camera.f, 0, ...
 | |
|     options.camera.resolution.x/2, options.camera.resolution.y/2, options.camera.disparity);
 | |
| 
 | |
| % write video output
 | |
| options.writeVideo = true;
 | |
| % the testing field size (unit: meter)
 | |
| options.fieldSize = Point2([100, 100]');
 | |
| % camera flying speed (unit: meter / second)
 | |
| options.speed = 20;
 | |
| % camera flying height
 | |
| options.height = 30;
 | |
| 
 | |
| %% ploting options
 | |
| % display covariance scaling factor, default to be 1.
 | |
| % The covariance visualization default models 99% of all probablity 
 | |
| options.plot.covarianceScale = 1;
 | |
| % plot the trajectory covariance
 | |
| options.plot.DISP_TRAJ_COV = true;
 | |
| % plot points covariance
 | |
| options.plot.POINTS_COV = true;
 | |
| 
 | |
| %% 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);
 | |
| 
 | |
|     for i = 1:3
 | |
|         cylinders{i}.radius = 5;
 | |
|         cylinders{i}.height = 10;
 | |
| 
 | |
|         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
 | |
| 
 | |
|     camera = SimpleCamera.Lookat(Point3(10, 50, 10), ... 
 | |
|         Point3(options.fieldSize.x/2, options.fieldSize.y/2, 0), ...
 | |
|         Point3([0,0,1]'), options.monoK); 
 | |
| 
 | |
|     pose = camera.pose;
 | |
|     prjMonoResult = cylinderSampleProjection(options.camera.monoK, pose, ...
 | |
|         options.camera.resolution, cylinders);
 | |
| 
 | |
|     % 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);
 | |
| theta = 0;
 | |
| i = 1;
 | |
| while i <= cylinderNum
 | |
|     theta = theta + 2*pi/10;
 | |
|     x = 40 * rand * cos(theta) + options.fieldSize.x/2;
 | |
|     y = 20 * rand * sin(theta) + options.fieldSize.y/2;
 | |
|     baseCentroid{i} = Point2([x, y]');
 | |
|     
 | |
|     % prevent two cylinders interact with each other
 | |
|     regenerate = false;
 | |
|     for j = 1:i-1
 | |
|         if i > 1 && baseCentroid{i}.dist(baseCentroid{j}) < options.cylinder.radius * 2
 | |
|             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;
 | |
| end
 | |
| 
 | |
| %% generate ground truth camera trajectories: a line
 | |
| KMono = Cal3_S2(525,525,0,320,240);
 | |
| cameraPoses = cell(0);
 | |
| theta = 0;
 | |
| 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);
 | |
|     t = t.compose(inc_t);
 | |
|     
 | |
|     if t.x > options.fieldSize.x - 10 || t.y > options.fieldSize.y - 10;
 | |
|         break;
 | |
|     end
 | |
|     
 | |
|     %t = Point3([(i-1)*(options.fieldSize.x - 10)/options.poseNum + 10, ...
 | |
|     %    15, 10]');
 | |
|     camera = SimpleCamera.Lookat(t, ... 
 | |
|         Point3(options.fieldSize.x/2, options.fieldSize.y/2, 0), ...
 | |
|         Point3([0,0,1]'), options.camera.monoK);    
 | |
|     cameraPoses{end+1} = camera.pose;
 | |
| end
 | |
| 
 | |
| %% set up camera and get measurements
 | |
| if options.camera.IS_MONO 
 | |
|     % use Monocular Camera
 | |
|     pts2dTracksMono = points2DTrackMonocular(options.camera.monoK, cameraPoses, ...
 | |
|         options.camera.resolution, cylinders);
 | |
| else 
 | |
|     % use Stereo Camera
 | |
|     pts2dTracksStereo = points2DTrackStereo(options.camera.stereoK, ...
 | |
|         cameraPoses, options, cylinders);
 | |
| end
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
|  
 | |
| 
 | |
| 
 |