mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2024-12-02 10:24:11 +01:00
AHRS - fixed time constant of baro altitude offset filter, added the offset to the EKF dump
Added new EKF data parser (m-file) to ground git-svn-id: svn://svn.openpilot.org/OpenPilot/trunk@2178 ebee16cc-31ac-478f-84a7-5cbb03baadba
This commit is contained in:
parent
a4ba7fcbee
commit
18809ce3dc
@ -104,6 +104,9 @@ struct gps_sensor gps_data;
|
|||||||
//! The oversampling rate, ekf is 2k / this
|
//! The oversampling rate, ekf is 2k / this
|
||||||
static uint8_t adc_oversampling = 20;
|
static uint8_t adc_oversampling = 20;
|
||||||
|
|
||||||
|
//! Offset correction of barometric alt, to match gps data
|
||||||
|
static float baro_offset = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @}
|
* @}
|
||||||
*/
|
*/
|
||||||
@ -117,7 +120,6 @@ void ins_outdoor_update()
|
|||||||
{
|
{
|
||||||
float gyro[3], accel[3], vel[3];
|
float gyro[3], accel[3], vel[3];
|
||||||
static uint32_t last_gps_time = 0;
|
static uint32_t last_gps_time = 0;
|
||||||
static float baro_offset = 0;
|
|
||||||
uint16_t sensors;
|
uint16_t sensors;
|
||||||
|
|
||||||
// format data for INS algo
|
// format data for INS algo
|
||||||
@ -174,7 +176,7 @@ void ins_outdoor_update()
|
|||||||
baro_offset = gps_data.NED[2] + altitude_data.altitude;
|
baro_offset = gps_data.NED[2] + altitude_data.altitude;
|
||||||
} else {
|
} else {
|
||||||
/* IIR filter with 100 second or so tau to keep them crudely in the same frame */
|
/* IIR filter with 100 second or so tau to keep them crudely in the same frame */
|
||||||
baro_offset = baro_offset * 0.99 + (gps_data.NED[2] + altitude_data.altitude) * 0.01;
|
baro_offset = baro_offset * 0.999 + (gps_data.NED[2] + altitude_data.altitude) * 0.001;
|
||||||
}
|
}
|
||||||
gps_data.updated = false;
|
gps_data.updated = false;
|
||||||
} else if (gps_delay > INSGPS_GPS_TIMEOUT) {
|
} else if (gps_delay > INSGPS_GPS_TIMEOUT) {
|
||||||
@ -376,6 +378,7 @@ void print_ekf_binary()
|
|||||||
PIOS_COM_SendBuffer(PIOS_COM_AUX, (uint8_t *) &(P[i][i]), 4); // diag(P) (138:189)
|
PIOS_COM_SendBuffer(PIOS_COM_AUX, (uint8_t *) &(P[i][i]), 4); // diag(P) (138:189)
|
||||||
|
|
||||||
PIOS_COM_SendBuffer(PIOS_COM_AUX, (uint8_t *) & altitude_data.altitude, 4); // BaroAlt (190:193)
|
PIOS_COM_SendBuffer(PIOS_COM_AUX, (uint8_t *) & altitude_data.altitude, 4); // BaroAlt (190:193)
|
||||||
|
PIOS_COM_SendBuffer(PIOS_COM_AUX, (uint8_t *) & baro_offset, 4); // baro_offset (194:198)
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void print_ekf_binary() {}
|
void print_ekf_binary() {}
|
||||||
|
78
ground/src/experimental/SerialLogger/ParseEKFLog.m
Normal file
78
ground/src/experimental/SerialLogger/ParseEKFLog.m
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
function ParseEKFLog(fn)
|
||||||
|
|
||||||
|
fid = fopen(fn);
|
||||||
|
dat = uint8(fread(fid,inf,'uchar'));
|
||||||
|
fclose(fid);
|
||||||
|
|
||||||
|
mag_data_size = 1 + 4*3;
|
||||||
|
accel_sensor_size = 4*3;
|
||||||
|
gyro_sensor_size = 4*3;
|
||||||
|
raw_framing = 15:-1:0;
|
||||||
|
|
||||||
|
starts = strfind(char(dat'),char(raw_framing));
|
||||||
|
starts(end) = [];
|
||||||
|
|
||||||
|
counts = typecast(reshape(dat(bsxfun(@plus,starts,(16:19)')),1,[]),'int32');
|
||||||
|
accel = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(20:31)')),1,[]),'single'),3,[])';
|
||||||
|
gyro = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(32:43)')),1,[]),'single'),3,[])';
|
||||||
|
mag_updated = dat(starts+44);
|
||||||
|
mag = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(45:56)')),1,[]),'single'),3,[])';
|
||||||
|
|
||||||
|
%gps = 28 bytes 57:84
|
||||||
|
NED = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(57:68)')),1,[]),'single'),3,[])';
|
||||||
|
heading = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(69:72)')),1,[]),'single'),1,[])';
|
||||||
|
groundspeed = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(73:76)')),1,[]),'single'),1,[])';
|
||||||
|
quality = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(77:80)')),1,[]),'single'),1,[])';
|
||||||
|
updated = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(81:84)')),1,[]),'int32'),1,[])';
|
||||||
|
|
||||||
|
X = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(85:85+13*4-1)')),1,[]),'single'),13,[])';
|
||||||
|
P = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(137:137+13*4-1)')),1,[]),'single'),13,[])';
|
||||||
|
|
||||||
|
Baro = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(189:192)')),1,[]),'single'),1,[])';
|
||||||
|
BaroOffset = reshape(typecast(reshape(dat(bsxfun(@plus,starts,(193:196)')),1,[]),'single'),1,[])';
|
||||||
|
|
||||||
|
N=length(accel);
|
||||||
|
rpy = zeros(3,N);
|
||||||
|
Vne = zeros(2,N);
|
||||||
|
dt = 0.01;
|
||||||
|
t=0:dt:(N-1)*dt;
|
||||||
|
for i = 1:N
|
||||||
|
rpy(:,i) = q2rpy(X(i,7:10))*180/pi;
|
||||||
|
groundTrack = heading(i)*pi/180;
|
||||||
|
Vne(:,i) = groundspeed(i)*[cos(groundTrack); sin(groundTrack)];
|
||||||
|
end
|
||||||
|
|
||||||
|
figure(1); plot(t,rpy(1,:),t,rpy(2,:),t,rpy(3,:));
|
||||||
|
title('roll-pitch-yaw');
|
||||||
|
figure(2); plot(t,NED(:,1),t,NED(:,2),t,NED(:,3),t,X(:,1),t,X(:,2),t,X(:,3),t,BaroOffset-Baro);
|
||||||
|
title('gpsNED');ylim([-500 500]);
|
||||||
|
figure(3); plot(t,Vne(1,:),t,Vne(2,:),t,X(:,4),t,X(:,5));
|
||||||
|
title('gpsVne');ylim([-3 3]);
|
||||||
|
figure(4); plot(t,accel(:,1),t,accel(:,2),t,accel(:,3));
|
||||||
|
title('accels');ylim([-10 10]);
|
||||||
|
figure(5); plot(t,gyro(:,1),t,gyro(:,2),t,gyro(:,3));
|
||||||
|
title('gyros'); ylim([-pi pi]);
|
||||||
|
figure(6); plot(t,mag(:,1),t,mag(:,2),t,mag(:,3));
|
||||||
|
title('mags'); ylim([-1200 1200]);
|
||||||
|
figure(7); plot(t,Baro,t,BaroOffset,t,BaroOffset-NED(:,3));
|
||||||
|
title('BaroAlt'); ylim([300 410]);
|
||||||
|
figure(8); plot(t,X(:,11),t,X(:,12),t,X(:,13));
|
||||||
|
title('GyroBias'); ylim([-1 1]);
|
||||||
|
|
||||||
|
Be = [20595 1363 49068]';
|
||||||
|
ScaledBe = [Be(1) Be(2) Be(3)]'/Be(3);
|
||||||
|
ScaledBe = [ScaledBe ScaledBe];
|
||||||
|
ScaledMag = zeros(3,N);
|
||||||
|
MagMag = zeros(1,N);
|
||||||
|
for i = 1:N
|
||||||
|
ScaledMag(:,i) = mag(i,:)'/mag(i,3);
|
||||||
|
MagMag(i) = norm(mag(i,:));
|
||||||
|
end
|
||||||
|
t2 = [t(1) t(end)];
|
||||||
|
figure(13); plot(t,ScaledMag(1,:),t,ScaledMag(2,:),t,ScaledMag(3,:),t2,ScaledBe(1,:),t2,ScaledBe(2,:),t2,ScaledBe(3,:));
|
||||||
|
title('scaledMags'); ylim([-1.01 1.01]);
|
||||||
|
figure(14); plot(t,MagMag);
|
||||||
|
title('Mag Magnitude'); ylim([500 1500]);
|
||||||
|
|
||||||
|
|
||||||
|
keyboard
|
Loading…
Reference in New Issue
Block a user