Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

Eliminar el sesgo de la medición de la velocidad angular

Este ejemplo muestra cómo eliminar el sesgo del giroscopio de una IMU usando imufilter.

Utilice kinematicTrajectory para crear una trayectoria con dos partes. La primera parte tiene una velocidad angular constante alrededor de los ejes y y z. La segunda parte tiene una velocidad angular variable en los tres ejes.

duration = 60*8;
fs = 20;
numSamples = duration * fs;
rng('default') % Seed the RNG to reproduce noisy sensor measurements.

initialAngVel = [0,0.5,0.25];
finalAngVel = [-0.2,0.6,0.5];
constantAngVel = repmat(initialAngVel,floor(numSamples/2),1);
varyingAngVel = [linspace(initialAngVel(1), finalAngVel(1), ceil(numSamples/2)).', ...
    linspace(initialAngVel(2), finalAngVel(2), ceil(numSamples/2)).', ...
    linspace(initialAngVel(3), finalAngVel(3), ceil(numSamples/2)).'];

angVelBody = [constantAngVel; varyingAngVel];
accBody = zeros(numSamples,3);

traj = kinematicTrajectory('SampleRate',fs);

[~,qNED,~,accNED,angVelNED] = traj(accBody,angVelBody);

Cree un imuSensor System object™, IMU, con un giroscopio no ideal. Llame a IMU con la aceleración, la velocidad angular y la orientación reales.

IMU = imuSensor('accel-gyro', ...
    'Gyroscope',gyroparams('RandomWalk',0.003,'ConstantBias',0.3), ...
    'SampleRate',fs);

[accelReadings, gyroReadingsBody] = IMU(accNED,angVelNED,qNED);

Cree un System object imufilter , fuse. Llame a fuse con las lecturas modeladas del acelerómetro y del giroscopio.

fuse = imufilter('SampleRate',fs, 'GyroscopeDriftNoise', 1e-6);

[~,angVelBodyRecovered] = fuse(accelReadings,gyroReadingsBody);

Trace la velocidad angular ground-truth, las lecturas del giroscopio y la velocidad angular recuperada para cada eje.

La velocidad angular devuelta por el imufilter compensa el efecto del sesgo del giroscopio a lo largo del tiempo y converge a la verdadera velocidad angular.

time = (0:numSamples-1)'/fs;

figure(1)
plot(time,angVelBody(:,1), ...
     time,gyroReadingsBody(:,1), ...
     time,angVelBodyRecovered(:,1))
title('X-axis')
legend('True Angular Velocity', ...
       'Gyroscope Readings', ...
       'Recovered Angular Velocity')
ylabel('Angular Velocity (rad/s)')

Figure contains an axes object. The axes object with title X-axis, ylabel Angular Velocity (rad/s) contains 3 objects of type line. These objects represent True Angular Velocity, Gyroscope Readings, Recovered Angular Velocity.

figure(2)
plot(time,angVelBody(:,2), ...
     time,gyroReadingsBody(:,2), ...
     time,angVelBodyRecovered(:,2))
title('Y-axis')
ylabel('Angular Velocity (rad/s)')

Figure contains an axes object. The axes object with title Y-axis, ylabel Angular Velocity (rad/s) contains 3 objects of type line.

figure(3)
plot(time,angVelBody(:,3), ...
     time,gyroReadingsBody(:,3), ...
     time,angVelBodyRecovered(:,3))
title('Z-axis')
ylabel('Angular Velocity (rad/s)')
xlabel('Time (s)')

Figure contains an axes object. The axes object with title Z-axis, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 3 objects of type line.