| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  | function [graph,initial] = load3D(filename,model,successive,N)
 | 
					
						
							| 
									
										
										
										
											2012-09-08 13:28:25 +08:00
										 |  |  | % load3D reads a TORO-style 3D pose graph | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  | % cannot read noise model from file yet, uses specified model | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  | % if [successive] is tru, constructs initial estimate from odometry | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 06:15:05 +08:00
										 |  |  | import gtsam.* | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  | if nargin<3, successive=false; end | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  | fid = fopen(filename); | 
					
						
							|  |  |  | if fid < 0 | 
					
						
							|  |  |  |     error(['load2D: Cannot open file ' filename]); | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % scan all lines into a cell array | 
					
						
							|  |  |  | columns=textscan(fid,'%s','delimiter','\n'); | 
					
						
							|  |  |  | fclose(fid); | 
					
						
							|  |  |  | lines=columns{1}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % loop over lines and add vertices | 
					
						
							| 
									
										
										
										
											2012-07-24 06:15:05 +08:00
										 |  |  | graph = NonlinearFactorGraph; | 
					
						
							|  |  |  | initial = Values; | 
					
						
							| 
									
										
										
										
											2012-07-18 23:47:06 +08:00
										 |  |  | origin=gtsam.Pose3; | 
					
						
							| 
									
										
										
										
											2012-07-24 06:15:05 +08:00
										 |  |  | initial.insert(0,origin); | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  | n=size(lines,1); | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  | if nargin<4, N=n;end | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | for i=1:n | 
					
						
							|  |  |  |     line_i=lines{i}; | 
					
						
							|  |  |  |     if strcmp('VERTEX3',line_i(1:7)) | 
					
						
							|  |  |  |         v = textscan(line_i,'%s %d %f %f %f %f %f %f',1); | 
					
						
							| 
									
										
										
										
											2012-07-18 23:47:06 +08:00
										 |  |  |         i1=v{2}; | 
					
						
							|  |  |  |         if (~successive && i1<N || successive && i1==0) | 
					
						
							|  |  |  |             t = gtsam.Point3(v{3}, v{4}, v{5}); | 
					
						
							|  |  |  |             R = gtsam.Rot3.Ypr(v{8}, -v{7}, v{6}); | 
					
						
							| 
									
										
										
										
											2012-07-24 06:15:05 +08:00
										 |  |  |             initial.insert(i1, gtsam.Pose3(R,t)); | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  |         end | 
					
						
							|  |  |  |     elseif strcmp('EDGE3',line_i(1:5)) | 
					
						
							|  |  |  |         e = textscan(line_i,'%s %d %d %f %f %f %f %f %f',1); | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  |         i1=e{2}; | 
					
						
							|  |  |  |         i2=e{3}; | 
					
						
							| 
									
										
										
										
											2012-07-18 23:47:06 +08:00
										 |  |  |         if i1<N && i2<N | 
					
						
							|  |  |  |             if ~successive || abs(i2-i1)==1 | 
					
						
							|  |  |  |                 t = gtsam.Point3(e{4}, e{5}, e{6}); | 
					
						
							|  |  |  |                 R = gtsam.Rot3.Ypr(e{9}, e{8}, e{7}); | 
					
						
							|  |  |  |                 dpose = gtsam.Pose3(R,t); | 
					
						
							| 
									
										
										
										
											2012-07-24 06:15:05 +08:00
										 |  |  |                 graph.add(BetweenFactorPose3(i1, i2, dpose, model)); | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  |                 if successive | 
					
						
							|  |  |  |                     if i2>i1 | 
					
						
							| 
									
										
										
										
											2014-11-14 07:51:11 +08:00
										 |  |  |                         initial.insert(i2,initial.atPose3(i1).compose(dpose)); | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  |                     else | 
					
						
							| 
									
										
										
										
											2014-11-14 07:51:11 +08:00
										 |  |  |                         initial.insert(i1,initial.atPose3(i2).compose(dpose.inverse)); | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  |                     end | 
					
						
							|  |  |  |                 end | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2012-06-04 08:41:13 +08:00
										 |  |  |         end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 |