43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Matlab
		
	
	
function [isam,result,nextPoseIndex] = VisualISAMStep(data,noiseModels,isam,result,truth,nextPoseIndex)
 | 
						|
% VisualISAMStep executes one update step of visualSLAM::iSAM object
 | 
						|
% Authors: Duy Nguyen Ta and Frank Dellaert
 | 
						|
 | 
						|
import gtsam.*
 | 
						|
 | 
						|
% iSAM expects us to give it a new set of factors 
 | 
						|
% along with initial estimates for any new variables introduced.
 | 
						|
newFactors = NonlinearFactorGraph;
 | 
						|
initialEstimates = Values;
 | 
						|
 | 
						|
%% Add odometry
 | 
						|
odometry = data.odometry{nextPoseIndex-1};
 | 
						|
newFactors.add(BetweenFactorPose3(symbol('x',nextPoseIndex-1), symbol('x',nextPoseIndex), odometry, noiseModels.odometry));
 | 
						|
 | 
						|
%% Add visual measurement factors and initializations as necessary
 | 
						|
for k=1:length(data.Z{nextPoseIndex})
 | 
						|
    zij = data.Z{nextPoseIndex}{k};
 | 
						|
    j = data.J{nextPoseIndex}{k};
 | 
						|
    jj = symbol('l', j);
 | 
						|
    newFactors.add(GenericProjectionFactorCal3_S2(zij, noiseModels.measurement, symbol('x',nextPoseIndex), jj, data.K));
 | 
						|
    % TODO: initialize with something other than truth
 | 
						|
    if ~result.exists(jj) && ~initialEstimates.exists(jj)
 | 
						|
        lmInit = truth.points{j};
 | 
						|
        initialEstimates.insert(jj, lmInit);
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
%% Initial estimates for the new pose.
 | 
						|
prevPose = result.atPose3(symbol('x',nextPoseIndex-1));
 | 
						|
initialEstimates.insert(symbol('x',nextPoseIndex), prevPose.compose(odometry));
 | 
						|
 | 
						|
%% Update ISAM
 | 
						|
% figure(1);tic;
 | 
						|
isam.update(newFactors, initialEstimates);
 | 
						|
% t=toc; plot(frame_i,t,'r.'); tic
 | 
						|
result = isam.calculateEstimate();
 | 
						|
% t=toc; plot(frame_i,t,'g.');
 | 
						|
 | 
						|
% Update nextPoseIndex to return
 | 
						|
nextPoseIndex = nextPoseIndex + 1;
 | 
						|
 |