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))
 | 
						|
 |