diff --git a/matlab/GPSaidedINS.m b/matlab/GPSaidedINS.m index d5fb86cd175348f04ea7a18ead9f11f7e9668553..2d843f37ed451660954d8fe94ae7a4ba7cf5e7d8 100644 --- a/matlab/GPSaidedINS.m +++ b/matlab/GPSaidedINS.m @@ -58,16 +58,19 @@ GPS_position=true; %% Initialize GPS sensor sensor.state='warm_start_available'; -sensor.howLong=0; +sensor.fetchfp=0.2; +sensor.geteph=Inf; sensor.ephExp=1800.0; sensor.fp=0; sensor.eph=5; +sv=5; %initialize the number of visible satellites turn=true; power=400; energy=0; -pre_state='startup'; -a=0; +pre_state='startup'; %initialize previous state of the sensor (used for displaying state changes) +P_store=0; %store summed valued of the trace of P in time +sv_store=sv; %store number of visible satellites in time for k=2:N @@ -77,18 +80,18 @@ for k=2:N %%%%%%%%%%%%%%%%% %% GPS sensor %% %%%%%%%%%%%%%%%%% - %number of visible satellites - sv=5; + %randomized number of visible satellites + sv = random_satellites(sv); %control action - a=[a,sum(sqrt(out_data.diag_P(1:3,k-1)))]; + P_store=[P_store,sum(sqrt(out_data.diag_P(1:3,k-1)))]; if sum(sqrt(out_data.diag_P(1:3,k-1)))<3.0 turn=false; else turn=true; end %update sensor state - pre_state=sensor.state; - sensor=gps(t(k),sensor,turn,sv); +% pre_state=sensor.state; + sensor=gps_randomized(t(k),sensor,turn,sv); %remove _randomized for worst case %determine if GPS position is available GPS_position=strcmp(sensor.state,'position_available'); %compute power consumption @@ -96,11 +99,11 @@ for k=2:N energy=energy+power*Ts; end -% %print new state and current time if it changes -% if ~strcmp(pre_state, sensor.state) -% sensor.state -% t(k) -% end +% %print new state and current time if it changes +% if ~strcmp(pre_state, sensor.state) +% sensor.state +% t(k) +% end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -159,7 +162,7 @@ for k=2:N end figure(11) -plot(a),grid +plot(P_store),grid energy end @@ -278,9 +281,33 @@ R=(eye(3)-OMEGA)*R; q=dcm2q(R); end - - - - - - +function sv=random_satellites(sv_old) +coin=random('uniform',0,1); +sv=sv_old; +if sv_old==5 %simulate satellite loss of visibility + if coin>0.95 + sv=6; + end + if coin<0.1 + sv=4; + end +end +if sv_old==4 %simulate satellite loss of visibility + if coin>0.9 + sv=5; + end + if coin<0.0005 + sv=3; + end +end +if sv_old==3 %simulate satellite loss of visibility + if coin>0.5 + sv=4; + end +end +if sv_old==6 %simulate satellite loss of visibility + if coin<0.2 + sv=5; + end +end +end diff --git a/matlab/gps_randomized.m b/matlab/gps_randomized.m new file mode 100644 index 0000000000000000000000000000000000000000..83e4067589f2caf0272fd70182e2dd163ffe8bf3 --- /dev/null +++ b/matlab/gps_randomized.m @@ -0,0 +1,166 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% GPS sensor dynamics %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%STATE is a struct (called sensor) with the following fields +% state -[string]the current proceural state: no_info, cold_start, read_ephemeris, +% position_available, warm_start_avaialable, warm_start +% fetchfp -[double]at what time freq and phase will be fetched (according to the random extraction) +% geteph -[double]at what time eph data will be acquired (according to the random extraction) +% ephExp -[double]expiration time of ephemeris data +% fp -[int]number of tracked satelliets +% eph -[int]number of satellites for which ephemeris data are available + +%INPUTS +% -time +% -state +% -turn on/off (true=turn_ON, false=turn_OFF) +% -visible satellites + +%OUTPUTS +% -state + +%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function sensor=gps_randomized(time,sensor_in,turn,sv) + +%% parameters +%define how many satellites you need to track given the accuracy requirements +required_sv= 4; +%define how long ephemeris data last +ephDuration=1800.0; +%bounds for time required for fetching freq and phase +fp_lower=0.02; +fp_upper=0.1; + +%% initialize output +sensor = sensor_in; + +%% equations +%you cannot track satellites that you dont see +sensor.fp=min(sensor_in.fp,sv); +sensor.eph=min(sensor_in.eph,sv); + +%% events +ephemeris_expired=(time>sensor.ephExp)||(sensor.eph<required_sv); %ephemeris data are expired +lost_visibility=(sensor_in.fp~=sensor.fp)&&(sensor.fp<required_sv); +fetched_fp=time>=sensor.fetchfp; +get_ephemeris=time>sensor.geteph; + +%% transitions and updates +%for each of the states handle eventual transitions and updates +%updates depend on the spefic transition that is fired +if strcmp(sensor_in.state,'no_info') + if(turn) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + end +end +if strcmp(sensor_in.state,'position_available') + if(get_ephemeris) + sensor.state='position_available'; + sensor.geteph=time+random('uniform',30,60); + sensor.eph=sv; + sensor.ephExp=time+ephDuration; + end + if(lost_visibility) + sensor.state='warm_start'; + sensor.fp=0; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + %might have to go on to cold_start + if(ephemeris_expired) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + sensor.eph=0; + end + end + if(ephemeris_expired) + sensor.state='read_ephemeris'; + sensor.eph=0; + sensor.geteph=time+random('uniform',30,60); + %might have to go on to cold_start + if(lost_visibility) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + end + end + if(~turn) + sensor.state='warm_start_available'; + sensor.fp=0; + end +end +if strcmp(sensor_in.state,'read_ephemeris') + if(lost_visibility) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + end + if(get_ephemeris) + sensor.state='position_available'; + sensor.geteph=time+random('uniform',30,60); + sensor.eph=sv; + sensor.ephExp=time+ephDuration; + end + if(~turn) + sensor.state='no_info'; + sensor.fp=0; + end +end +if strcmp(sensor_in.state,'warm_start') + if(lost_visibility) + sensor.state='warm_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + %might have to go on to cold_start + if(ephemeris_expired) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + sensor.eph=0; + end + end + if(fetched_fp) + sensor.state='position_available'; + sensor.geteph=time+random('uniform',30,60); + sensor.fp=sv; + end + if(ephemeris_expired) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + sensor.eph=0; + end + if(~turn) + sensor.state='warm_start_available'; + sensor.fp=0; + end +end +if strcmp(sensor_in.state,'cold_start') + if(fetched_fp) + sensor.state='read_ephemeris'; + sensor.geteph=time+random('uniform',30,60); + sensor.fp=sv; + end + if(lost_visibility) + sensor.state='cold_start'; + sensor.fetchfp=time+random('uniform',fp_lower,fp_upper); + end + if(~turn) + sensor.state='no_info'; + sensor.howLong=time; + sensor.fp=0; + end +end +if strcmp(sensor_in.state,'warm_start_available') + if(turn) + sensor.state='warm_start'; + sensor.howLong=time; + end + if(ephemeris_expired) + sensor.state='no_info'; + sensor.eph=0; + end +end + +end + + + + +