7 svar
108 visningar
Louiger behöver inte mer hjälp
Louiger 470
Postad: 17 nov 2019 17:00

Plotta svep

Nu har jag lyckats plotta ut lederna och ska plotta ut armar också, men hur får jag det till ett svep då tiden går från 0 till 4 sek? 

Sätter jag t=[0:4] funkar det inte, men det stämmer för alla värden om jag skriver in tiden (t) manuellt.  Är det någon som har någon ide på hur jag kan göra eller var jag kan leta efter relevant information?

Nedan följer uppgift och program:

Uppgift:

Figuren visar en robotarm med två länkar. Ledvinklarna ges av theta1 och theta2. Koordinaterna för
robothanden blir
x = L1 cos (theta1) + L2 cos (theta1 + theta2)

y = L1 sin (theta1) + L2 sin (theta1 + theta2)
där L1 och L2 är länklängderna.
Vinklarna theta1 och theta2 som bestämmer robothandens rörelse kontrolleras tidsmässigt av följande
polynomuttryck:
theta1(t) = theta1(0) + a1t3 + a2t4
theta2(t) = theta2(0) + b1t3 + b2t4
där theta1(0) och theta2(0) är startvärden för vinklarna vid tiden t = 0. Vinklarna anges i enheten grader
och tiden i sekunder.
Robothand

b)

Använd dina resultat i a) för att plotta robothandens svep när tiden t går från 0 till 4 sekunder,
med värdena L1 = 4 m och L2 = 3 m.

Program:

clear all, close all, clc

L_1=4;
L_2=3;

t=4;
%tiden i sekunder

x0=0;
% x-värde för axel 1
y0=0;
% y-värde för axel 1

x1=L_1*cos(theta_1(t));
% beräknar x coordinater för axel 2
y1=L_1*sin(theta_1(t));
% beräknar y coordinater för axel 2
sqrt(x1^2+y1^2)

x=L_1* cos(theta_1(t))+L_2* cos(theta_1(t)+theta_2(t));
% beräknar x coordinater för robothanden
y=L_1*sin(theta_1(t))+L_2*sin(theta_1(t)+theta_2(t));
% beräknar y coordinater för robothanden

hold on
plot(x0,y0,'go');
plot(x1,y1,'ro');
plot(x,y,'bhexagram');

axis ([-4 8 0 6]);
xlabel('x','fontsize',10)
ylabel('y','fontsize',10)
title('Robotarm','fontsize',10)

Dr. G 9479
Postad: 17 nov 2019 17:43

Lägg in hela plot-koden i en for-loop.

Vill du ha allt plottat i samma figur eller i olika? För vilka tidpunkter?

Louiger 470
Postad: 17 nov 2019 18:57
Dr. G skrev:

Lägg in hela plot-koden i en for-loop.

Vill du ha allt plottat i samma figur eller i olika? För vilka tidpunkter?

Ahh de ska jag prova :-) !

 

Asså jag vet inte eftersom jag inte fattar frågan helt. "plotta robothandens svep när tiden t går från 0 till 4 sekunder".

Själv tänkte jag nog att det skulle finnas någon funktion som skulle kunna få armen att liksom röra sig i tidsintervallet om man trycker på motsvarande play. 

Det kanske räcker att plotta det mha forloop eller tom bara plotta det manuellt i samma fönster.

Dr. G 9479
Postad: 17 nov 2019 19:30

Prova något i stil med detta för att få ett animerat förlopp:

t = 0;

dt = .1;

wait = .2; 

while t <= 4

plot(...)

pause(wait);

hold off;

t = t + dt;

end

plot(...) är din plot-kod.

Loopen stannar när t > 4. Om du vill kan man ju sätta t = 0 om t > 4, så börjar allt om igen. 

Louiger 470
Postad: 17 nov 2019 20:19
Dr. G skrev:

Prova något i stil med detta för att få ett animerat förlopp:

t = 0;

dt = .1;

wait = .2; 

while t <= 4

plot(...)

pause(wait);

hold off;

t = t + dt;

end

plot(...) är din plot-kod.

Loopen stannar när t > 4. Om du vill kan man ju sätta t = 0 om t > 4, så börjar allt om igen. 

Åhh 🙏 provar imorgon om jag hinner 😀

Louiger 470
Postad: 18 nov 2019 11:27
Dr. G skrev:

Prova något i stil med detta för att få ett animerat förlopp:

t = 0;

dt = .1;

wait = .2; 

while t <= 4

plot(...)

pause(wait);

hold off;

t = t + dt;

end

plot(...) är din plot-kod.

Loopen stannar när t > 4. Om du vill kan man ju sätta t = 0 om t > 4, så börjar allt om igen. 

Provade något liknande som du skrev ( se nedan).

Vet du om det finns något sätt att ta bort de första plottningarna under tiden? Dvs att när arm(3)  (vid tiden 3) plottas tas arm(2) bort , då kommer det ju se ut som en arm som rör sig.

Program:

clear all, close all, clc

L_1=4;
L_2=3;

wait=1;

t=0;
%tiden i sekunder

x0=0; % x-värde för axel 1
y0=0; % y-värde för axel 1

 

while t<=4

x1=L_1*cos(theta_1(t));
% beräknar x coordinater för axel 2
y1=L_1*sin(theta_1(t));
% beräknar y coordinater för axel 2

x2=L_1* cos(theta_1(t))+L_2* cos(theta_1(t)+theta_2(t));
% beräknar x coordinater för robothanden
y2=L_1*sin(theta_1(t))+L_2*sin(theta_1(t)+theta_2(t));
% beräknar y coordinater för robothanden

x=[x0,x1,x2];
y=[y0,y1,y2];

hold on
plot(x0,y0,'go');
plot(x1,y1,'ro');
plot(x2,y2,'bhexagram');
plot(x,y, 'k', 'linewidth',1.5);

axis ([-4 8 0 6]);
xlabel('x','fontsize',10)
ylabel('y','fontsize',10)
title('Robotarm','fontsize',10)

pause(wait);
hold off

t=t+1;
end

Dr. G 9479
Postad: 18 nov 2019 17:25

Medan du har

hold on

så plottas allt på varandra. När det kommer ett

hold off

så tas allt tidigare bort vid nästa plot-kommando.

 

Aha, ser nu i din kod att du har

hold on
plot(x0,y0,'go');
plot(x1,y1,'ro');
plot(x2,y2,'bhexagram');
plot(x,y, 'k', 'linewidth',1.5);

Sedan kommer ett hold off på slutet, men du får ett nytt hold i nästa varv i loopen. 

Det borde funka att skriva

clf

före hold on i loopen. 

Louiger 470
Postad: 18 nov 2019 19:39
Dr. G skrev:

Medan du har

hold on

så plottas allt på varandra. När det kommer ett

hold off

så tas allt tidigare bort vid nästa plot-kommando.

 

Aha, ser nu i din kod att du har

hold on
plot(x0,y0,'go');
plot(x1,y1,'ro');
plot(x2,y2,'bhexagram');
plot(x,y, 'k', 'linewidth',1.5);

Sedan kommer ett hold off på slutet, men du får ett nytt hold i nästa varv i loopen. 

Det borde funka att skriva

clf

före hold on i loopen. 

Tack!!! Det fungerade. Nu ser det ut som jag vill iaf :-)

Svara
Close