|
1. 首先由DH参数和各个关节角度q向量算出Transform Matrix T(q) 并得到末端在世界坐标系中的坐标X(q)。
2. 给q加一个少量的扰动得到q_ist,算出此时的雅克布矩阵 J(q_ist),Transform Matrix T(q_ist) 得到末端在世界坐标系中的坐标X(q_ist)。
3. 计算X(q)和X(q_ist)的差值 为err。 最后根据梯度下降发不断减小差值err使q_ist逐渐走向q。
Matlab的main函数片段:
- %% q: Gelenkwinkel
- %q=sym('q',[6,1]);
- %assume(q, 'real');
- clear;
- q=[180.0;270.0;90.0;180.0;180.0;0.0];
- %% Jacobian test
- q3=[180.1; 269.9; 90.0; 180.0; 180.0; 0.0]; % Tn+1
- q2=[179.9; 270.1; 90.0; 180.0; 180.0; 0.0]; % Tn
- delta_q=[-0.2*pi/180;
- -0.2*pi/180; 0; 0; 0; 0]; %speed
- %%offset generation
- q_rand=4*rand(6,1)-2;
- q_ist=q+q_rand;
- %% Robot parameter
- D = [0.2755; 0.41; 0.2073; 0.0741; 0.0741; 0.16];
- e2 = 0.0098;
- aa = deg2rad(30);
- ca = cos(aa);
- sa = sin(aa);
- c2a = cos(2*aa);
- s2a = sin(2*aa);
- d4b = D(3)+sa/s2a*D(4);
- d5b = sa/s2a*D(4)+sa/s2a*D(5);
- d6b = sa/s2a*D(5)+D(6);
- %% DH parameter: [theta d a alpha] . Winkel sind in RAD und Positionen in Meter
- DH_Parameter = [ -q(1)*pi/180 D(1) 0 pi/2;...
- (q(2)-90)*pi/180 0 D(2) pi;...
- (q(3)+90)*pi/180 -e2 0 pi/2;...
- q(4)*pi/180 -d4b 0 2*aa;...
- (q(5)-180)*pi/180 -d5b 0 2*aa;...
- (q(6)+90)*pi/180 -d6b 0 pi ];
- %% Erzeuge Transformationsmatrizen
- T1 = DH(DH_Parameter(1,:));
- T2 = DH(DH_Parameter(2,:));
- T3 = DH(DH_Parameter(3,:));
- T4 = DH(DH_Parameter(4,:));
- T5 = DH(DH_Parameter(5,:));
- T6 = DH(DH_Parameter(6,:));
- %debug=T6(3,4);
- %% Transformation Hand-Roboter ( Tipp: Anschlie脽end mit matlabFunction in eine Funktion umwandeln f眉r Inverse Kinematik)
- %T(q) = ...
- T_q=T1*T2*T3*T4*T5*T6;
- %% Jacbobi-Matrix
- %J(q) = ...
- %J=zeros(4,4,6);
- %n=3;
- %J(:,:,n)=T1;
- A=zeros(4,4,6);
- A(:,:,1)=T1;
- A(:,:,2)=T2;
- A(:,:,3)=T3;
- A(:,:,4)=T4;
- A(:,:,5)=T5;
- A(:,:,6)=T6;
- J_q=Jacobian_calu(A);
-
- J_test=Jacobi_Matrix(q);
- %% when velocity == diff(tx ty tz) Jacobian correct
- diff=Transformations_Matrix(q3)-Transformations_Matrix(q2);
- velocity= J_test*delta_q;
- %matlabFunction(J,'File','Jacobi_Matrix.m');
- %% Inverse Kinematik
- % q_soll_Transp = IK_Transp(q_ist,[0.41;0.25951;0.084028]);
- %q_soll_Pseudo = IK_Transp(q,[x y z]);
- q_soll_Pseudo = IK_Pseudo(q_ist,[0.41;0.25951;0.084028]);
- a=0;
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|