Index in position 1 exceeds array bounds (must not exceed 4)
5 views (last 30 days)
Show older comments
Hi
I get the error from matlab code, which was calculating the inverse kinematic of robotic.
the error says,
Index in position 1 exceeds array bounds (must not exceed 4).Error in inverseKinematicsimulation (line 59)
DH{i} =[ cos(cta(i,k)) -sin(cta(i,k))*cos(alpha(i)) sin(cta(i,k))*sin(alpha(i)) a(i)*cos(cta(i,k));...
I check the dimensions which were satisfied."DH" is a 4*4 matrix.
Could you help me find out what error! thanks a lot!
the code as below.
Cmd_X = 300;
Cmd_Y = 400;
Cmd_Z = 500;
cta_total = 45;
Theta1_now = 0;
Theta2_now = 0;
Theta3_now = 0;
Theta4_now = 0;
JOINT_SIZE = 4+1;
PATH_SIZE = 20;
a = [300, 0, 300, 0]';
alpha = [0, -1/2, -1/2, -1/2]';
d = [0, 0, 0, 0]';
cta = zeros(JOINT_SIZE-1,PATH_SIZE+1);%each joint's angle
P = zeros(JOINT_SIZE-1,PATH_SIZE);% effector's position
cta(1:JOINT_SIZE-1,1) = [ Theta1_now, Theta2_now, Theta3_now, Theta4_now]'*pi/180.0;
T = cell(JOINT_SIZE-1);%transmatrix
intermed = cell(JOINT_SIZE-1);%buffer
intermed{1} = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]; %
DH = cell(JOINT_SIZE-1);
target = [Cmd_X;Cmd_Y;Cmd_Z;cta_total];
%calculate initial position
for m=1:JOINT_SIZE-1
DH{m} =[ cosd(cta(m,1)) -sind(cta(m,1))*cosd(alpha(m)) sind(cta(m,1))*sind(alpha(m)) a(m)*cosd(cta(m,1));...
sind(cta(m,1)) cosd(cta(m,1))*cosd(alpha(m)) -cosd(cta(m,1))*sind(alpha(m)) a(m)*sind(cta(m,1));...
0 sind(alpha(m)) cosd(alpha(m)) d(m);...
0 0 0 1];
intermed{m+1} = intermed{m}*DH{m};
end
T{1} = intermed{JOINT_SIZE};
P(1:3,1) = T{1}(1:3, 4);
%calculate new theta
for k=2:PATH_SIZE
% error
e = [target(1) - P(1); target(2) - P(2); target(3) - P(3); target(4)-(cta(1)+cta(2)+cta(3)+cta(4))];
% Jacobian by hand
Jacobian_p = [-a(1)*sind(cta(1,k-1))-a(2)*sind(cta(1,k-1)+cta(2,k-1))-a(3)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))+a(4)*cosd(cta(1,k-1)+cta(2,k-1))*sind(cta(4,k-1))-a(4)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1)),...
-a(2)*sind(cta(1,k-1)+cta(2,k-1))-a(3)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))+a(4)*cosd(cta(1,k-1)+cta(2,k-1))*sind(cta(4,k-1))-a(4)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1)),...
-a(3)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(3,k-1))-a(4)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(3,k-1))*cosd(cta(4,k-1)),...
+a(4)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(4,k-1))-a(4)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1));...
a(1)*cosd(cta(1,k-1))+a(2)*cosd(cta(1,k-1)+cta(2,k-1))+a(3)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))+a(4)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(4,k-1))+a(4)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1)),...
a(2)*cosd(cta(1,k-1)+cta(2,k-1))+a(3)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))+a(4)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(4,k-1))+a(4)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1)),...
-a(3)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(3,k-1))-a(4)*sind(cta(1,k-1)+cta(2,k-1))*sind(cta(3,k-1))*cosd(cta(4,k-1)),...
-a(4)*cosd(cta(1,k-1)+cta(2,k-1))*cosd(cta(4,k-1))-a(4)*sind(cta(1,k-1)+cta(2,k-1))*cosd(cta(3,k-1))*cosd(cta(4,k-1));...
0,0,-a(3)*cosd(cta(3,k-1))-a(4)*cosd(cta(3,k-1))*cosd(cta(4,k-1)), a(4)*sind(cta(3,k-1))*sind(cta(4,k-1));...
1,1,1,1];
error =pinv(Jacobian_p).*e;
cta(1:4,k+1) = cta(1:4,k) + error(1:4,4);
for i=1:JOINT_SIZE
DH{i} =[cosd(cta(i,k+1)),-sind(cta(i,k+1))*cosd(alpha(i)),sind(cta(i,k+1))*sind(alpha(i)),a(i)*cosd(cta(i,k+1));...
sind(cta(i,k+1)) cosd(cta(i,k+1))*cosd(alpha(i)) -cosd(cta(i,k+1))*sind(alpha(i)) a(i)*sind(cta(i,k+1));...
0 sind(alpha(i)) cosd(alpha(i)) d(i);...
0 0 0 1];
intermed{i+1} = intermed{i}*DH{i};
%joint_p{k+1}(1:3,i)= intermed{i+1}(1:3,4);
P(1:3,k) = intermed{5}(1:3, 4);
end
end
Theta1_new = cta(1,PATH_SIZE);
Theta2_new = cta(2,PATH_SIZE);
Theta3_new = cta(3,PATH_SIZE);
Theta4_new = cta(4,PATH_SIZE);
0 Comments
Answers (1)
Image Analyst
on 16 Sep 2019
DH is a 4-by-4 matrix (cell array) but you're only using one index when you assign it:
DH{i} = ............
Why are you not using two indexes? In fact, since you only use it in that loop, why store it at all? Why is it not simply a temporary matrix that you just basically use inside the loop and throw away afterwards?
0 Comments
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!