Remove the repetitive items in matrix

5 views (last 30 days)
Xianyao Liu
Xianyao Liu on 26 Nov 2021
Edited: dpb on 26 Nov 2021
The following codes are some basic settings, you can skip this section and directly see the problem section below.
clear
clc
% forward kinematics
syms the1 the2 the3 the4 the5
a1 = 100;
a2 = 120;
a3 = 94;
Px = cos(the1)*(a3*cos(the2 + the3) + a2*cos(the2));
Py = sin(the1)*(a3*cos(the2 + the3) + a2*cos(the2));
Pz = a1 + a3*sin(the2 + the3) + a2*sin(the2);
t1=0/180*pi;
t2=35/180*pi;
t3=-60/180*pi;
px_new=vpa(subs(Px,[the1,the2,the3],[t1,t2,t3]));
py_new=vpa(subs(Py,[the1,the2,the3],[t1,t2,t3]));
pz_new=vpa(subs(Pz,[the1,the2,the3],[t1,t2,t3]));
% inverse kinematics
[t1,t2,t3] = solve(Px==px_new,Py==py_new,Pz==pz_new,the1,the2,the3)
% convert the unit from radian to degree
Theta1=vpa((t1)*180/pi);
Theta2=vpa((t2)*180/pi);
Theta3=vpa((t3)*180/pi);
% From Forward H03, get R03
R03 = [cos(the2 + the3)*cos(the1) -sin(the2 + the3)*cos(the1) sin(the1);
cos(the2 + the3)*sin(the1) -sin(the2 + the3)*sin(the1) -cos(the1);
sin(the2 + the3) cos(the2 + the3) 0]
% From Forward H46, get R46
R46 = [cos(the4)*cos(the5) -cos(the4)*sin(the5) sin(the4);
cos(the5)*sin(the4) -sin(the4)*sin(the5) -cos(the4);
sin(the5) cos(the5) 0]
% Use values replace symbols
R03_1 = vpa(subs(R03,[the1,the2,the3],[t1(1),t2(1),t3(1)]))
R03_2 = vpa(subs(R03,[the1,the2,the3],[t1(2),t2(2),t3(2)]))
R03_3 = vpa(subs(R03,[the1,the2,the3],[t1(3),t2(3),t3(3)]))
R03_4 = vpa(subs(R03,[the1,the2,the3],[t1(4),t2(4),t3(4)]))
R06 = [1 0 0;
0 1 0;
0 0 1];
% Get values in number form
R46_1 = (R03_1)'*R06
R46_2 = (R03_2)'*R06
R46_3 = (R03_3)'*R06
R46_4 = (R03_4)'*R06
% R46_all = [R46_1 R46_2 R46_3 R46_4]
The problems appear in the following codes. The output of t41,t51,t42,t52 has repetitive items, I want to remove the repetitive items. Then, I can combine them using t4 = [t41,t42,t43,t44] and t5 = [t51,t52,t53,t54]. Finally, I can use Theta4=vpa((t4)*180/pi) and Theta5=vpa((t5)*180/pi) to represent neatly the same as my Theta1,Theta2 and Theta3. Thank you in advance!
% How to remove the repetitive items and combine [t41,t42,t43,t44] into t4
% and t5 matrices?
[t41,t51] = solve(sin(the4)==R46_1(1,3),sin(the5)==R46_1(3,1),the4,the5)
[t42,t52] = solve(sin(the4)==R46_2(1,3),sin(the5)==R46_2(3,1),the4,the5)
[t43,t53] = solve(sin(the4)==R46_3(1,3),sin(the5)==R46_3(3,1),the4,the5)
[t44,t54] = solve(sin(the4)==R46_4(1,3),sin(the5)==R46_4(3,1),the4,the5)
Theta4_1 = vpa((t41)*180/pi)
Theta5_1 = vpa((t51)*180/pi)
Theta4_2 = vpa((t42)*180/pi)
Theta5_2 = vpa((t52)*180/pi)
Theta4_3 = vpa((t43)*180/pi)
Theta5_3 = vpa((t53)*180/pi)
Theta4_4 = vpa((t44)*180/pi)
Theta5_4 = vpa((t54)*180/pi)
t4 = [t41,t42,t43,t44];
t5 = [t51,t52,t53,t54];
Theta4=vpa((t4)*180/pi);
Theta5=vpa((t5)*180/pi);
  3 Comments
Xianyao Liu
Xianyao Liu on 26 Nov 2021
Thank you for your suggestions! Next time I will try to simplify my codes.

Sign in to comment.

Accepted Answer

DGM
DGM on 26 Nov 2021
Edited: DGM on 26 Nov 2021
You're using solve to solve two independent equations as if they were a system, and solve is accordingly returning a set of points. I don't see why any of that is necessary. These are independent simple periodic functions. Just evaluate the arcsin.
Instead of doing all this:
% How to remove the repetitive items and combine [t41,t42,t43,t44] into t4
% and t5 matrices?
[t41,t51] = solve(sin(the4)==R46_1(1,3),sin(the5)==R46_1(3,1),the4,the5)
[t42,t52] = solve(sin(the4)==R46_2(1,3),sin(the5)==R46_2(3,1),the4,the5)
[t43,t53] = solve(sin(the4)==R46_3(1,3),sin(the5)==R46_3(3,1),the4,the5)
[t44,t54] = solve(sin(the4)==R46_4(1,3),sin(the5)==R46_4(3,1),the4,the5)
Theta4_1 = vpa((t41)*180/pi)
Theta5_1 = vpa((t51)*180/pi)
Theta4_2 = vpa((t42)*180/pi)
Theta5_2 = vpa((t52)*180/pi)
Theta4_3 = vpa((t43)*180/pi)
Theta5_3 = vpa((t53)*180/pi)
Theta4_4 = vpa((t44)*180/pi)
Theta5_4 = vpa((t54)*180/pi)
t4 = [t41,t42,t43,t44];
t5 = [t51,t52,t53,t54];
Theta4=vpa((t4)*180/pi);
Theta5=vpa((t5)*180/pi);
Why not just do it directly?
% symbolic form, column vector
Theta4 = asind([R46_1(1,3) R46_2(1,3) R46_3(1,3) R46_4(1,3)].')
Theta5 = asind([R46_1(3,1) R46_2(3,1) R46_3(3,1) R46_4(3,1)].')
Theta4 =
-78.539816339744830961566084581988/pi
135.16677730298831568345876865956/pi
135.16677730298831568345876865956/pi
-78.539816339744830961566084581988/pi
Theta5 =
-5.7781949423580712925184862590422e-38/pi
-5.7781949423580712925184862590422e-38/pi
0
0
If you want a numeric result, cast it using double().
  1 Comment
Xianyao Liu
Xianyao Liu on 26 Nov 2021
Thank you so much! That's what I want to achieve!

Sign in to comment.

More Answers (0)

Community Treasure Hunt

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

Start Hunting!