| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  | function plot3DTrajectory(values,linespec,frames,scale,marginals)
 | 
					
						
							| 
									
										
										
										
											2012-09-08 13:28:25 +08:00
										 |  |  | % plot3DTrajectory plots a 3D trajectory | 
					
						
							|  |  |  | % plot3DTrajectory(values,linespec,frames,scale,marginals) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  | if ~exist('scale','var') || isempty(scale), scale=1; end | 
					
						
							|  |  |  | if ~exist('frames','var'), scale=[]; end | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  | import gtsam.* | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  | Pose3Values = gtsam.utilities.allPose3s(values); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  | haveMarginals = exist('marginals', 'var'); | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  | keys = KeyVector(Pose3Values.keys); | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | holdstate = ishold; | 
					
						
							|  |  |  | hold on | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Plot poses and covariance matrices | 
					
						
							|  |  |  | lastIndex = []; | 
					
						
							|  |  |  | for i = 0:keys.size-1 | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  |   key = keys.at(i); | 
					
						
							|  |  |  |   try | 
					
						
							|  |  |  |     x = Pose3Values.atPose3(key); | 
					
						
							| 
									
										
										
										
											2014-11-14 07:51:11 +08:00
										 |  |  |     if ~isempty(lastIndex) | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  |       % Draw line from last pose then covariance ellipse on top of | 
					
						
							|  |  |  |       % last pose. | 
					
						
							|  |  |  |       lastKey = keys.at(lastIndex); | 
					
						
							|  |  |  |       try | 
					
						
							|  |  |  |         lastPose = Pose3Values.atPose3(lastKey); | 
					
						
							|  |  |  |         plot3([ x.x; lastPose.x ], [ x.y; lastPose.y ], [ x.z; lastPose.z ], linespec); | 
					
						
							|  |  |  |         if haveMarginals | 
					
						
							|  |  |  |           P = marginals.marginalCovariance(lastKey); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |           P = []; | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  |         gtsam.plotPose3(lastPose, P, scale); | 
					
						
							|  |  |  |       catch err | 
					
						
							|  |  |  |         %                 warning(['no Pose3 at ' lastKey]); | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2012-06-04 13:53:51 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  |     lastIndex = i; | 
					
						
							|  |  |  |   catch | 
					
						
							|  |  |  |     warning(['no Pose3 at ' key]); | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Draw final pose | 
					
						
							|  |  |  | if ~isempty(lastIndex) | 
					
						
							|  |  |  |   lastKey = keys.at(lastIndex); | 
					
						
							|  |  |  |   try | 
					
						
							|  |  |  |     lastPose = Pose3Values.atPose3(lastKey); | 
					
						
							|  |  |  |     if haveMarginals | 
					
						
							|  |  |  |       P = marginals.marginalCovariance(lastKey); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |       P = []; | 
					
						
							| 
									
										
										
										
											2012-07-24 03:21:00 +08:00
										 |  |  |     end | 
					
						
							| 
									
										
										
										
											2018-05-15 08:40:48 +08:00
										 |  |  |     gtsam.plotPose3(lastPose, P, scale); | 
					
						
							|  |  |  |   catch | 
					
						
							|  |  |  |     % warning(['no Pose3 at ' lastIndex]); | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ~holdstate | 
					
						
							|  |  |  |   hold off | 
					
						
							|  |  |  | end |