
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.
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


0