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)
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?
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.
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.
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 😀
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
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.
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 :-)