sábado, 17 de diciembre de 2016

Matriz de rotación en el plano de un vector usando un objeto slide en Matlab

Para convertir de un sistema  de coordenadas a otro mediante rotaciones alrededor de los ejes de rotación es necesario el uso de herramientas que nos faciliten conocer las coordenadas geometricas finales de un mecanismo  abierto o de un robot. Las Las matrices de rotación definen algebraicamente lo que es una rotación en un espacio 3D considerando un angulo en el que está girando. 

En este ejemplo se muestra un vector en el plano posicionado desde el marco de referencia (0,0) al punto p1(10,10), dicho vector rotará respecto a un eje de rotación el cual nosotros podemos elegir al invocar el comando principal de nuestro programa, al ser en el plano consideramos que la rotación es en el eje Z, por lo que se utiliza una matriz de rotación-Z que se multiplica por el vector de posición inicial. Adicionalmente se agrego un objeto tipo slide en matlab para que el usuario lo desplace a lo largo de el desde la posición -pi a pi. En el espacio de trabajo de Matlab se muestra el angulo en grados y la coordenada del punto X y Y respectivamente.






Este es un ejemplo muy básico de una matriz de rotación utilizadas en mecanismos y cinematica de robot. Tambien se muestra de manera mas clara que es el espacio de trabajo diestro y alcanzable en base al pivote de rotación que el usuario puede modificar al inicio del programa.

 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Funcion: rotacion_en_el _plano
%%% Programa que realiza rotaciones en el plano utilizando matrices de
%%% rotacion para un vector.
%%% Materia = Robotica
%%% Instituto Tecnologico de Atitalaquia
%%% Jonathan Israel Hernández Hernandez @ dic 2016
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function rotacion_en_el_plano(pr) % pr= nodo de rotacion en el plano
% Limpiar espacio de trabajo
clc;close all
% definir la pocicion inicial del punto x e y
x = 0:10;
y = 0:10;
% Punto de rotacion del vector
nd=pr;
% Definir en forma matricial el vector P
p = [x;y];
% Obtener el centro de rotación del vector P
x_cent = x(nd);
y_cent = y(nd);
% Re mapear el centro de rotacion en el vector P
cent = repmat([x_cent; y_cent], 1, length(x));
% Deinir la condicion inicial del angulo en el vector P
theta = 0;     
% Calcular la matriz de rotacion para el vector P
R = [cos(theta) -sin(theta); sin(theta) cos(theta)];
% Obtener el centro del vector P
vo = R*(p - cent) + cent;
% Se obtinene el vector para la posición en Px y Py
x_rotatacion = vo(1,:);
y_rotatacion = vo(2,:);
% Se define el objeto figura
f = figure;
set(f,'name','Matriz de rotación - Robotica - ITAt','numbertitle',...
    'off','color', 'w','menubar','none') ;
% Se obtiene el espacio de trabajo
mag=sqrt(10^2+10^2);
ang=0:0.01:2*pi;
xp=mag*cos(ang);
yp=mag*sin(ang);
% Graficar Vectores
plot(x, y, 'm-', x_rotatacion, y_rotatacion, 'g-',...
     x_cent, y_cent, 'ro', xp, yp, 'b');
% Parametros de diseño en el plot
axis([-20 20 -20 20]);
grid on
xlabel('Eje x')
ylabel('Eje y')
title('Rotacion en el plano - Robotica')
legend('Vector original','Vector con rotación',...
       'Nodo de rotación','Espacio de trabajo')
% Definir controles en el objeto figura
b = uicontrol('Parent',f,'Style','slider','Position',[85,57,419,23],...
       'value',0, 'min',-3.1416, 'max',3.1416,'Callback', @sliderCallback);
bgcolor = f.Color;
bl1 = uicontrol('Parent',f,'Style','text','Position',[85,85,23,23],...
                'String','-pi','BackgroundColor',bgcolor);
bl2 = uicontrol('Parent',f,'Style','text','Position',[480,85,23,23],...
                'String','pi','BackgroundColor',bgcolor);
bl3 = uicontrol('Parent',f,'Style','text','Position',[240,85,100,23],...
                'String','Theta','BackgroundColor',bgcolor);      
% Obtención de información en el objeto slide    
 function sliderCallback(hObj,~)
    % Se obtiene la posición actúal del slide
    theta2 = get(hObj,'Value');
    % Se calcula la matriz de rotación
    R = [cos(theta2) -sin(theta2); sin(theta2) cos(theta2)];
    % Re mapear el centro de rtación en el vector P
    vo = R*(p - cent) + cent;
    % Obtener los vectores Px y Py
    x_rotatacion = vo(1,:);
    y_rotatacion = vo(2,:);
    % Se obtiene el espacio de trabajo
    mag=sqrt(10^2+10^2);
    ang=0:0.01:2*pi;
    xp=mag*cos(ang);
    yp=mag*sin(ang);
    % Nuevo espacio de trabajo
    mag2=sqrt((10-(nd-1))^2+(10-(nd-1))^2);
    ang2=0:0.01:2*pi;
    xp2=mag2*cos(ang2);
    yp2=mag2*sin(ang2);
    % Graficar los vectores
    plot(x, y, 'm-', x_rotatacion, y_rotatacion, 'g-', x_cent, y_cent,...
     'ro', xp, yp, 'b',x(nd)+xp2,y(nd)+yp2,'y');
    % Paramatros de diseño en el plot
    axis([-20 20 -20 20]);
    grid on
    xlabel('Eje x')
    ylabel('Eje y')
    title('Rotacion en el plano - Robotica')
    legend('Location','northeastoutside','Vector original',...
    'Vector con rotación','Nodo de rotación','Espacio de trabajo Diestro',...
    'Espacio de trabajo alcanzable')
    % Obtener en consola los valores del angulo y las posiciones en x e y
    fprintf(strcat('Theta= ',num2str(theta2*180/pi), '\t', 'Px= ',...
    num2str(x_rotatacion(11)),'\t','Py= ',num2str(y_rotatacion(11)),'\n'))
 end   
% Fin del programa
end