Matlab - Problema con actualizacion de grafica en matlab

   
Vista:

Problema con actualizacion de grafica en matlab

Publicado por carlos (3 intervenciones) el 23/11/2015 18:47:25
Buen dia, tengo un problema con la grafica de un objeto tipo axes, el programa que estoy haciendo debe graficar un robot en 2 dimensiones mientras muevo el mouse, el problema es que la interfaz aunque en un inicio me muestra bien la gráfica de la posición de los eslabones del robot, luego de moverse hasta la posición final, comienza a retroceder la gráfica hasta la posición inicial, como si los datos intermedios del movimiento del mouse quedaran guardados y se ejecutaran después de los mas actuales, creo que el problema se da porque el codigo es bastante largo, pero necesito realizar todo ese proceso a partir del movimiento, como puedo hacer para evitar este problema?
A continuación adjunto el codgo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
function figure1_WindowButtonMotionFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%Xc=input('ingrese un valor entre 0 a 77 para la posicion es X\n');
%Yc=input('ingrese un valor entre 0 a 77 para la posicion es Y\n');
%phi=input('ingrese un de grados de inclinacion para el sentido del efector final\n');
mouse= get(hObject,'CurrentPoint');
Xc=(mouse(1));
Yc=(mouse(2));
 
Xc=(Xc-191)*(100/309);
Yc=(Yc-205)*(90/243);
%Xc=((Xc-191));
%Yc=((Yc-205));
phi=0;
phi=phi*(pi/180); %combierte el angulo de inclinacion phi a su forma de radianes
 
%Se establecen las dimenciones de los eslabones.
l1=40;
l2=40;
l=10;
d=100;
r=(l/2)/(cos(pi/6));
 
%PRIMERA CADENA CINEMATICA
X1=Xc-r*cos(phi+(pi/6));%obtiene la posicion en x para el eslabon dos de la primera cadena cinematica a partir de las coordenadas x del centro
Y1=Yc-r*sin(phi+(pi/6));%obtiene la posicion en y para el eslabon dos de la primera cadena cinematica a partir de las coordenadas y del centro
 
%Lo siguiete se define para poder reducir las ecuaciones posteriores
e1=-2*Y1*l1;
e2=-2*X1*l1;
e3=X1^2+Y1^2+l1-l2;
 
%Se encuentran los angulos de la junta principal de la primera cadena
%cinematica
theta1=(2*atan(((-e1)+sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi);
q1i=imag(theta1);
if(q1i==0)
    q1=theta1;
    theta2=(2*atan(((-e1)-sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi);
 
    %Obtencion del angulo de la junta pasiva (solo necesario para graficar)
    betha1=acos((X1^2+Y1^2-l1^2-l2^2)/(2*l1*l2));
    betha1=-betha1*(180/pi);
 
    %Se obtienen las matrices de rotacion y traslacion que definiran la
    %posicion de cada junta desde el marco de referencia global.
    MrotR1 = mthrot('z',theta1);
    MtrasR1_B1=mthtras([l1 0 0 0]);
    MrotB1 = mthrot('z',betha1);
    MtrasB1_A1=mthtras([l2 0 0 0]);
 
    %Matrices de transformacion homogenea que define cada junta
    R1TB1=MrotR1*MtrasR1_B1;
    R1TA1=R1TB1*MrotB1*MtrasB1_A1;
 
 
    %FIN PRIMERA CADENA
 
    %SEGUNDA CADENA CINEMATICA
    X2=X1+l*cos(phi);%obtiene la posicion en x para el eslabon dos de la segunda cadena cinematica a partir de las coordenadas x de la primera
    Y2=Y1+l*sin(phi);%obtiene la posicion en y para el eslabon dos de la segunda cadena cinematica a partir de las coordenadas y de la primera
 
    %Lo siguiete se define para poder reducir las ecuaciones posteriores
    e1=-2*(Y2)*l1;
    e2=-2*(X2-d)*l1;
    e3=(X2-d)^2+Y2^2+l1-l2;
 
    %Se encuentran los angulos de la junta principal de la segunda cadena
    %cinematica
    theta1=((2*atan(((-e1)+sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi));
    q2i=imag(theta1);
    if(q2i==0)
        q2=theta1;
        theta2=((2*atan(((-e1)-sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi));
 
        %Obtencion del angulo de la junta pasiva (solo necesario para graficar)
        betha1=acos(((X2-d)^2+Y2^2-l1^2-l2^2)/(2*l1*l2));
        betha1=-betha1*(180/pi);
 
        %Se obtienen las matrices de rotacion y traslacion que definiran la
        %posicion de cada junta desde el marco de referencia global.
        MtrasR2_Rx=mthtras([d 0 0 0]);
        MrotR1 = mthrot('z',theta1);
        MtrasR1_B1=mthtras([l1 0 0 0]);
        MrotB1 = mthrot('z',betha1);
        MtrasB1_A1=mthtras([l2 0 0 0]);
 
        %Matrices de transformacion homogenea que define cada junta
        R2TB2=MtrasR2_Rx*MrotR1*MtrasR1_B1;
        R2TA2=R2TB2*MrotB1*MtrasB1_A1;
 
 
        %FIN SEGUNDA CADENA
 
        %TERCERA CADENA CINEMATICA
        X3=X1+l*cos(phi+(pi/3));%obtiene la posicion en x para el eslabon dos de la tercera cadena cinematica a partir de las coordenadas x de la primera
        Y3=Y1+l*sin(phi+(pi/3));%obtiene la posicion en y para el eslabon dos de la tercera cadena cinematica a partir de las coordenadas y de la primera
 
        %Lo siguiete se define para poder reducir las ecuaciones posteriores
        e1=-2*(Y3-(d*sin(pi/3)))*l1;
        e2=-2*(X3-(d/2))*l1;
        e3=(X3-(d/2))^2+(Y3-(d*sin(pi/3)))^2+l1-l2;
 
        %Se encuentran los angulos de la junta principal de la tercera cadena
        %cinematica
        theta1=((2*atan(((-e1)+sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi));
        q3i=imag(theta1);
        if(q3i==0)
            q3=theta1;
            theta2=((2*atan(((-e1)-sqrt(e1^2+e2^2-e3^2))/(e3-e2)))*(180/pi));
 
            %Obtencion del angulo de la junta pasiva (solo necesario para graficar)
            betha1=acos(((X3-(d/2))^2+(Y3-(d*sin(pi/3)))^2-l1^2-l2^2)/(2*l1*l2));
            betha1=-betha1*(180/pi);
 
            %Se obtienen las matrices de rotacion y traslacion que definiran la
            %posicion de cada junta desde el marco de referencia global.
            MtrasR3_Rx=mthtras([(d/2) (d*sin(pi/3)) 0 0]);
            MrotR1 = mthrot('z',theta1);
            MtrasR1_B1=mthtras([l1 0 0 0]);
            MrotB1 = mthrot('z',betha1);
            MtrasB1_A1=mthtras([l2 0 0 0]);
 
            %Matrices de transformacion homogenea que define cada junta
            R3TB3=MtrasR3_Rx*MrotR1*MtrasR1_B1;
            R3TA3=R3TB3*MrotB1*MtrasB1_A1;
 
            hold on
            %Grafica vectores que apuntan a la posicion de cada junta.
            axes(handles.axes1);
 
            %Grafica vectores que apuntan a la posicion de cada junta.
             hold off
            %Grafica vectores que apuntan a la posicion de cada junta.
            axes(handles.axes1);
            %quiver3(0,0,0,R1TB1(1,4),R1TB1(2,4),R1TB1(3,4))
            %hold on
            %quiver3(R1TB1(1,4),R1TB1(2,4),R1TB1(3,4),R1TA1(1,4)-R1TB1(1,4),R1TA1(2,4)-R1TB1(2,4),R1TA1(3,4)-R1TB1(3,4))
            %quiver3(MtrasR2_Rx(1,4),MtrasR2_Rx(2,4),MtrasR2_Rx(3,4),R2TB2(1,4)-MtrasR2_Rx(1,4),R2TB2(2,4)-MtrasR2_Rx(2,4),R2TB2(3,4)-MtrasR2_Rx(3,4))
            %quiver3(R2TB2(1,4),R2TB2(2,4),R2TB2(3,4),R2TA2(1,4)-R2TB2(1,4),R2TA2(2,4)-R2TB2(2,4),R2TA2(3,4)-R2TB2(3,4))
            %quiver3(MtrasR3_Rx(1,4),MtrasR3_Rx(2,4),MtrasR3_Rx(3,4),R3TB3(1,4)-MtrasR3_Rx(1,4),R3TB3(2,4)-MtrasR3_Rx(2,4),R3TB3(3,4)-MtrasR3_Rx(3,4))
            %quiver3(R3TB3(1,4),R3TB3(2,4),R3TB3(3,4),R3TA3(1,4)-R3TB3(1,4),R3TA3(2,4)-R3TB3(2,4),R3TA3(3,4)-R3TB3(3,4))
            %2D
            xlim([-30 100])
            ylim([-40 90])
            quiver(0,0,R1TB1(1,4),R1TB1(2,4))
            hold on
            quiver(R1TB1(1,4),R1TB1(2,4),R1TA1(1,4)-R1TB1(1,4),R1TA1(2,4)-R1TB1(2,4))
            quiver(MtrasR2_Rx(1,4),MtrasR2_Rx(2,4),R2TB2(1,4)-MtrasR2_Rx(1,4),R2TB2(2,4)-MtrasR2_Rx(2,4))
            quiver(R2TB2(1,4),R2TB2(2,4),R2TA2(1,4)-R2TB2(1,4),R2TA2(2,4)-R2TB2(2,4))
            quiver(MtrasR3_Rx(1,4),MtrasR3_Rx(2,4),R3TB3(1,4)-MtrasR3_Rx(1,4),R3TB3(2,4)-MtrasR3_Rx(2,4))
            quiver(R3TB3(1,4),R3TB3(2,4),R3TA3(1,4)-R3TB3(1,4),R3TA3(2,4)-R3TB3(2,4))
            xlim([-30 100])
            ylim([-40 90])
            q1
            q2
            q3
            if q2<0
                q2=q2+270;
            else
                q2=q2-90;
            end
            q3=(q3+135)*0.85
            a=handles.a;
            a.servoWrite(11,fix(q1))
            a.servoWrite(10,fix(q2))
            a.servoWrite(9,fix(q3))
            %guidata(hObject, handles);
            %FIN TERCERA CADENA
            %a.servoWrite(9,fix(q1))
            grid on
            hold off
        end
    end
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Royeth

Problema con actualizacion de grafica en matlab

Publicado por Royeth jesus.royeth@gmail.com (758 intervenciones) el 24/11/2015 05:03:20
Bueno normalmente para este tipo de programas se debe usar un control de tiempo que no estoy viendo en ninguna parte del código que adjuntas , además es mejor probar el código así que deberías adjuntar tus archivos y con una discretización del tiempo puedes trabajar mejor el código , el código está un poco largo pero no veo que sea problema pues no tienes funciones complejas , aunque es posible optimizarlo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Problema con actualizacion de grafica en matlab

Publicado por carlos (3 intervenciones) el 24/11/2015 06:22:23
Si eso pensé que talvez con un tiempo de muestreo, pero podrías porfavor ponerme un link donde pueda ver como aplicarlo en el guide porfavor, porque hay varias cosas que se me dificultan aun en matlab y he visto como crear timers, pero preferiría hacer una función de interrupción cada cierto tiempo para actualizar la gráfica, como lo podría hacer?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema con actualizacion de grafica en matlab

Publicado por carlos (3 intervenciones) el 02/12/2015 23:13:24
Bueno, estuve investigando y la solución es muy simple, al menos una de las soluciones es simplemente buscar la propiedad interruptible del objeto que efectúa la acción en mi caso figure1, que es el nombre por default de la ventana de trabajo, y se coloca como off, pues si esta en on permite ser interrumpido cada ves que otra o la misma acción es ejecutada, en mi caso la función es WindowButtonMotionFcn la cual se ejecuta cada ves que se mueve el mouse, por tanto normalmente si aun se esta ejecutando y se mueve el mouse, esta acción volverá a interrumpir a la anterior y esto sucederá cada ves que el mouse se este moviendo, si en cambio la propiedad interruptible esta desactivada off la función no se interrumpirá a menos que se termine de ejecutar la función del objeto ininterrumpible aqui dejo un link pra mayor informacion information for this problem http://www.mathworks.com/help/matlab/creating_guis/callback-sequencing-and-interruption.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar