add stereo set up
							parent
							
								
									39f5aa499e
								
							
						
					
					
						commit
						678aabce3e
					
				|  | @ -0,0 +1,90 @@ | |||
| function pts2dTracksStereo = points2DTrackStereo(cameras, imageSize, cylinders) | ||||
| % Assess how accurately we can reconstruct points from a particular monocular camera setup.  | ||||
| % After creation of the factor graph for each track, linearize it around ground truth.  | ||||
| % There is no optimization | ||||
| % @author: Zhaoyang Lv | ||||
| 
 | ||||
| import gtsam.* | ||||
| 
 | ||||
| %% create graph | ||||
| graph = NonlinearFactorGraph; | ||||
| 
 | ||||
| %% create the noise factors | ||||
| pointNoiseSigma = 0.1; | ||||
| poseNoiseSigmas = [0.001 0.001 0.001 0.1 0.1 0.1]'; | ||||
| measurementNoiseSigma = 1.0; | ||||
| posePriorNoise  = noiseModel.Diagonal.Sigmas(poseNoiseSigmas); | ||||
| pointPriorNoise = noiseModel.Isotropic.Sigma(3, pointNoiseSigma); | ||||
| measurementNoise = noiseModel.Isotropic.Sigma(2, measurementNoiseSigma); | ||||
| 
 | ||||
| cameraPosesNum = length(cameras); | ||||
| 
 | ||||
| %% add measurements and initial camera & points values | ||||
| pointsNum = 0; | ||||
| cylinderNum = length(cylinders); | ||||
| for i = 1:cylinderNum | ||||
|     pointsNum = pointsNum + length(cylinders{i}.Points); | ||||
| end | ||||
| 
 | ||||
| pts3d = {}; | ||||
| initialEstimate = Values; | ||||
| initialized = false; | ||||
| for i = 1:cameraPosesNum | ||||
|     % add a constraint on the starting pose     | ||||
|     camera = cameras{i}; | ||||
|      | ||||
|     pts3d.pts{i} = cylinderSampleProjection(camera, imageSize, cylinders); | ||||
|     pts3d.camera{i} = camera; | ||||
|     | ||||
|     if ~initialized | ||||
|         graph.add(PriorFactorPose3(symbol('x', 1), camera.pose, posePriorNoise)); | ||||
|         k = 0; | ||||
|         if ~isempty(pts3d.pts{i}.data{1+k}) | ||||
|             graph.add(PriorFactorPoint3(symbol('p', 1), ... | ||||
|                 pts3d.pts{i}.data{1+k}, pointPriorNoise)); | ||||
|         else | ||||
|             k = k+1; | ||||
|         end | ||||
|         initialized = true; | ||||
|     end | ||||
|      | ||||
|     for j = 1:length(pts3d.pts{i}.Z) | ||||
|         if isempty(pts3d.pts{i}.Z{j}) | ||||
|             continue; | ||||
|         end | ||||
|         graph.add(GenericProjectionFactorCal3_S2(pts3d.pts{i}.Z{j}, ... | ||||
|             measurementNoise, symbol('x', i), symbol('p', j), camera.calibration) );     | ||||
|     end | ||||
| 
 | ||||
| end | ||||
| 
 | ||||
| %% initialize cameras and points close to ground truth  | ||||
| for i = 1:cameraPosesNum | ||||
|     pose_i = camera.pose.retract(0.1*randn(6,1)); | ||||
|     initialEstimate.insert(symbol('x', i), pose_i);     | ||||
| end | ||||
| ptsIdx = 0; | ||||
| for i = 1:length(cylinders) | ||||
|     for j = 1:length(cylinders{i}.Points) | ||||
|         ptsIdx = ptsIdx + 1; | ||||
|         point_j = cylinders{i}.Points{j}.retract(0.1*randn(3,1)); | ||||
|         initialEstimate.insert(symbol('p', ptsIdx), point_j); | ||||
|     end | ||||
| end | ||||
| 
 | ||||
| %% Print the graph | ||||
| graph.print(sprintf('\nFactor graph:\n')); | ||||
| 
 | ||||
| marginals = Marginals(graph, initialEstimate); | ||||
| 
 | ||||
| %% get all the 2d points track information | ||||
| % currently throws the Indeterminant linear system exception | ||||
| ptIdx = 0; | ||||
| for i = 1:pointsNum | ||||
|    if isempty(pts3d.pts{i}) | ||||
|        continue; | ||||
|    end | ||||
|    pts2dTracksMono.cov{ptIdx} = marginals.marginalCovariance(symbol('p',i)); | ||||
| end | ||||
| 
 | ||||
| end | ||||
		Loading…
	
		Reference in New Issue