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(2) plot(time,angVelBody(:,2), ... time,gyroReadingsBody(:,2), ... time,angVelBodyRecovered(:,2)) title('Y-axis') ylabel('Angular Velocity (rad/s)')
figure(3) plot(time,angVelBody(:,3), ... time,gyroReadingsBody(:,3), ... time,angVelBodyRecovered(:,3)) title('Z-axis') ylabel('Angular Velocity (rad/s)') xlabel('Time (s)')