Small Satellites

Home » Featured

Category Archives: Featured

Distance Transform Path Planning Algorithm

clc;close all;clear all;

Input Map

RGB = imread('Mapn.png');
figure('Position',[600 0 600 1000],'color','k');
image(RGB);
hold on;
axis off
axis image
hold off;
% Convert to binary image matrix and inverse matrix values
I = rgb2gray(RGB);
binaryImage = im2bw(RGB, 0.3);
binaryImage = 1-binaryImage;
% Inital pose
xs = 540; ys = 750;
% Goal Pose
xg = 150; yg = 150;

dist_01

Distance to Goal

sz  = size(binaryImage);
for i = 1:sz(1)
    for j = 1:sz(2)
       rg(i,j) = sqrt((i-yg)^2 +(j - xg)^2);
      end
end
% Pose Matrix
pose = zeros(sz(1),sz(2));
pose(ys,xs) = 1;
pose(yg,xg) = 1;
Di = 15; % Distance of influence of the obstacles
% Compute for every pixel the distance to the nearest obstacle(non zero
% elements which after inversion corespondent to the obstacles)
[D,IDX] = bwdist(binaryImage);
for i = 1:sz(1)
    for j = 1:sz(2)
        rd = D(i,j);
        if (rd <= Di)
            rg(i,j)  = 1e6;
        end
    end
end

Distance Transform Path Planning Algorithm

figure('Position',[600 0 600 1000],'color','k');
hold on;
image(RGB);
colormap gray
contour(rg,15);
spy(pose,'*r');
axis off
axis image
title('Distance Transform Path Planning Algorithm','color','w');
x = xs; y = ys;
last = rg(y-1,x-1);
while (x ~= xg)||(y ~= yg)
    dis =[ rg(y-1,x-1), rg(y-1,x),rg(y-1,x+1);
        rg(y,x-1), rg(y,x) ,rg(y,x+1);
        rg(y+1,x-1), rg(y+1,x),rg(y+1,x+1)];
     m = min(dis(:));
     [r,c] = find(dis == m);
   rg(y,x) = 1E6;
   y = y-2+r;
   x = x-2+c;
   pose(y,x) = 1;
  end
spy(pose,'.r');
set(gcf, 'InvertHardCopy', 'off');
hold off;

dist_02

Voronoi Road Map, Path Planing

clc;close all;clear all;

Input Map

RGB = imread('Map.png');
figure('Position',[100 0 600 700],'color','k');
imagesc(RGB);
axis image
title('Input Map','color','w');
axis off
set(gcf, 'InvertHardCopy', 'off');
hold off;

voron_01

Convert to binary image matrix and inverse matrix values

I = rgb2gray(RGB);
binaryImage = im2bw(RGB, 0.3);
sz  = size(binaryImage);

Inital pose

xs = 225; ys = 355;
% Goal Pose
xg = 50; yg = 50;
% Pose Matrix
pose = zeros(sz(1),sz(2));
pose(ys,xs) = 1;
pose(yg,xg) = 1;

Voronoi Road Map

figure('Position',[100 0 600 700],'color','k');
hold on;
set(gcf, 'InvertHardCopy', 'off');
sk = 1;
for i = 1:sz(1)
    for j = 1:sz(2)
         if(binaryImage(i,j) == 1 )
     xv(sk) = j;
     yv(sk) = i;
     sk = sk+1;
         end
    end
end
[vrx,vry]  = voronoi(xv,yv);
set(gca,'YDir','Reverse');
plot(xv,yv,'y.',vrx,vry,'b-');
axis tight
%axis([1 sz(2) 1 sz(1) ]) ;
axis image
title({'Voronoi Road Map';
'* - Represents Starting and Goal Position '},'color','w');
axis off
spy(pose,'*r');

voron_02

Robot Path

x = xs; y = ys;
indk = 1;
while (abs(x - xg) > 5)||(abs(y - yg)> 5)
path(:,indk) = [x y];
dist = sqrt((vrx - x).^2+(vry - y).^2);
goal = sqrt((xg - x).^2+(xg - y).^2);
% Find closest vertices of the Voronoi edges
[mn ind] = min(dist(:));
xt = vrx(ind);
yt = vry(ind);
goalj = sqrt((xg - xt).^2+(xg - yt).^2);
if (goalj < goal )
x = xt;
y = yt;
vrx(ind) = 1E6;
vry(ind) = 1E6;
indk = indk +1;
else
vrx(ind) = 1E6;
vry(ind) = 1E6;
end
end
path(:,indk) = [xg yg];
plot(path(1,:),path(2,:),'-r');
title({'Voronoi Road Map and Robot Path';
'* - Represents Starting and Goal Position '},'color','w');

voron_03

 

Potential Field Path Planning

clc;close all;clear all;

Input Map

RGB = imread('Mapn.png');
figure('Position',[600 0 600 1000],'color','k');
image(RGB);
hold on;
axis off
axis image

potential_01

Convert to binary image matrix and inverse matrix values

I = rgb2gray(RGB);
binaryImage = im2bw(RGB, 0.3);
binaryImage = 1-binaryImage;
% Inital pose
xs = 540; ys = 750;
% Goal Pose
xg = 150; yg = 150;

Attractive potential

sz  = size(binaryImage);
for i = 1:sz(1)
    for j = 1:sz(2)
       rg = sqrt((i-yg)^2 +(j - xg)^2);
       U_att(i,j) = 0.5*rg^2;
    end
end
contour(U_att,40);

set(gcf, 'InvertHardCopy', 'off');
% Pose Matrix
pose = zeros(sz(1),sz(2));
pose(ys,xs) = 1;
pose(yg,xg) = 1;
spy(pose,'*r');
title({'Attractive Potential Field';...
   'Circles Center Corespondents to the Goal Position '},'color','w');
hold off;

potential_02

Repulsive potential

Di = 35; % Distance of influence of the object
% Compute for every pixel the distance to the nearest obstacle(non zero
% elements which after inversion corespondent to the obstacles)
[D,IDX] = bwdist(binaryImage);
for i = 1:sz(1)
    for j = 1:sz(2)
        rd = D(i,j);
        if (rd <= Di)
            U_rep(i,j)  = 0.5*(rd - Di)^2;
        else
            U_rep(i,j)  = 0;
        end
    end
end
figure('Position',[600 0 600 1000],'color','k');
hold on;
colormap jet;
contourf(U_rep,5);
spy(pose,'*r');
axis off
axis image
set(gcf, 'InvertHardCopy', 'off');
title('Repulsive Potential Field','color','w');
hold off;

potential_03

Summary Potential Field

k_s  = 2; % Scaling factor
U_sum = U_rep/max(U_rep(:))+k_s*U_att/max(U_att(:));
figure('Position',[600 0 600 1000],'color','k');
hold on;
contourf(U_sum,15);
spy(pose,'*r');
axis off
axis image
title('Summary Potential Field','color','w');
set(gcf, 'InvertHardCopy', 'off');
hold off;

potential_04

Potential Field Path Planning

figure('Position',[600 0 600 1000],'color','k');
hold on;
contourf(U_sum,15);
spy(pose,'*r');
axis off
axis image
title('Potential Field Path Planning,*Note the Potential Trap','color','w');
x = xs; y = ys;
last = U_sum(y-1,x-1);
while (x ~= xg)||(y ~= yg)
    dis =[ U_sum(y-1,x-1), U_sum(y-1,x),U_sum(y-1,x+1);
        U_sum(y,x-1), U_sum(y,x) ,U_sum(y,x+1);
        U_sum(y+1,x-1), U_sum(y+1,x),U_sum(y+1,x+1)];
     m = min(dis(:));
     [r,c] = find(dis == m);
   U_sum(y,x) = inf;
   y = y-2+r;
   x = x-2+c;
   pose(y,x) = 1;
  end
spy(pose,'.r');
set(gcf, 'InvertHardCopy', 'off');
hold off;

potential_05

 

Computing a Skeleton of a Map for Mobile Robots,Path Planning

clc;close all;clear all;

Input Map

RGB = imread('Map1.png');
figure('Position',[0 0 800 800]);
imshow(RGB);

Robot Map1

Convert to binary image matrix and inverse matrix values

I = rgb2gray(RGB);
binaryImage = im2bw(RGB, 0.3);
binaryImage = 1-binaryImage;
figure('Position',[0 0 800 800]);
imshow(binaryImage);
Warning: Image is too big to fit on screen; displaying at
50%

Robot Map 1

Compute for every pixel the distance to the nearest obstacle(non zero elements which after inversion corespondent to the obstacles)

[D,IDX] = bwdist(binaryImage);
figure('Position',[0 0 800 800],'color','k')
colormap bone
image(D);
axis off          % Remove axis ticks and numbers
axis image
set(gcf, 'InvertHardCopy', 'off');

Robot Map 3

Taking the Laplacian of the distance transform. Play with the treshold value 0.15 to remove or add more futures in skeleton

lap = del2(D);
sz  = size(lap);
for i = 1:sz(1)
    for j = 1:sz(2)
         if( abs(lap(i,j)) < 0.15)
       lap(i,j) = 0;
    end
    end
end
lap = flipdim(lap ,1);           %# vertical flip
figure('Position',[0 0 800 800],'color','k');
colormap winter;
contour(lap,'DisplayName','lap');
axis off
axis image
set(gcf, 'InvertHardCopy', 'off');

 

Mesosphere-Stratosphere-Troposphere(MST) Radar Data Analysis

In this example we  analyse data  from MST (mesosphere-stratosphere-troposphere) radar observations. MST radars used to do observation of the dynamics of the lower and middle atmosphere to study winds, waves, turbulence and instabilities generate irregularities in the atmosphere. The reflected radar signals from the random irregularities are collected by the receiver antenna. The return signal strength is highly depending on the refractive index which is a function of atmospheric parameters such as humidity, temperature, and pressure and electron density. Hence those parameters will highly affect the signal to noise ratio (SNR). Input data file structure {UT, Altitude,Signal amplitude (linear),Signal-to-noise ratio (SNR), dB, Zonal wind, m/s, Meridional wind, m/s}

clear all; clc; close all;
% Data files name ID
fl = {'150 m height resolutions';
      '1200 m height resolutions';
      'Barker Coding';
      'Complementary Coding';
      'Uncoded Data';
    };
% Files for three different observation days
fid  = { 'TXT_20061211_test1.fca','TXT_20071010_test1.fca',...
                    'TXT_20081014_test1.fca';   % 150 m height resolutions
        'TXT_20061211_test2.fca','TXT_20071010_test2.fca',...
                    'TXT_20081014_test2.fca';   % 1200 m height resolutions
       'TXT_20061211_test3.fca','TXT_20071010_test3.fca',...
                    'TXT_20081014_test3.fca';   % Barker coding
        'TXT_20061211_test4.fca','TXT_20071010_test4.fca',...
                    'TXT_20081014_test4.fca';   % Complementary coding
        'TXT_20061211_test5.fca','TXT_20071010_test5.fca',...
                    'TXT_20081014_test5.fca';   % Uncoded data
};
dates = ['2006 Dec 11'; '2007 Oct 10'; '2008 Dec 14' ];

SNR value as a function of universal time and altitude for three different observation days

fs = size(fid,1);
fd = size(fid,2);
for jd = 1:fd
    for id = 1:fs
        clear SNR;
        fname = fid{id,jd};
        data    = load(fname);
        time    = unique(data(:,1));
        alt     = unique(data(:,2));
        size_t  = size(time,1);
        size_a  = size(alt,1);
        % Signal-to-noise ratio (SNR), dB
        for i = 1:size_a
            for j = 1:size_t
                    SNR(i,j)= data(i+((j-1)*size_a),4);
            end
        end
        % Plot
        if(id > 2 )
            FigHandle = figure(2);
            hold on;
            ii = id - 2;
            subplot(3,3,ii+(jd-1)*3);
            colormap(jet);
            pcolor(time,alt,SNR);
            shading flat;
            caxis([-25,30]);
            if(id == 5)
             colorbar;
            end
            if(id == 3)
                ylabel('Altitude [km]');
            end
            if((id == 4))
                xlabel(['UT/Date: ',dates(jd,:) ]);
            end
                if((jd == 1)&&(id == 4) )
                    title(['Signal-to-Noise Ratio(SNR) [dB]', fl(id)]);
                else
                       if(jd == 1)
                           title(fl(id));
                       end
                end
            set(FigHandle, 'Position', [100, 0, 800, 800]);
           else
                FigHandle = figure(1);
                hold on;
                subplot(3,2,id+(jd-1)*2);
                colormap(jet);
                pcolor(time,alt,SNR);
                shading flat;
                caxis([-25,30]);
                if(id == 2)
                    colorbar;
                end
                if(id == 1)
                    ylabel('Altitude [km]');
                end
                xlabel(['UT/Date: ',dates(jd,:) ]);
                if((jd == 1))
                    title(['Signal-to-Noise Ratio(SNR) [dB]', fl(id)]);
                end
            set(FigHandle, 'Position', [100, 0, 600, 800]);
        end
    end
endSR_mod2_01 SR_mod2_02

Magnitude and direction of horizontal winds

The figures below provide the horizontal wind variation over the altitude and universal time for three different days. The direction of the wind is mostly from west to east. The results are expected as the wind in this layer of atmosphere moves west to east because of the Coriolis acceleration due to force caused by the rotation of the earth.

clear all; clc; close all;
dates = ['2006 Dec 11'; '2007 Oct 10'; '2008 Dec 14' ];
% Data files name ID
fid = {'TXT_20061211_test4.fca','TXT_20071010_test4.fca',...
                    'TXT_20081014_test4.fca' };     % Complementary coding
% Radar with Complementary coding
for id = 1:3
data   = load(fid{id});
time   = unique(data(:,1));
alt    = unique(data(:,2));
size_t = size(time,1);
size_a = size(alt,1);
% Signal-to-noise ratio (SNR), dB
for i = 1:size_a
    for j = 1:size_t
            zWind(i,j)= data(i+((j-1)*size_a),5); % Zonal Wind, East
            mWind(i,j)= data(i+((j-1)*size_a),6); % Meridional Wind, North
    end
end
hWind = sqrt(zWind.^2 + zWind.^2);       % Horizontal Wind [m/s]
%dWind=  atan2(zWind,mWind)*180/pi + 180; % Wind Direction angle, Zero in North direction
a_max = 60;
a_min = 30;
FigHandle = figure(2 + id);
set(FigHandle, 'Position', [100, 0, 800, 400]);
subplot(2,2,[1 3]);
colormap(cool);
pcolor(time,alt(1:a_max),hWind(1:a_max,:));
shading flat;
colorbar;
xlabel(['UT/Date:',dates(id,:)]);
ylabel('Altitude [km]');
title('Horizontal wind speed [m/s], Complementary coded signal');
subplot(2,2,[2 4]);
hold on;
whitebg([0.0 .0 .2]);
quiver(time,alt(1:a_max),zWind(1:a_max,:),mWind(1:a_max,:),'r');
%contour(time,alt(1:a_max),hWind(1:a_max,:));
xlabel(['UT/Date:',dates(id,:)]);
title('Horizontal wind direction(top - North,right - East)');
axis([min(time),max(time),min(alt(1:a_max)),max(alt(1:a_max))]);
hold off;
end

 

%d bloggers like this: