a1 = 0; alpha1 = 0; d1 = 0;
a2 = 475; alpha2 = pi/2; d2 = 150;
a3 = 600; alpha3 = 0; d3 = 0;
%DH parameter
t1_min = -pi/2; t1_max = pi/2;
t2_min = -pi/3; t2_max = pi/3;
t3_min = -pi/3; t3_max = pi/3;
% joint limits
% Monte Carlo method
% sampling size
N = 20000;
t1 = t1_min + (t1_max-t1_min)*rand(N,1);
t2 = t2_min + (t2_max-t2_min)*rand(N,1);
t3 = t3_min + (t3_max-t3_min)*rand(N,1);
function [ T ] = TranMat( a,b,c,d )
T = [ cos(d) -sin(d)*cos(b)
sin(d)*sin(b) a*cos(d); sin(d)
cos(d)*cos(b) -cos(d)*sin(b) a*sin(d);
0 sin(b) cos(b) c;
0 0 0 1
];
for i = 1:N
A1 = TransMat(a1,alpha1,d1,t1(i));
A2 = TransMat(a2,alpha2,d2,t2(i));
A3 = TransMat(a3,alpha3,d3,t3(i));
T = A1*A2*A3;
X=T(1,4);
Y=T(2,4);
Z=T(3,4);
plot3(X,Y,Z,'.')
hold on;
end
end

 Respuesta aceptada

Geoff Hayes
Geoff Hayes el 22 de Jun. de 2020

0 votos

Tony - your code is not calling the TranMat function which has the code to plot the data. How should it be called? What do the a, b, c, and d input parameters correspond to in the script code?

9 comentarios

Tony Yu
Tony Yu el 22 de Jun. de 2020
Editada: Tony Yu el 22 de Jun. de 2020
Thanks, it was a typo for "TransMat", and a, b,c,d are corresponded to a1,alpha1,d1,t1(i). I fixed the typo but the plot is still not showing. I don't see A1 to A3 show up in my workspace.
Geoff Hayes
Geoff Hayes el 22 de Jun. de 2020
But you are then calling TransMat from itself (is this intentional?)
function [ T ] = TransMat( a,b,c,d )
T = [ cos(d) -sin(d)*cos(b)
sin(d)*sin(b) a*cos(d); sin(d)
cos(d)*cos(b) -cos(d)*sin(b) a*sin(d);
0 sin(b) cos(b) c;
0 0 0 1
];
for i = 1:N
A1 = TransMat(a1,alpha1,d1,t1(i));
A2 = TransMat(a2,alpha2,d2,t2(i));
A3 = TransMat(a3,alpha3,d3,t3(i));
T = A1*A2*A3;
X=T(1,4);
Y=T(2,4);
Z=T(3,4);
plot3(X,Y,Z,'.')
hold on;
end
end
How should it be called from the remainder of the code?
Tony Yu
Tony Yu el 22 de Jun. de 2020
Editada: Geoff Hayes el 22 de Jun. de 2020
clc;
clear all;
syms a b c d
syms t1_min t2_min t3_min t4_min t5_min t6_min t7_min t1_max t2_max t3_max t4_max t5_max t6_max t7_max
a1 = 475; alpha1 = pi/2; d1 = 150;
a2 = 600; alpha2 = 0; d2 = 0;
a3 = 120; alpha3 = 0; d3 = 720;
%DH parameter
t1_min = -pi/2; t1_max = pi/2;
t2_min = -pi/3; t2_max = pi/3;
t3_min = -pi/3; t3_max = pi/3;
% joint limits
% Monte Carlo method
% sampling size
N = 20000;
t1 = t1_min + (t1_max-t1_min)*rand(N,1);
t2 = t2_min + (t2_max-t2_min)*rand(N,1);
t3 = t3_min + (t3_max-t3_min)*rand(N,1);
for i = 1:N
A1 = TransMat(a1,alpha1,d1,t1(i));
A2 = TransMat(a2,alpha2,d2,t2(i));
A3 = TransMat(a3,alpha3,d3,t3(i));
T = A1*A2*A3;
X=T(1,4);
Y=T(2,4);
Z=T(3,4);
plot3(X,Y,Z,'.')
hold on;
end
figure(1)
view(3);
title('Isometric view');
xlabel('x (m)');
ylabel('y (m)');
zlabel('z (m) ');
figure(2)
view(2); % top view
title(' Top view');
xlabel('x (m)');
ylabel('y (m)');
figure(3)
view([1 0 0]); % y-z plane
title('Side view, Y-Z');
ylabel('y (m)');
zlabel('z (m)');
function T = TransMat(a,b,c,d)
T = [cos(d) -sin(d)*cos(b) sin(d)*sin(b) a*cos(d); sin(d) cos(d)*cos(b) -cos(d)*sin(b) a*sin(d); 0 sin(b) cos(b) c; 0 0 0 1];
end
I have fixed the code and it is working now, but now, figure 2 and figure 3 does not show anything
Geoff Hayes
Geoff Hayes el 22 de Jun. de 2020
But what should figure 2 and figure 3 show? There is no code to plot something to those figures as your for loop would only be plotting to the first figure.
Tony Yu
Tony Yu el 22 de Jun. de 2020
Is there a way to plot my for loop for the second figure and third figure with view(2) and view ([1 0 0])?
Image Analyst
Image Analyst el 22 de Jun. de 2020
Try not giving figure numbers as input, just accepting handles as outputs (if you even need to):
Instead of
figure(1)
figure(2)
do it like this:
h1 = figure;
h2 = figure;
etc.
Geoff Hayes
Geoff Hayes el 22 de Jun. de 2020
You could defer the plots until after the loop. Perhaps
N = 20000;
t1 = t1_min + (t1_max-t1_min)*rand(N,1);
t2 = t2_min + (t2_max-t2_min)*rand(N,1);
t3 = t3_min + (t3_max-t3_min)*rand(N,1);
X = zeros(N,1); % <--- presize X,Y,Z
Y = zeros(N,1);
Z = zeros(N,1);
for i = 1:N
A1 = TransMat(a1,alpha1,d1,t1(i));
A2 = TransMat(a2,alpha2,d2,t2(i));
A3 = TransMat(a3,alpha3,d3,t3(i));
T = A1*A2*A3;
X(i)=T(1,4);
Y(i)=T(2,4);
Z(i)=T(3,4);
end
figure(1)
view(3);
title('Isometric view');
xlabel('x (m)');
ylabel('y (m)');
zlabel('z (m) ');
plot3(X,Y,Z,'.'); % <---- plot for figure 1
figure(2)
view(2); % top view
title(' Top view');
xlabel('x (m)');
ylabel('y (m)');
plot3(X,Y,Z,'.') % <---- plot for figure 2
figure(3)
view([1 0 0]); % y-z plane
title('Side view, Y-Z');
ylabel('y (m)');
zlabel('z (m)');
plot3(X,Y,Z,'.') % <---- plot for figure 3
I haven't tested the above but it might work...
Tony Yu
Tony Yu el 22 de Jun. de 2020
I tried your meathod but all 3 figures are showing view(3)...
Tony Yu
Tony Yu el 22 de Jun. de 2020
It works now, seems like it does not need to call out plot3 again on figure 2 and 3, thanks !

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Line Plots en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 22 de Jun. de 2020

Comentada:

el 22 de Jun. de 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by