78 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Matlab
		
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.4 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 Read Stereo Visual Odometry from file and optimize
 | |
| % @author Chris Beall
 | |
| %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 | |
| 
 | |
| %% Load calibration
 | |
| % format: fx fy skew cx cy baseline
 | |
| calib = dlmread('../Data/VO_calibration.txt');
 | |
| K = gtsamCal3_S2Stereo(calib(1), calib(2), calib(3), calib(4), calib(5), calib(6));
 | |
| stereo_model = gtsamSharedNoiseModel_Sigmas([1.0; 1.0; 1.0]);
 | |
| 
 | |
| %% create empty graph and values
 | |
| graph = visualSLAMGraph;
 | |
| initial = visualSLAMValues;
 | |
| 
 | |
| 
 | |
| %% load the initial poses from VO
 | |
| % row format: camera_id 4x4 pose (row, major)
 | |
| c = dlmread('../Data/VO_camera_poses.txt');
 | |
| 
 | |
| for i=1:size(c,1)
 | |
|     pose = gtsamPose3(reshape(c(i,2:17),4,4)');
 | |
|     initial.insertPose(symbol('x',c(i,1)),pose);
 | |
| end
 | |
| 
 | |
| %% load stereo measurements and initialize landmarks
 | |
| % camera_id landmark_id uL uR v X Y Z
 | |
| m = dlmread('../Data/VO_stereo_factors.txt');
 | |
| 
 | |
| for i=1:size(m,1)
 | |
|     sf = m(i,:);
 | |
|     graph.addStereoMeasurement(gtsamStereoPoint2(sf(3),sf(4),sf(5)), stereo_model, ...
 | |
|     symbol('x', sf(1)), symbol('l', sf(2)), K);
 | |
| 
 | |
|     if ~initial.exists(symbol('l',sf(2)))
 | |
|         % 3D landmarks are stored in camera coordinates: transform 
 | |
|         % to world coordinates using the respective initial pose
 | |
|         pose = initial.pose(symbol('x', sf(1)));
 | |
|         world_point = pose.transform_from(gtsamPoint3(sf(6),sf(7),sf(8)));
 | |
|         initial.insertPoint(symbol('l',sf(2)), world_point);
 | |
|     end
 | |
| end
 | |
| 
 | |
| %% add a constraint on the starting pose
 | |
| key = symbol('x',1);
 | |
| first_pose = initial.pose(key);
 | |
| graph.addPoseConstraint(symbol('x',1), first_pose);
 | |
| 
 | |
| %% optimize
 | |
| result = graph.optimize(initial);
 | |
| 
 | |
| %% visualize initial trajectory, final trajectory, and final points
 | |
| figure(1); clf;
 | |
| 
 | |
| % initial trajectory in red
 | |
| plot3(initial.xs(),initial.ys(),initial.zs(), '-*r','LineWidth',2);
 | |
| hold on;
 | |
| 
 | |
| % final trajectory in green
 | |
| plot3(result.xs(),result.ys(),result.zs(), '-*g','LineWidth',2);
 | |
| xlabel('X (m)'); ylabel('Y (m)'); zlabel('Z (m)');
 | |
| 
 | |
| % switch to XZ view
 | |
| view([0 0]);
 | |
| 
 | |
| % optimized 3D points
 | |
| points = result.points();
 | |
| plot3(points(:,1),points(:,2),points(:,3),'.');
 | |
| 
 | |
| axis([-30 30 -30 30 0 60]);
 |