⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 robotxy.m

📁 very excellent 2 degree of freedom two link robot inverse kinematic. its graphically good.
💻 M
字号:
%solve('(q1-xs)^2+(q2-ys)^2=l1^2','(xo-xs)^2+(yo-ys)^2=l2^2','xs','ys')
clc
disp('Automatic Optimal Control Equation Driver.');
disp('Defining Parameters...');
syms xo yo l1 l2 I1 I2 m1 m2 r1 g
syms q1 q2 qd1 qd2 u1 u2
xs1=-1/2*(-yo*(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2)*(l2^2-2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2))^(1/2)-q1^2*q2^2-q1^2*yo^2+xo^2*q2^2+xo^2*yo^2-2*yo*xo^2*q2+q2*(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2)*(l2^2-2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2))^(1/2)-q1^4+xo^4+2*xo*q1^3-2*xo^3*q1+q1^2*l1^2-q1^2*l2^2+xo^2*l1^2-xo^2*l2^2-2*xo*q1*l1^2+2*xo*q1*l2^2+2*q1^2*q2*yo)/(q2^2+xo^2+yo^2-2*q2*yo-2*xo*q1+q1^2)/(-xo+q1);
xs2=-1/2*(yo*(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2)*(l2^2-2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2))^(1/2)-q1^2*q2^2-q1^2*yo^2+xo^2*q2^2+xo^2*yo^2-2*yo*xo^2*q2-q2*(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2)*(l2^2-2*l1*l2+l1^2-yo^2+2*q2*yo-q2^2-q1^2+2*xo*q1-xo^2))^(1/2)-q1^4+xo^4+2*xo*q1^3-2*xo^3*q1+q1^2*l1^2-q1^2*l2^2+xo^2*l1^2-xo^2*l2^2-2*xo*q1*l1^2+2*xo*q1*l2^2+2*q1^2*q2*yo)/(q2^2+xo^2+yo^2-2*q2*yo-2*xo*q1+q1^2)/(-xo+q1);
ys1=-1/2*(l2^2*yo-q2^3-q1^2*yo-yo^3+q2^2*yo+2*xo*q1*q2-xo^2*q2-l1^2*yo-xo^2*yo-q1^2*q2+q2*yo^2+2*xo*q1*yo+q2*l1^2-q2*l2^2-(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-xo^2-yo^2+2*xo*q1-q1^2+2*q2*yo-q2^2)*(l2^2-2*l1*l2+l1^2-xo^2-yo^2+2*xo*q1-q1^2+2*q2*yo-q2^2))^(1/2))/(q2^2+xo^2+yo^2-2*q2*yo-2*xo*q1+q1^2);
ys2=-1/2*(l2^2*yo-q2^3-q1^2*yo-yo^3+q2^2*yo+2*xo*q1*q2-xo^2*q2-l1^2*yo-xo^2*yo-q1^2*q2+q2*yo^2+2*xo*q1*yo+q2*l1^2-q2*l2^2+(-(-xo+q1)^2*(l2^2+2*l1*l2+l1^2-xo^2-yo^2+2*xo*q1-q1^2+2*q2*yo-q2^2)*(l2^2-2*l1*l2+l1^2-xo^2-yo^2+2*xo*q1-q1^2+2*q2*yo-q2^2))^(1/2))/(q2^2+xo^2+yo^2-2*q2*yo-2*xo*q1+q1^2);
xs=xs1; ys=ys1;

xsd=simplify(diff(xs,q1)*qd1+diff(xs,q2)*qd2);
ysd=simplify(diff(ys,q1)*qd1+diff(ys,q2)*qd2);
K=1/2*I1*(xsd^2+ysd^2)/l1^2+1/2*I2*((qd1-xsd)^2+(qd2-ysd)^2)/l2^2+1/2*m2*((qd1+xsd)^2+(qd2+ysd)^2);
P=m1*g*ys/2+m2*g*(q2+ys)/2;
L=K-P;
DOF=2;
H='u1^2+u2^2';
 

% if you don't want symbolic set this parameter to zero and then define
% your parameters numerically.
%this menu enable us to improve speed in calculation.
Torquesubs=1;
%in this section you should put value of parameters
for i=1:DOF
  ii=int2str(i);jj=int2str(i+DOF);
  eval(strcat('syms q',ii,' qd',ii,' qdd',ii,' p',ii,' p',jj));
end

%definition of inputs
disp('Defined.');
disp('Extracting Dynamic Equations...');
Ls='';
qdds='';
for i=1:DOF
   ii=int2str(i);
   disp(strcat('Degree:',ii));
   disp('Differentiating 1');
   eval(strcat('A',ii,'=diff(L,qd',ii,');'));
   disp('Differentiating 2');
   eval(strcat('B',ii,'=diff(L,q',ii,');'));
   eval(strcat('Ap',ii,'=0;'));
   for j=1:DOF
     jj=int2str(j);
     disp(strcat('SubDegree:',jj));
     disp('Differentiating 1');
     eval(strcat('Ap',ii,'=Ap',ii,'+diff(A',ii,',q',jj,')*qd',jj,';'));
     disp('Differentiating 2');
     eval(strcat('Ap',ii,'=Ap',ii,'+diff(A',ii,',qd',jj,')*qdd',jj,';'));
   end
   disp('Simpling...');
%    eval(strcat('L',ii,'=simplify(u',ii,'-Ap',ii,'+B',ii,');'));
   eval(strcat('L',ii,'=(u',ii,'-Ap',ii,'+B',ii,');'));
   disp('Done.');
   Ls=strcat(Ls,'L',ii',',');
   qdds=strcat(qdds,'qdd',ii);
   if i<DOF
    qdds=strcat(qdds,',');
   end
end
eval(strcat('Qdd=solve(',Ls,qdds,');'));
disp('Equations Extracted.');
disp('Simpling...');
Us='';
if DOF>1
 for i=1:DOF
  ii=int2str(i);
  eval(strcat('Qdd.qdd',ii,'=simplify(Qdd.qdd',ii,');'));
  Us=strcat(Us,'u',ii);
  if i<DOF
    Us=strcat(Us,',');
  end
 end
else
 Us=u1;
 Qdd=simplify(Qdd);
end
disp('Making Hamiltonian Equation...');
%is now time to define a Hamiltonian.
if DOF>1
 for i=1:DOF
  ii=int2str(i);
  jj=int2str(i+DOF);
  eval(strcat('H=H+p',ii,'*q',ii,'+p',jj,'*Qdd.qdd',ii,';'));
 end
else
 H=H+p1*qd1+p2*Qdd;
end;
disp('Done. DO Euler... '); 
%actify the Euler-Lagrange Formula on Hamiltonian
if DOF>1
 for i=1:DOF
  ii=int2str(i);        %number of qi
  jj=int2str(i+DOF);    %number of qdi
  eval(strcat('pd',ii,'=-diff(H,q',ii,');'));
  eval(strcat('pd',jj,'=-diff(H,qd',ii,');'));
  eval(strcat('u',ii,'=solve(diff(H,u',ii,'),u',ii,');'));
  if Torquesubs
   eval(strcat('pd',ii,'=subs(pd',ii,',''[',Us,']'',[',Us,']);'));
   eval(strcat('pd',jj,'=subs(pd',jj,',''[',Us,']'',[',Us,']);'));
   eval(strcat('Qdd.qdd',ii,'=subs(pd',ii,',''[',Us,']'',[',Us,']);'));
  end 
 end
else
 %Simplified for one Degree of Freedom
 pd1=-diff(H,q1);
 pd2=-diff(H,qd1);
 u1=solve(diff(H,u1),u1);
 if Torquesubs
  pd1=subs(pd1,'u1',u1);
  pd2=subs(pd2,'u1',u1);
  Qdd=subs(Qdd,'u1',u1);
 end
end
disp('Done. Simpling... '); 
%This Part is for converting from symboic to characteric process
if DOF>1
 for i=1:DOF
  ii=int2str(i);jj=int2str(i+DOF);kk1=int2str(i+2*DOF);kk2=int2str(i+3*DOF);
  eval(strcat('u',ii,'=char(simplify(u',ii,'));'));
  eval(strcat('d',ii,'=''qd',ii,''';'));
  eval(strcat('d',jj,'=char(simplify(Qdd.qdd',ii,'));'));
  eval(strcat('d',kk1,'=char(simplify(pd',ii,'));'));
  eval(strcat('d',kk2,'=char(simplify(pd',jj,'));'));
 end
else
%simplified for ONE Degree Of Freedom
    u1=char(simplify(u1));
  d1='qd1';
  d2=char(simplify(Qdd));
  if pd1~=0
    d3=char(simplify(pd1));
  else
    d3='0';
  end
  if pd2~=0
    d4=char(simplify(pd2));
  else
    d4='0';
  end
end

% Very Advanced Matlab code for get away from hard working for DOF=1 and
% more!
disp('Done. Making File... '); 
for i=1:2*DOF
 for j=1:4*DOF
  eval(strcat('d',int2str(j),' = regexprep(d',int2str(j),',strcat(''p'',int2str(i)), strcat(''x('',int2str(i+',int2str(2*DOF),'),'')''));'));
  if (j<=DOF)
   eval(strcat('u',int2str(j),' = regexprep(u',int2str(j),',strcat(''p'',int2str(i)), strcat(''x('',int2str(i+',int2str(2*DOF),'),'')''));'));         
  end
 end
 if i<=DOF 
  for j=1:4*DOF
   eval(strcat('d',int2str(j),' = regexprep(d',int2str(j),',strcat(''q'',int2str(i)), strcat(''x('',int2str(i),'')''));'));
   eval(strcat('d',int2str(j),' = regexprep(d',int2str(j),',strcat(''qd'',int2str(i)), strcat(''x('',int2str(i+',int2str(DOF),'),'')''));'));
   if j<=DOF
    eval(strcat('u',int2str(j),' = regexprep(u',int2str(j),',strcat(''q'',int2str(i)), strcat(''x('',int2str(i),'')''));'));
    eval(strcat('u',int2str(j),' = regexprep(u',int2str(j),',strcat(''qd'',int2str(i)), strcat(''x('',int2str(i+',int2str(DOF),'),'')''));'));
   end
  end
 end
end

%This part for write a function into the file
fid = fopen('matnode.m', 'wt');
fprintf(fid, 'function dxdt = mat8ode(t,x)\n');
if symbolic
 eval(strcat('fprintf(fid, ''global',symParams,'\n'');')); 
end
if ~Torquesubs
  for i=1:DOF
    ii=int2str(i);
    eval(strcat('fprintf(fid, strcat(''u',ii,'='',char(u',ii,'),'';\n''));'));
  end
end
fprintf(fid, strcat('dxdt=zeros(',int2str(4*DOF),',1);\n'));
for i=1:4*DOF
    ii=int2str(i);
    eval(strcat('fprintf(fid,strcat(''dxdt(',ii,')='',char(d',ii,'),'';\n''));'));
end
fprintf(fid,'end');
fclose(fid);
disp('Complete. '); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -