98 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Matlab
		
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Matlab
		
	
	
|  | clc | ||
|  | clear all | ||
|  | close all | ||
|  | 
 | ||
|  | import gtsam.*; | ||
|  | 
 | ||
|  | deltaT = 0.001; | ||
|  | timeElapsed = 1; | ||
|  | times = 0:deltaT:timeElapsed; | ||
|  | 
 | ||
|  | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
|  | disp('--------------------------------------------------------'); | ||
|  | disp('Integration in body frame VS integration in navigation frame'); | ||
|  | disp('TOY EXAMPLE:'); | ||
|  | disp('- Body moves along a circular trajectory with constant rotation rate -omega- and constant -velocity- (in the body frame)'); | ||
|  | disp('- We compare two integration schemes: integating in the navigation frame (similar to Lupton approach) VS integrating in the body frame') | ||
|  | disp('- Navigation frame is assumed inertial for simplicity') | ||
|  | omega = [0;0;2*pi]; | ||
|  | velocity = [1;0;0]; | ||
|  | 
 | ||
|  | %% Set initial conditions for the true trajectory and for the estimates | ||
|  | % (one estimate is obtained by integrating in the body frame, the other | ||
|  | % by integrating in the navigation frame) | ||
|  | % Initial state (body) | ||
|  | currentPoseGlobal = Pose3; | ||
|  | currentVelocityGlobal = velocity; | ||
|  | % Initial state estimate (integrating in navigation frame) | ||
|  | currentPoseGlobalIMUnav = currentPoseGlobal; | ||
|  | currentVelocityGlobalIMUnav = currentVelocityGlobal; | ||
|  | % Initial state estimate (integrating in the body frame) | ||
|  | currentPoseGlobalIMUbody = currentPoseGlobal; | ||
|  | currentVelocityGlobalIMUbody = currentVelocityGlobal; | ||
|  | 
 | ||
|  | %% Prepare data structures for actual trajectory and estimates | ||
|  | % Actual trajectory | ||
|  | positions = zeros(3, length(times)+1); | ||
|  | positions(:,1) = currentPoseGlobal.translation.vector; | ||
|  | poses(1).p = positions(:,1); | ||
|  | poses(1).R = currentPoseGlobal.rotation.matrix; | ||
|  | 
 | ||
|  | % Trajectory estimate (integrated in the navigation frame) | ||
|  | positionsIMUnav = zeros(3, length(times)+1); | ||
|  | positionsIMUnav(:,1) = currentPoseGlobalIMUbody.translation.vector; | ||
|  | posesIMUnav(1).p = positionsIMUnav(:,1); | ||
|  | posesIMUnav(1).R = poses(1).R; | ||
|  | 
 | ||
|  | % Trajectory estimate (integrated in the body frame) | ||
|  | positionsIMUbody = zeros(3, length(times)+1); | ||
|  | positionsIMUbody(:,1) = currentPoseGlobalIMUbody.translation.vector; | ||
|  | posesIMUbody(1).p = positionsIMUbody(:,1); | ||
|  | posesIMUbody(1).R = poses(1).R; | ||
|  | 
 | ||
|  | %% Main loop | ||
|  | i = 2; | ||
|  | for t = times | ||
|  |   %% Create the actual trajectory, using the velocities and | ||
|  |   % accelerations in the inertial frame to compute the positions | ||
|  |   [ currentPoseGlobal, currentVelocityGlobal ] = imuSimulator.integrateTrajectory( ... | ||
|  |     currentPoseGlobal, omega, velocity, velocity, deltaT); | ||
|  |    | ||
|  |   %% Simulate IMU measurements, considering Coriolis effect  | ||
|  |   % (in this simple example we neglect gravity and there are no other forces acting on the body) | ||
|  |   acc_omega = imuSimulator.calculateIMUMeas_coriolis( ... | ||
|  |     omega, omega, velocity, velocity, deltaT); | ||
|  |    | ||
|  |   %% Integrate in the body frame | ||
|  |   [ currentPoseGlobalIMUbody, currentVelocityGlobalIMUbody ] = imuSimulator.integrateIMUTrajectory_bodyFrame( ... | ||
|  |     currentPoseGlobalIMUbody, currentVelocityGlobalIMUbody, acc_omega, deltaT, velocity); | ||
|  | 
 | ||
|  |   %% Integrate in the navigation frame | ||
|  |   [ currentPoseGlobalIMUnav, currentVelocityGlobalIMUnav ] = imuSimulator.integrateIMUTrajectory_navFrame( ... | ||
|  |     currentPoseGlobalIMUnav, currentVelocityGlobalIMUnav, acc_omega, deltaT); | ||
|  |    | ||
|  |   %% Store data in some structure for statistics and plots | ||
|  |   positions(:,i) = currentPoseGlobal.translation.vector; | ||
|  |   positionsIMUbody(:,i) = currentPoseGlobalIMUbody.translation.vector; | ||
|  |   positionsIMUnav(:,i) = currentPoseGlobalIMUnav.translation.vector;   | ||
|  |   % -  | ||
|  |   poses(i).p = positions(:,i); | ||
|  |   posesIMUbody(i).p = positionsIMUbody(:,i); | ||
|  |   posesIMUnav(i).p = positionsIMUnav(:,i);  | ||
|  |   % - | ||
|  |   poses(i).R = currentPoseGlobal.rotation.matrix; | ||
|  |   posesIMUbody(i).R = currentPoseGlobalIMUbody.rotation.matrix; | ||
|  |   posesIMUnav(i).R = currentPoseGlobalIMUnav.rotation.matrix; | ||
|  |   i = i + 1; | ||
|  | end | ||
|  | 
 | ||
|  | figure(1) | ||
|  | hold on; | ||
|  | plot(positions(1,:), positions(2,:), '-b'); | ||
|  | plot(positionsIMUbody(1,:), positionsIMUbody(2,:), '-r'); | ||
|  | plot(positionsIMUnav(1,:), positionsIMUnav(2,:), ':k'); | ||
|  | axis equal; | ||
|  | legend('true trajectory', 'traj integrated in body', 'traj integrated in nav') | ||
|  | 
 | ||
|  | 
 |