Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Publicaciones     Mapa     Buzón     Sobre el autor      

 Una conducta utilizando el Khepera

 

La descripción del vehículo autónomo Khepera II se encuentra en este enlace. Se presenta a continuación un programa en Matlab que permite adquirir y reproducir una conducta (seguir una pared). El método aquí descrito puede generalizarse para implementar otras conductas basadas en el control por modelo inverso.

% Con este programa se adquieren datos para reproducir un comportamiento
% Conexión con el robot

ref = kopen([0,9600,1])

 

% Velocidad inicial de las ruedas
vi = 3;

vd = 3;
N=300; % Número de datos a adquirir

%Inicializa las variables para la adquisición
infrarrojos=zeros(N,8); % Tamaño de matrices
vel=zeros(N,2);

% Condiciones iniciales: Igual velocidad a ambas ruedas
kSetSpeed(ref, vi, vd);
for i=1:N      % Se toman N muestras

% Se leen sensores
infrarrojos(i,:)=kProximity(ref)';

% En este ejemplo en particular se sigue una pared
% Utiliza información de sensores 1 y 7
if ((infrarrojos(i,5)>300)||(infrarrojos(i,7)<100))
vd=1.2*vi;
vi=0.8*vi;


if ((vi>4)||(vd<2))  %Saturador
vi=3;
end
end

% Aplica velocidad a cada rueda
kSetSpeed(ref, vi, vd);

vel(i,:)=[vi,vd]; % Reales aplicados
if ((infrarrojos(i,7)>150)||(infrarrojos(i,5)<200))
vi=1.2*vd;
vd=0.8*vd;
if ((vi>4)||(vd<2)) %Saturador
vi=3;
end
end
kSetSpeed(ref, vi, vd);

vel(i,:)=[vi,vd]; % Se definen en la matriz los reales aplicados
% Si se desean los medidos se aplicaría:
%vel(i,:)=kGetSpeed(ref)';
end

% Se conforman las matrices para obtener modelo (anfis)
vel_i=[infrarrojos(:,5), infrarrojos(:,7), vel(:,1)];
vel_d=[infrarrojos(:,5), infrarrojos(:,7), vel(:,2)];

 

% Se detiene el robot
kSetSpeed(ref, 0, 0);

Para obtener el modelo del anterior comportamiento, basado en los datos, puede utilizar el siguiente programa.

% Ejemplo de como obtener un modelo de comportamiento
% Se definen las condiciones iniciales de
% un sistema borroso
%FIS = GENFIS1(DATA, NUMMFS, INPUTMF, OUTPUTMF)

FIS_vel_i=genfis1(vel_i, 7, 'gbellmf');
FIS_vel_d=genfis1(vel_d, 7, 'gbellmf');


% Adapta parámetros para obtener el modelo
modelo_vel_i = anfis(vel_i,FIS_vel_i,450);
modelo_vel_d = anfis(vel_d,FIS_vel_d,450);

% Verifica modelo real y estimado
plot(vel_i(:,3),'g');
hold on;
plot(evalfis(vel_i(:,1:2),modelo_vel_i),'r');
figure;
plot(vel_d(:,3),'g');
hold on;

Finalmente, se aplica el modelo obtenido como ley de control.

% Se aplica ley de control basado en modelo
% Velocidad inicial

a=3;
infrarrojosc=zeros(1,8); %tamaño de lectura de sensores

%Igual velocidad a ambas ruedas
kSetSpeed(ref, a, a);


while 1
infrarrojosc=kproximity(ref)';
% Se limita entradas
if (infrarrojosc(1,5)>max(infrarrojos(:,5)))
infrarrojosc(1,5)=max(infrarrojos(:,5));
end
if (infrarrojosc(1,5)infrarrojosc(1,5)=min(infrarrojos(:,5));
end
if (infrarrojosc(1,7)>max(infrarrojos(:,7)))
infrarrojosc(1,7)=max(infrarrojos(:,7));
end
if (infrarrojosc(1,7)infrarrojosc(1,7)=min(infrarrojos(:,7));
end
infrarrojos_r=[infrarrojosc(1,5), infrarrojosc(1,7)];

vi=evalfis(infrarrojos_r,modelo_vel_i);
if ((vi<2)||(vi>4))
vi=3;
end

vd=evalfis(infrarrojos_r,modelo_vel_d);
if ((vd<2)||(vd>4))
vd=3;
end

kSetSpeed(ref, vi, vd); % aplica ley de control
end