| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  | clc | 
					
						
							|  |  |  | clear all | 
					
						
							|  |  |  | close all | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import gtsam.*; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | addpath(genpath('./Libraries')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | deltaT = 0.01; | 
					
						
							|  |  |  | timeElapsed = 25; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | times = 0:deltaT:timeElapsed; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | 
					
						
							|  |  |  | % Constant body velocity w/ lever arm | 
					
						
							|  |  |  | disp('--------------------------------------------------------'); | 
					
						
							|  |  |  | disp('Constant body velocity w/ lever arm'); | 
					
						
							|  |  |  | omega = [0;0;0.1]; | 
					
						
							|  |  |  | velocity = [1;0;0]; | 
					
						
							|  |  |  | RIMUinBody = Rot3.Rz(-pi/2); | 
					
						
							|  |  |  | % RIMUinBody = eye(3) | 
					
						
							|  |  |  | IMUinBody = Pose3(RIMUinBody, Point3([1;0;0])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Initial state (body) | 
					
						
							|  |  |  | currentPoseGlobal = Pose3; | 
					
						
							|  |  |  | currentVelocityGlobal = velocity; | 
					
						
							|  |  |  | % Initial state (IMU) | 
					
						
							|  |  |  | currentPoseGlobalIMU = Pose3; %currentPoseGlobal.compose(IMUinBody); | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | %currentVelocityGlobalIMU = IMUinBody.rotation.unrotate(Point3(velocity)); % no Coriolis here? | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  | currentVelocityGlobalIMU = IMUinBody.rotation.unrotate( ... | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |      Point3(velocity + cross(omega, IMUinBody.translation))); | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  |     | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Positions | 
					
						
							|  |  |  | % body trajectory | 
					
						
							|  |  |  | positions = zeros(3, length(times)+1); | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | positions(:,1) = currentPoseGlobal.translation; | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  | poses(1).p = positions(:,1); | 
					
						
							|  |  |  | poses(1).R = currentPoseGlobal.rotation.matrix; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Expected IMU trajectory (from body trajectory and lever arm) | 
					
						
							|  |  |  | positionsIMUe = zeros(3, length(times)+1); | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | positionsIMUe(:,1) = IMUinBody.compose(currentPoseGlobalIMU).translation; | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  | posesIMUe(1).p = positionsIMUe(:,1); | 
					
						
							|  |  |  | posesIMUe(1).R = poses(1).R * IMUinBody.rotation.matrix; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | % Integrated IMU trajectory (from IMU measurements) | 
					
						
							|  |  |  | positionsIMU = zeros(3, length(times)+1); | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  | positionsIMU(:,1) = IMUinBody.compose(currentPoseGlobalIMU).translation; | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  | posesIMU(1).p = positionsIMU(:,1); | 
					
						
							|  |  |  | posesIMU(1).R = IMUinBody.compose(currentPoseGlobalIMU).rotation.matrix; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | i = 2; | 
					
						
							|  |  |  | for t = times | 
					
						
							|  |  |  |     [ currentPoseGlobal, currentVelocityGlobal ] = imuSimulator.integrateTrajectory( ... | 
					
						
							|  |  |  |         currentPoseGlobal, omega, velocity, velocity, deltaT); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     acc_omega = imuSimulator.calculateIMUMeasurement( ... | 
					
						
							|  |  |  |         omega, omega, velocity, velocity, deltaT, IMUinBody); | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     [ currentPoseGlobalIMU, currentVelocityGlobalIMU ] = imuSimulator.integrateIMUTrajectory( ... | 
					
						
							|  |  |  |         currentPoseGlobalIMU, currentVelocityGlobalIMU, acc_omega, deltaT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     % Store data in some structure for statistics and plots   | 
					
						
							| 
									
										
										
										
											2020-08-18 02:37:12 +08:00
										 |  |  |     positions(:,i) = currentPoseGlobal.translation; | 
					
						
							|  |  |  |     positionsIMUe(:,i) = currentPoseGlobal.translation + currentPoseGlobal.rotation.matrix * IMUinBody.translation; | 
					
						
							|  |  |  |     positionsIMU(:,i) = IMUinBody.compose(currentPoseGlobalIMU).translation; | 
					
						
							| 
									
										
										
										
											2014-01-29 01:19:25 +08:00
										 |  |  |      | 
					
						
							|  |  |  |     poses(i).p = positions(:,i); | 
					
						
							|  |  |  |     posesIMUe(i).p = positionsIMUe(:,i); | 
					
						
							|  |  |  |     posesIMU(i).p = positionsIMU(:,i);    | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     poses(i).R = currentPoseGlobal.rotation.matrix; | 
					
						
							|  |  |  |     posesIMUe(i).R = poses(i).R * IMUinBody.rotation.matrix; | 
					
						
							|  |  |  |     posesIMU(i).R = IMUinBody.compose(currentPoseGlobalIMU).rotation.matrix;       | 
					
						
							|  |  |  |     i = i + 1;    | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | figure(1) | 
					
						
							|  |  |  | plot_trajectory(poses, 50, '-k', 'body trajectory',0.1,0.75,1) | 
					
						
							|  |  |  | hold on | 
					
						
							|  |  |  | plot_trajectory(posesIMU, 50, '-r', 'imu trajectory',0.1,0.75,1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | figure(2) | 
					
						
							|  |  |  | hold on; | 
					
						
							|  |  |  | plot(positions(1,:), positions(2,:), '-b'); | 
					
						
							|  |  |  | plot(positionsIMU(1,:), positionsIMU(2,:), '-r'); | 
					
						
							|  |  |  | plot(positionsIMUe(1,:), positionsIMUe(2,:), ':k'); | 
					
						
							|  |  |  | axis equal; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | disp('Mismatch between final integrated IMU position and expected IMU position') | 
					
						
							|  |  |  | disp(norm(posesIMUe(end).p - posesIMU(end).p)) | 
					
						
							|  |  |  | disp('Mismatch between final integrated IMU orientation and expected IMU orientation') | 
					
						
							|  |  |  | disp(norm(posesIMUe(end).R - posesIMU(end).R)) | 
					
						
							|  |  |  | 
 |