57 lines
1.6 KiB
Matlab
57 lines
1.6 KiB
Matlab
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% GTSAM Copyright 2010-2013, 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 Monocular VO Example with 5 landmarks and two cameras
|
|
% @author Frank Dellaert
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% import
|
|
import gtsam.*
|
|
|
|
%% Create two cameras and corresponding essential matrix E
|
|
aRb = Rot3.Yaw(pi/2);
|
|
aTb = [.1, 0, 0]';
|
|
identity=Pose3;
|
|
aPb = Pose3(aRb, aTb);
|
|
cameraA = CalibratedCamera(identity);
|
|
cameraB = CalibratedCamera(aPb);
|
|
|
|
%% Create 5 points
|
|
P = { [0, 0, 1]', [-0.1, 0, 1]', [0.1, 0, 1]', [0, 0.5, 0.5]', [0, -0.5, 0.5]' };
|
|
|
|
%% Project points in both cameras
|
|
for i=1:5
|
|
pA{i}= cameraA.project(P{i});
|
|
pB{i}= cameraB.project(P{i});
|
|
end
|
|
|
|
%% We start with a factor graph and add epipolar constraints to it
|
|
% Noise sigma is 1cm, assuming metric measurements
|
|
graph = NonlinearFactorGraph;
|
|
model = noiseModel.Isotropic.Sigma(1,0.01);
|
|
for i=1:5
|
|
graph.add(EssentialMatrixFactor(1, pA{i}, pB{i}, model));
|
|
end
|
|
|
|
%% Create initial estimate
|
|
initial = Values;
|
|
trueE = EssentialMatrix(aRb,Unit3(aTb));
|
|
initialE = trueE.retract([0.1, -0.1, 0.1, 0.1, -0.1]');
|
|
initial.insert(1, initialE);
|
|
|
|
%% Optimize
|
|
parameters = LevenbergMarquardtParams;
|
|
% parameters.setVerbosity('ERROR');
|
|
optimizer = LevenbergMarquardtOptimizer(graph, initial, parameters);
|
|
result = optimizer.optimize();
|
|
|
|
%% Print result (as essentialMatrix) and error
|
|
error = graph.error(result)
|
|
E = result.atEssentialMatrix(1)
|
|
|