86 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Matlab
		
	
	
		
		
			
		
	
	
			86 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Matlab
		
	
	
|  | function [ handles ] = vStep( handles )
 | ||
|  | %VSTEP Summary of this function goes here | ||
|  | %   Detailed explanation goes here | ||
|  | 
 | ||
|  |     %% Add odometry | ||
|  |     handles.newFactors.addOdometry(symbol('x',handles.frame_i-1), symbol('x',handles.frame_i), handles.odometry, handles.odometryNoise); | ||
|  |      | ||
|  |     %% Add visual measurement factors | ||
|  |     for j=1:handles.nPoints | ||
|  |         zij = handles.cameras{handles.frame_i}.project(handles.points{j}); | ||
|  |         handles.newFactors.addMeasurement(zij, handles.measurementNoise, symbol('x',handles.frame_i), symbol('l',j), handles.K); | ||
|  |     end | ||
|  |      | ||
|  |     %% Initial estimates for the new pose. Also initialize points while in the first frame. | ||
|  |     %TODO: this might be suboptimal since "result" is not the fully optimized result | ||
|  |     handles.frame_i | ||
|  |     if (handles.frame_i==2), prevPose = handles.cameras{1}.pose; | ||
|  |     else, prevPose = handles.result.pose(symbol('x',handles.frame_i-1)); end | ||
|  |     handles.initialEstimates.insertPose(symbol('x',handles.frame_i), prevPose.compose(handles.odometry)); | ||
|  |      | ||
|  |     %% Update ISAM | ||
|  |     if handles.BATCH_INIT & (handles.frame_i==2) % Do a full optimize for first two poses | ||
|  |         handles.initialEstimates | ||
|  |         fullyOptimized = handles.newFactors.optimize(handles.initialEstimates) | ||
|  |         handles.initialEstimates = fullyOptimized; | ||
|  |     end | ||
|  | %     figure(1);tic; | ||
|  |     handles.isam.update(handles.newFactors, handles.initialEstimates); | ||
|  | %     t=toc; plot(handles.frame_i,t,'r.'); tic | ||
|  |     handles.result = handles.isam.estimate(); | ||
|  | %     t=toc; plot(handles.frame_i,t,'g.'); | ||
|  |     if handles.ALWAYS_RELINEARIZE % re-linearize | ||
|  |         handles.isam.reorder_relinearize(); | ||
|  |     end | ||
|  |      | ||
|  |     if handles.SAVE_GRAPH | ||
|  |         handles.isam.saveGraph(sprintf('VisualiSAM.dot',handles.frame_i)); | ||
|  |     end | ||
|  |     if handles.PRINT_STATS | ||
|  |         handles.isam.printStats(); | ||
|  |     end | ||
|  |     handles.frame_i | ||
|  |     handles.DRAW_INTERVAL | ||
|  |     if mod(handles.frame_i,handles.DRAW_INTERVAL)==0 | ||
|  |         sprintf('Plotting') | ||
|  |         %% Plot results | ||
|  |         tic | ||
|  | %         h=figure(2);clf | ||
|  | %         set(1,'NumberTitle','off','Name','Visual iSAM'); | ||
|  |         hold on; | ||
|  |         for j=1:handles.nPoints | ||
|  |             P = handles.isam.marginalCovariance(symbol('l',j)); | ||
|  |             point_j = handles.result.point(symbol('l',j)); | ||
|  |             plot3(point_j.x, point_j.y, point_j.z,'marker','o'); | ||
|  |             covarianceEllipse3D([point_j.x;point_j.y;point_j.z],P); | ||
|  |         end | ||
|  |         for ii=1:handles.CAMERA_INTERVAL:handles.frame_i | ||
|  |             P = handles.isam.marginalCovariance(symbol('x',ii)); | ||
|  |             pose_ii = handles.result.pose(symbol('x',ii)); | ||
|  |             plotPose3(pose_ii,P,10); | ||
|  |             if handles.DRAW_TRUE_POSES % show ground truth | ||
|  |                 plotPose3(handles.cameras{ii}.pose,0.001*eye(6),10); | ||
|  |             end | ||
|  |         end | ||
|  |         axis([-40 40 -40 40 -10 20]);axis equal | ||
|  |         view(3) | ||
|  |         colormap('hot') | ||
|  | %         figure(2); | ||
|  |         t=toc; | ||
|  |         if handles.DRAW_INTERVAL~=handles.NCAMERAS, plot(handles.frame_i,t,'b.'); end | ||
|  |         if handles.SAVE_FIGURES | ||
|  |             print(h,'-dpng',sprintf('VisualiSAM%03d.png',handles.frame_i)); | ||
|  |         end | ||
|  |         if handles.SAVE_GRAPHS | ||
|  |             handles.isam.saveGraph(sprintf('VisualiSAM%03d.dot',handles.frame_i)); | ||
|  |         end | ||
|  |         hold off; | ||
|  |     end | ||
|  |      | ||
|  |     %% Reset newFactors and initialEstimates to prepare for the next update | ||
|  |     handles.newFactors = visualSLAMGraph; | ||
|  |     handles.initialEstimates = visualSLAMValues; | ||
|  | 	handles.frame_i = handles.frame_i+1; | ||
|  | end | ||
|  | 
 |