Hauptinhalt

Diese Seite wurde mithilfe maschineller Übersetzung übersetzt. Klicken Sie hier, um die neueste Version auf Englisch zu sehen.

Entfernen Sie Verzerrungen bei der Winkelgeschwindigkeitsmessung

Dieses Beispiel zeigt, wie man mit imufilter die Gyroskopverzerrung aus einer IMU entfernt.

Verwenden Sie kinematicTrajectory, um eine Flugbahn mit zwei Teilen zu erstellen. Der erste Teil hat eine konstante Winkelgeschwindigkeit um die y- und z-Achsen. Der zweite Teil hat eine unterschiedliche Winkelgeschwindigkeit in allen drei Achsen.

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

Erstellen Sie ein imuSensor System object ™, IMU, mit einem nicht idealen Gyroskop. Rufen Sie IMU mit der tatsächlichen Beschleunigung, Winkelgeschwindigkeit und Ausrichtung auf.

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

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

Erstellen Sie ein imufilter System object, fuse. Rufen Sie fuse mit den modellierten Beschleunigungsmesser- und Gyroskopwerten auf.

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

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

Zeichnen Sie die tatsächliche Winkelgeschwindigkeit, die Gyroskopwerte und die wiederhergestellte Winkelgeschwindigkeit für jede Achse auf.

Die vom imufilter zurückgegebene Winkelgeschwindigkeit kompensiert mit der Zeit den Effekt der Gyroskopverzerrung und konvergiert zur wahren Winkelgeschwindigkeit.

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.