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


domingo, 2 de febrero de 2014

MATLAB Matriz exponencial via laplace

Este script es para encontrar la matriz exponencial de una matriz cuadrada via la transformación de lapace utilizando MATLAB.

% ****************************************************************************
% * Este script encuentra la matriz exponencial y la solución de la matriz A *
% *            Hecho por Jonathan Israel Hernández Hernández                 *
% *                   Nospherathuxxx.blogspot.mx                       *
% ****************************************************************************
clc;clear all;close all; 
disp('Matriz exponencial y la solución de la matriz A')
disp(' ')
q=input('Ingrese la dimención de la matriz A: ');
A=zeros(q);
for i = 1:q       
    for j = 1:q   
        A(i,j) = input(strcat('Ingrese valor numerico de A (',num2str(i),',',num2str(j),') : '));
    end 
    xo(i,1) = input(strcat('Ingrese valor numerico de Xo (',num2str(i),',1) : '));
end
syms s
s1=inv(s.*(eye(q))-A);
disp('La matriz (SI-A)^-1 es: ')
pretty(simplify(s1))
s2=ilaplace(s1);
disp('La matriz e(At) es: ')
pretty(s2)
s3=s2*xo;
for k = 1:q
   strcat('El valor de X(', num2str(k),') = ')
   pretty(s3(k,1))
end
clear all;close all;

MATLAB Hallar los Eigenvectores de una matriz

En este ejemplo se muestra como encontrar los eigenvalores, la transformación diagonal y los eigenvectores de una matriz cuadrada si y solo si los eigenvalores son diferentes de cero y deferentes de si mismos, si no es así el resultado sera erróneo.

MATLAB regresa los valores de los vectores propios de una manera peculiar, sin embargo la realización de  este script se trata de que los vectores propios sean de preferencia números enteros reales como en la mayoría de ejemplos de los libros de álgebra lineal y control automático.

% ************************************************************************
% * Este script encuentra los eigenvalores y eigenvectores de una matriz *
% *          Hecho por Jonathan Israel Hernández Hernández               *
% *               Nospherathuxxx.blogspot.mx                      *
% ************************************************************************
clc;clear all;close all; 
disp('Eigenvalores y Eigenvectores de una matriz')
disp(' ')
q=input('Ingrese la dimención de la matriz A: ');
A=zeros(q);
for i = 1:q       
    for j = 1:q   
        A(i,j) = input(strcat('Ingrese valor numerico de A (',num2str(i),',',num2str(j),') : '));
    end 
end
[vec,val]=eig(A);
('los eigenvalores de la matriz son: ')
L=diag(val)
V=zeros(q);
for k = 1:q
    s1=(vec(:,k));
    s2=(min(abs(s1)));
    if (s2 == 0)
        s2= (max (abs (s1)));
    end
     for n=1:q
         s3(n,1)=( s2 == s1(n,1));
     end
     s4=sum(s3');
     if (s4 == 0)
         vp=(-1/s2).*vec(:,k);
     else
         vp=(1/s2).*vec(:,k);
     end
     for h = 1:q
         V(h,k)=vp(h,1);
     end
end
('los eigenvectores de la matriz son: ')
V
clear all;close all;

MATLAB Solución de ecuaciones lineales

En matemáticas y álgebra lineal, un sistema de ecuaciones lineales, también conocido como sistema lineal de ecuaciones o simplemente sistema lineal, es un conjunto de ecuaciones lineales (es decir, un sistema de ecuaciones en donde cada ecuación es de primer grado). Donde se busca hallar los valores de X1,X2,...,Xn.

En este ejemplo se  muestra un script en MATLAB para resolver sistemas de ecuaciones lineales.

% ********************************************************
% * Este script resuelve Sistemas de Ecuaciones Lineales *
% *    Hecho por Jonathan Israel Hernández Hernández     *
% *         Nospherathuxxx.blogspot.mx          *
% ********************************************************
clc;clear all;close all;
disp('Solución de Sistemas de Ecuaciones Lineales')
disp(' ')
q=input('Ingrese la dimención de la matriz A: ');
A=zeros(q);
for i = 1:q      
    for j = 1:q  
        A(i,j) = input(strcat('Ingrese valor numerico de A (',num2str(i),',',num2str(j),') : '));
    end
    b(i,1) = input(strcat('Ingrese valor numerico de B (',num2str(i),',1) : '));
end
x=A\b;
for k = 1:q
   strcat('El valor de X(', num2str(k),') = ',num2str(x(k,1)),'')
end
clear all;close all;

viernes, 3 de enero de 2014

Photoshop CS6 Cambiar y extraer fondo a una imagen

Las herramientas en PCS6 para esta tarea son variadas, sin embargo explicare la que a mi parecer es la mas fácil sin importar la complejidad para imágenes con fondos de un solo color, en este caso usare una con fondo blanco y le pondremos uno mas vistoso.

Primeramente abriremos Photoshop CS6, en algunos equipos nos muestra una alerta diciendo que la tarjeta de vídeo no es compatible, le daremos OK. Podemos abrir la imagen pero en este caso nos iremos al menú archivo, nuevo o ctrl+N. Después ingresaremos el nombre del archivo, la anchura, la altura y la resolución y le daremos OK.

Regresaremos al menu archivo y seleccionamos colocar. elegimos el path donde se encuentra nuestra imagen y después ajustamos de acuerdo a las dimensiones dadas al inicio de archivo.


Posteriormente nos dirigimos a canales y seleccionamos el que mejor contraste haga con el fondo, y duplicamos la capa, para este ejemplo utilice el azul. Para duplicar la capa solo hay que seleccionarla y arrastrarla hacia abajo a crear canal nuevo y que aparece el icono de una hoja.


Una vez hecho esto, teclearemos ctrl+L y nos abrirá la ventana de niveles, esto para crear un mejor contraste, solamente tendremos que desplazar del primer slider hasta obtener el contraste que uno quisiera.


Si no se obtuvo el contraste deseado podemos ayudarnos para retocar la imagen de la herramienta subexponer. En la opción rango marcar sombras y seleccionar las áreas a contrastar. 


Teniendo ya la imagen con el contraste optimo presionaremos la tecla crtl y seleccionamos la capa duplicada, esto para hacer una selección de la figura en obscuro. 


Regresamos a capas y duplicamos para salva guardar la original, después  la ocultamos y crearemos una mascara de capa. La cuál seleccionara la superficie de la figura en obscuro.


Presionando ctrl+I invertiremos el enmascarado de capa y así ya tendremos lista nuestra imagen ya que le hemos extraído el fondo que tenia.


Por ultimo solo abriremos la imagen de fondo que debera tener las mismas dimenciones que la editada y la arrastramos hacia la pestaña donde se encuentra. Solamente ponerla debajo de la capa con la mascara y así habremos finalizado.


Guardamos la imagen con el formato original de PCS6 *.PSD o en el formato que nosotros deseamos: *.EPS, *.JPG, *.PNG etc. 



martes, 31 de diciembre de 2013

Importar modelos CAD de Solidworks a Matlab

Simmechanics es una herramienta dentro del software Matlab, el cuál proporciona un entorno de simulación multicuerpo para sistemas mecanicos 3D. Esta herramienta ha ido evolucionando desde su aparición y asi mismo su instalación. En este tema explicare como hacer la vinculación entre la versión Matlab 2013b y Solidworks 2013 SP0.

Primeramente descargar los 2 archivos de intalación de la pagina de descargas de Matworks correspondiente a la versión de matlab instalada, la versión de solidworks instalada y la arquitectura de windows en su PC.


En mi caso,  SimMechanics Link 4.3 – Release 2013b (SimMechanics 4.3)  para Solidworks en  windows 7 a 64 bits

Posteriormente, no descomprimir el zip descargado, desde la command window de Matlab invocar el siguiente comando (Estos archivos deben de estar en el directorio de busqueda, si no es asi desplazarce a donde se encuentran y  posteriormente invocar el comando).

install_addon('smlink.r2013b.win64.zip')

Despues ir a Solidworks y en complementos, marcar SimMechanics Link.

Despues de Marcar esta opción, nos regresamos a Matlab y ingresamos el siguiente comando para registrar la aplicación.

smlink_linksw

Para poder exportar el ensamble, primeramente hay que registrar Matlab como un servidor de automatización. Esto se hace ingresando los siguientes comandos.

regmatlabserver

enableservice('AutomationServer',true)

Por ultimo, regresaremos a solidworks y nos aparecera un menu para exportar el ensambles a *.xml. (Este menú solo aparecera en ensambles).


Podremos exportar a primera generación o segunda generación el ensamble deseado. Finalmente en Matlab ingresar el siguiente comando para que convierta el archivo *.xml y los visualicemos en Simulink.

mech_import('Assambly.xml') % Primera generación

smimport('Assambly.xml') % Segunda generación




sábado, 23 de noviembre de 2013

Encendido y apagado de un led utilizando ARDUINO UNO

-Este es el mas claro ejemplo básico equivalente al "hola mundo" de cualquier lenguaje de  programación haciendo simplemente el encendido y apagado de un led utilizando una tarjeta ARDUINO UNO. En este pequeño ejemplo  el LED está conectado en el pin13 y este se encenderá y apagara cada segundo. La  resistencia que se debe colocar en serie con el led en este caso puede omitirse ya que el  pin13 de Arduino ya incluye en la tarjeta esta resistencia integrada.
-El esquema de como conectar se muestra a continuación.


-La programación en ARDUINO es bastante sencilla, solo se necesitara de al menos 2 partes, un void setup y un void loop, dentro de estas funciones vacías estarán los estamentos para el programa, para el primer caso es donde se recoge la configuración entrada-salida y la segunda donde se ejecutara el bucle cíclicamente. 
-El código necesario para este pequeño ejemplo se muestra a continuación. 


/*
-Este es un ejemplo para encender y apagar un led
-Utilizando una placa arduino UNO
-Hecho por Ing. Jonathan Israel Hernández Hernández
Nospherathuxxx.blogspot.mx
*/
int LedPin=13; // LED en el pin digital 13
void setup()  // Configurar pin de salida 
{
  pinMode(LedPin, OUTPUT); // Configurar pin 13 como salida
}
void loop() // Inicia bucle de programa principal
{
  digitalWrite(LedPin, HIGH); // Activa led
  delay(1000); // Espera 1 segundo
  digitalWrite(LedPin, LOW); //desactiva led
  delay(1000); // Espera 1 segundo
}