2012-02-28 07:42:50 +01:00
|
|
|
t0 = 60000;
|
|
|
|
|
|
|
|
bad = find(Gyros.timestamp > max(medfilt1(Gyros.timestamp,5)) | Gyros.timestamp < t0);
|
|
|
|
Gyros.timestamp(bad) = [];
|
|
|
|
Gyros.x(bad) = [];
|
|
|
|
Gyros.y(bad) = [];
|
|
|
|
Gyros.z(bad) = [];
|
|
|
|
Gyros.timestamp = medfilt1(Gyros.timestamp,5);
|
|
|
|
|
|
|
|
bad = find(Accels.timestamp > max(medfilt1(Accels.timestamp,5)));
|
|
|
|
Accels.timestamp(bad) = [];
|
|
|
|
Accels.x(bad) = [];
|
|
|
|
Accels.y(bad) = [];
|
|
|
|
Accels.z(bad) = [];
|
|
|
|
Accels.timestamp = medfilt1(Accels.timestamp,5);
|
|
|
|
|
|
|
|
bad = find(Magnetometer.timestamp > max(medfilt1(Magnetometer.timestamp,5)));
|
|
|
|
Magnetometer.timestamp(bad) = [];
|
|
|
|
Magnetometer.x(bad) = [];
|
|
|
|
Magnetometer.y(bad) = [];
|
|
|
|
Magnetometer.z(bad) = [];
|
|
|
|
Magnetometer.timestamp = medfilt1(Magnetometer.timestamp,5);
|
|
|
|
|
|
|
|
bad = find(BaroAltitude.timestamp > max(medfilt1(BaroAltitude.timestamp,5)));
|
|
|
|
BaroAltitude.timestamp(bad) = [];
|
|
|
|
BaroAltitude.Altitude(bad) = [];
|
|
|
|
|
|
|
|
|
|
|
|
bad = find(GPSPosition.timestamp > max(medfilt1(GPSPosition.timestamp,5)));
|
|
|
|
GPSPosition.timestamp(bad) = [];
|
|
|
|
GPSPosition.Latitude(bad) = [];
|
|
|
|
GPSPosition.Longitude(bad) = [];
|
|
|
|
GPSPosition.Altitude(bad) = [];
|
|
|
|
GPSPosition.Heading(bad) = [];
|
|
|
|
GPSPosition.Satellites(bad) = [];
|
|
|
|
GPSPosition.Groundspeed(bad) = [];
|
|
|
|
GPSPosition.timestamp = medfilt1(GPSPosition.timestamp,5);
|
|
|
|
|
|
|
|
outdoor = any(GPSPosition.Satellites > 7);
|
2012-02-27 18:44:11 +01:00
|
|
|
|
|
|
|
north = [24000 1700 43000];
|
2012-02-28 07:42:50 +01:00
|
|
|
baro_offset = 0;
|
|
|
|
if outdoor
|
|
|
|
idx = find(GPSPosition.Satellites > 7, 1, 'first');
|
|
|
|
home = [GPSPosition.Latitude(idx) GPSPosition.Longitude(idx) GPSPosition.Altitude(idx)];
|
|
|
|
home(1:2) = home(1:2) / 10e6;
|
|
|
|
baro_offset = -125;
|
|
|
|
end
|
|
|
|
|
2012-02-27 18:44:11 +01:00
|
|
|
insgps_ml('INSGPSInit')
|
|
|
|
insgps_ml('INSSetMagNorth',north);
|
|
|
|
insgps_ml('INSSetMagVar',[5 5 5]/1000);
|
2012-02-28 07:42:50 +01:00
|
|
|
insgps_ml('INSSetAccelVar',1.5e-5 * ones(1,3));
|
|
|
|
insgps_ml('INSSetGyroVar',2e-4*ones(1,3));
|
|
|
|
|
2012-02-27 18:44:11 +01:00
|
|
|
accel_idx = 1;
|
|
|
|
mag_idx = 1;
|
|
|
|
baro_idx = 1;
|
2012-02-28 07:42:50 +01:00
|
|
|
gps_idx = 1;
|
|
|
|
|
|
|
|
update_mag = false;
|
|
|
|
update_baro = false;
|
|
|
|
update_pos = false;
|
|
|
|
|
|
|
|
inited = false;
|
|
|
|
|
|
|
|
ned = zeros(3,length(Gyros.timestamp));
|
|
|
|
gps_vel = zeros(3,length(Gyros.timestamp));
|
|
|
|
a = zeros(13,length(Gyros.timestamp));
|
2012-02-27 18:44:11 +01:00
|
|
|
for i = 1:length(Gyros.timestamp)-1000
|
|
|
|
t = Gyros.timestamp(i);
|
|
|
|
gyro = [Gyros.x(i) Gyros.y(i) Gyros.z(i)] * pi / 180;
|
|
|
|
|
|
|
|
accel_idx = accel_idx - 1 + find(Accels.timestamp(accel_idx:end) >= t,1,'first');
|
|
|
|
accel = [Accels.x(accel_idx) Accels.y(accel_idx) Accels.z(accel_idx)-0.4];
|
|
|
|
|
2012-02-28 09:50:19 +01:00
|
|
|
dT = 0.0013;
|
2012-02-27 18:44:11 +01:00
|
|
|
[a(:,i) b K] = insgps_ml('INSStatePrediction',gyro,accel,dT);
|
|
|
|
|
2012-02-28 07:42:50 +01:00
|
|
|
if Magnetometer.timestamp(mag_idx) <= t
|
|
|
|
update_mag = true;
|
|
|
|
mag_idx = mag_idx + 1;
|
|
|
|
mag = [Magnetometer.x(mag_idx) Magnetometer.y(mag_idx) Magnetometer.z(mag_idx)];
|
|
|
|
end
|
|
|
|
|
|
|
|
if BaroAltitude.timestamp(baro_idx) <= t
|
|
|
|
baro_idx = baro_idx + 1;
|
|
|
|
update_baro = true;
|
|
|
|
baro = -BaroAltitude.Altitude(baro_idx) + baro_offset;
|
|
|
|
end
|
2012-02-27 18:44:11 +01:00
|
|
|
|
2012-02-28 07:42:50 +01:00
|
|
|
if outdoor && GPSPosition.timestamp(gps_idx) <= t
|
|
|
|
gps_idx = gps_idx + 1;
|
|
|
|
lla = [GPSPosition.Latitude(gps_idx) GPSPosition.Longitude(gps_idx) GPSPosition.Altitude(gps_idx)];
|
|
|
|
lla(1:2) = lla(1:2) / 10e6;
|
|
|
|
pos = LLA2NED(lla, home);
|
|
|
|
vel = [cos(GPSPosition.Heading(gps_idx) * pi / 180), sin(GPSPosition.Heading(gps_idx) * pi / 180) 0];
|
|
|
|
vel = vel * GPSPosition.Groundspeed(gps_idx);
|
|
|
|
update_pos = true;
|
|
|
|
elseif ~outdoor
|
|
|
|
pos = [0 0 baro];
|
|
|
|
vel = [0 0 0];
|
|
|
|
update_pos = true;
|
|
|
|
end
|
|
|
|
|
|
|
|
if t > 4.1e5 & t < 4.2e5
|
|
|
|
update_pos = false;
|
|
|
|
end
|
|
|
|
|
|
|
|
ned(:,i) = pos;
|
|
|
|
gps_vel(:,i) = vel;
|
|
|
|
if ~inited && update_pos && update_baro && update_mag
|
|
|
|
update_pos = false;
|
|
|
|
update_baro = false;
|
|
|
|
update_mag = false;
|
|
|
|
|
|
|
|
inited = true;
|
|
|
|
|
|
|
|
rpy(1) = atan2(accel(1), accel(3)) * 0;
|
|
|
|
rpy(2) = atan2(accel(2), accel(3)) * 0;
|
2012-02-27 18:44:11 +01:00
|
|
|
rpy(3) = atan2(mag(2),-mag(1));
|
|
|
|
|
|
|
|
%q1 = AttiudeFromVectors(mag',north',accel');
|
|
|
|
q1 = RPY2Quaternion(rpy * 180 / pi)';
|
2012-02-28 07:42:50 +01:00
|
|
|
insgps_ml('INSSetState',[pos(1) pos(2) baro vel q1' -mean(Gyros.x(1:100) * pi / 180) -mean(Gyros.y(1:100) * pi / 180) 0]);
|
|
|
|
elseif inited && i < 100
|
2012-02-27 18:44:11 +01:00
|
|
|
insgps_ml('INSSetMagVar',[5 5 5]);
|
|
|
|
insgps_ml('INSSetPosVelVar',1 / 1000);
|
|
|
|
% zero bias
|
2012-02-28 07:42:50 +01:00
|
|
|
%insgps_ml('INSSetState',[a(1:10,i)' 0 0 0]);
|
|
|
|
%state = insgps_ml('INSFullCorrection',mag,pos,vel,baro);
|
|
|
|
elseif inited
|
|
|
|
insgps_ml('INSSetMagVar',[5 5 5]*100);
|
|
|
|
|
|
|
|
if ~outdoor
|
|
|
|
if update_mag
|
|
|
|
insgps_ml('INSMagCorrection',mag);
|
|
|
|
update_mag = false;
|
|
|
|
elseif update_baro
|
|
|
|
insgps_ml('INSVelBaroCorrection',vel,baro);
|
|
|
|
update_baro = false;
|
|
|
|
elseif update_pos
|
2012-02-28 09:50:19 +01:00
|
|
|
insgps_ml('INSGpsCorrection',[0 0 baro],[0 0 0]);
|
2012-02-28 07:42:50 +01:00
|
|
|
update_pos = false;
|
|
|
|
end
|
|
|
|
else % outdoor
|
|
|
|
insgps_ml('INSSetPosVelVar',0.0001);
|
2012-02-27 18:44:11 +01:00
|
|
|
|
2012-02-28 07:42:50 +01:00
|
|
|
if update_mag
|
|
|
|
insgps_ml('INSMagCorrection',mag);
|
|
|
|
update_mag = false;
|
|
|
|
elseif update_baro
|
|
|
|
insgps_ml('INSBaroCorrection',baro);
|
|
|
|
update_baro = false;
|
|
|
|
elseif update_pos
|
|
|
|
insgps_ml('INSGpsCorrection',pos,vel);
|
|
|
|
update_pos = false;
|
|
|
|
end
|
|
|
|
end
|
2012-02-27 18:44:11 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
%state = insgps_ml('INSFullCorrection',mag,pos,vel,baro);
|
2012-02-28 07:42:50 +01:00
|
|
|
if(mod(i,100) == 0)
|
2012-02-27 18:44:11 +01:00
|
|
|
q = a(7:10,1:i);
|
|
|
|
rpy = Quaternion2RPY(q');
|
2012-02-28 07:42:50 +01:00
|
|
|
subplot(311);
|
|
|
|
idx = find((AttitudeActual.timestamp < t) & (AttitudeActual.timestamp > Gyros.timestamp(1)));
|
|
|
|
plot(Gyros.timestamp(1:i),rpy(:,1:2),AttitudeActual.timestamp(idx),AttitudeActual.Roll(idx),'k',AttitudeActual.timestamp(idx),AttitudeActual.Pitch(idx),'k');
|
|
|
|
subplot(312);
|
|
|
|
plot(Gyros.timestamp(1:i), a(1:2,1:i)',Gyros.timestamp(1:i), ned(1:2,1:i)','k');
|
|
|
|
subplot(313);
|
|
|
|
plot(Gyros.timestamp(1:i), a(4:5,1:i)',Gyros.timestamp(1:i), gps_vel(1:2,1:i)','k');
|
2012-02-27 18:44:11 +01:00
|
|
|
drawnow
|
|
|
|
end
|
|
|
|
end
|