97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Matlab
		
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Matlab
		
	
	
|  | 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); | ||
|  | %currentVelocityGlobalIMU = IMUinBody.rotation.unrotate(Point3(velocity)).vector; % no Coriolis here?  | ||
|  | currentVelocityGlobalIMU = IMUinBody.rotation.unrotate( ... | ||
|  |      Point3(velocity + cross(omega, IMUinBody.translation.vector))).vector; | ||
|  |     | ||
|  | 
 | ||
|  | % Positions | ||
|  | % body trajectory | ||
|  | positions = zeros(3, length(times)+1); | ||
|  | positions(:,1) = currentPoseGlobal.translation.vector; | ||
|  | 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); | ||
|  | positionsIMUe(:,1) = IMUinBody.compose(currentPoseGlobalIMU).translation.vector; | ||
|  | 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); | ||
|  | positionsIMU(:,1) = IMUinBody.compose(currentPoseGlobalIMU).translation.vector; | ||
|  | 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   | ||
|  |     positions(:,i) = currentPoseGlobal.translation.vector; | ||
|  |     positionsIMUe(:,i) = currentPoseGlobal.translation.vector + currentPoseGlobal.rotation.matrix * IMUinBody.translation.vector; | ||
|  |     positionsIMU(:,i) = IMUinBody.compose(currentPoseGlobalIMU).translation.vector; | ||
|  |      | ||
|  |     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)) | ||
|  | 
 |