www.gusucode.com > 基于路径跟踪原理求解6_SPS并联机构位置正解 > gaijinnew7.m
%三阶牛顿法,预估两次计算一次误差 %%%%%%zn=xn-f(xn)/f(xn)'%%%%%%%%%%% 0.039 %%%%%%%xn+1=xn-2f(xn)/(f(xn)+f(zn)')%%%%%%%%% tic clear all clc vtr=1.e-3; s=1; %z=[202.8391 290.3898 604.7034 714.3585 366.8086 225.5108]'; l=[160 150 167 158 165 157];%杆长的目标位置 x0 =[0 0 121 0 0 0];%平台的初始位姿 rp=6006.25;%p平台的外接圆半径平方 rb=6006.25;%b平台的外接圆半径平方 pa=[-10.12 -76.84 0]; pb=[10.12 -76.84 0]; pc=[71.60 29.66 0]; pd=[61.48 47.18 0]; pe=[-61.48 47.18 0]; pf=[-71.60 29.66 0];%在p坐标系,六点坐标 ba=[-61.48 -47.18 0]; bb=[61.48 -47.18 0]; bc=[71.60 -29.66 0]; bd=[10.12 76.84 0]; be=[-10.12 76.84 0]; bf=[-71.60 -29.66 0];%在b坐标系,六点坐标 r11=cos(x0(4))*cos(x0(5)); r12=(cos(x0(4))*sin(x0(5))*sin(x0(3)))-(sin(x0(4))*cos(x0(6))); r13=(cos(x0(4))*sin(x0(5))*cos(x0(3)))+(sin(x0(4))*sin(x0(6))); r21=sin(x0(4))*cos(x0(5)); r22=(sin(x0(4))*sin(x0(5)))*sin(x0(3))+(cos(x0(4))*cos(x0(6))); r23=(sin(x0(4))*sin(x0(5)))*cos(x0(3))-(cos(x0(4))*sin(x0(6))); r31=-sin(x0(5)); r32=cos(x0(5))*sin(x0(6)); r33=cos(x0(5))*cos(x0(6)); R=[r11 r12 r13;r21 r22 r23;r31 r32 r33];%坐标P相对于坐标B方向的转换矩阵,r-X,b-Y,a-Z轴 while (s>vtr) %整体循环,直至路径终点 %将滑块的终点坐标z和动平台的起点位置x0带入到轨迹曲线F中 F0=[ (6006.25+6006.25+x^2+y^2+z^2+2*(x-pa(1))*(ba(1)*r11+ba(2)*r12+ba(3)*r13)+2*(y-pa(2))*(ba(1)*r21+ba(2)*r22+ba(3)*r23)+2*(z-pa(3))*(ba(1)*r31+ba(2)*r32+ba(3)*r33)-2*(x*pa(1)+y*ba(3))-l(1)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pb(1))*(bb(1)*r11+bb(2)*r12+bb(3)*r13)+2*(y-pb(2))*(bb(1)*r21+bb(2)*r22+bb(3)*r23)+2*(z-pb(3))*(bb(1)*r31+bb(2)*r32+bb(3)*r33)-2*(x*pb(1)+y*bb(3))-l(2)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pc(1))*(bc(1)*r11+bc(2)*r12+bc(3)*r13)+2*(y-pc(2))*(bc(1)*r21+bc(2)*r22+bc(3)*r23)+2*(z-pc(3))*(bc(1)*r31+bc(2)*r32+bc(3)*r33)-2*(x*pc(1)+y*bc(3))-l(3)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pd(1))*(bd(1)*r11+bd(2)*r12+bd(3)*r13)+2*(y-pd(2))*(bd(1)*r21+bd(2)*r22+bd(3)*r23)+2*(z-pd(3))*(bd(1)*r31+bd(2)*r32+bd(3)*r33)-2*(x*pd(1)+y*bd(3))-l(4)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pe(1))*(be(1)*r11+be(2)*r12+be(3)*r13)+2*(y-pe(2))*(be(1)*r21+be(2)*r22+be(3)*r23)+2*(z-pe(3))*(be(1)*r31+be(2)*r32+be(3)*r33)-2*(x*pe(1)+y*be(3))-l(5)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pf(1))*(bf(1)*r11+bf(2)*r12+bf(3)*r13)+2*(y-pf(2))*(bf(1)*r21+bf(2)*r22+bf(3)*r23)+2*(z-pf(3))*(bf(1)*r31+bf(2)*r32+bf(3)*r33)-2*(x*pf(1)+y*bf(3))-l(6)); ] F0_x=[diff(F0(1),x);diff(F0(2),y);diff(F0(3),z); diff(F0(4),a); diff(F0(5),b); diff(F0(6),r);] %牛顿迭代公式 x=x0-inv(F0_x)*F0; r11=cos(x(4))*cos(x(5)); r12=(cos(x(4))*sin(x(5))*sin(x(3)))-(sin(x(4))*cos(x(6))); r13=(cos(x(4))*sin(x(5))*cos(x(3)))+(sin(x(4))*sin(x(6))); r21=sin(x(4))*cos(x(5)); r22=(sin(x(4))*sin(x(5)))*sin(x(3))+(cos(x(4))*cos(x(6))); r23=(sin(x(4))*sin(x(5)))*cos(x(3))-(cos(x(4))*sin(x(6))); r31=-sin(x(5)); r32=cos(x(5))*sin(x(6)); r33=cos(x(5))*cos(x(6)); R=[r11 r12 r13;r21 r22 r23;r31 r32 r33]; F_x=[diff(F0(1),x);diff(F0(2),y);diff(F0(3),z); diff(F0(4),a); diff(F0(5),b); diff(F0(6),r);] %三阶的牛顿公式 xn=x0-2.*inv(F0_x+F_x)*F0; x0=xn; r11=cos(x0(4))*cos(x0(5)); r12=(cos(x0(4))*sin(x0(5))*sin(x0(3)))-(sin(x0(4))*cos(x0(6))); r13=(cos(x0(4))*sin(x0(5))*cos(x0(3)))+(sin(x0(4))*sin(x0(6))); r21=sin(x0(4))*cos(x0(5)); r22=(sin(x0(4))*sin(x0(5)))*sin(x0(3))+(cos(x0(4))*cos(x0(6))); r23=(sin(x0(4))*sin(x0(5)))*cos(x0(3))-(cos(x0(4))*sin(x0(6))); r31=-sin(x0(5)); r32=cos(x0(5))*sin(x0(6)); r33=cos(x0(5))*cos(x0(6)); R=[r11 r12 r13;r21 r22 r23;r31 r32 r33]; F0=[ (6006.25+6006.25+x^2+y^2+z^2+2*(x-pa(1))*(ba(1)*r11+ba(2)*r12+ba(3)*r13)+2*(y-pa(2))*(ba(1)*r21+ba(2)*r22+ba(3)*r23)+2*(z-pa(3))*(ba(1)*r31+ba(2)*r32+ba(3)*r33)-2*(x*pa(1)+y*ba(3))-l(1)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pb(1))*(bb(1)*r11+bb(2)*r12+bb(3)*r13)+2*(y-pb(2))*(bb(1)*r21+bb(2)*r22+bb(3)*r23)+2*(z-pb(3))*(bb(1)*r31+bb(2)*r32+bb(3)*r33)-2*(x*pb(1)+y*bb(3))-l(2)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pc(1))*(bc(1)*r11+bc(2)*r12+bc(3)*r13)+2*(y-pc(2))*(bc(1)*r21+bc(2)*r22+bc(3)*r23)+2*(z-pc(3))*(bc(1)*r31+bc(2)*r32+bc(3)*r33)-2*(x*pc(1)+y*bc(3))-l(3)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pd(1))*(bd(1)*r11+bd(2)*r12+bd(3)*r13)+2*(y-pd(2))*(bd(1)*r21+bd(2)*r22+bd(3)*r23)+2*(z-pd(3))*(bd(1)*r31+bd(2)*r32+bd(3)*r33)-2*(x*pd(1)+y*bd(3))-l(4)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pe(1))*(be(1)*r11+be(2)*r12+be(3)*r13)+2*(y-pe(2))*(be(1)*r21+be(2)*r22+be(3)*r23)+2*(z-pe(3))*(be(1)*r31+be(2)*r32+be(3)*r33)-2*(x*pe(1)+y*be(3))-l(5)); (6006.25+6006.25+x^2+y^2+z^2+2*(x-pf(1))*(bf(1)*r11+bf(2)*r12+bf(3)*r13)+2*(y-pf(2))*(bf(1)*r21+bf(2)*r22+bf(3)*r23)+2*(z-pf(3))*(bf(1)*r31+bf(2)*r32+bf(3)*r33)-2*(x*pf(1)+y*bf(3))-l(6)); ] %动平台的精度曲线F对动平台的位置坐标求导,代入x0点坐标,代入滑块的终点坐标值z F0_x=[diff(F0(1),x);diff(F0(2),y);diff(F0(3),z); diff(F0(4),a); diff(F0(5),b); diff(F0(6),r);] %牛顿迭代公式 x=x0-inv(F0_x)*F0; r11=cos(x(4))*cos(x(5)); r12=(cos(x(4))*sin(x(5))*sin(x(3)))-(sin(x(4))*cos(x(6))); r13=(cos(x(4))*sin(x(5))*cos(x(3)))+(sin(x(4))*sin(x(6))); r21=sin(x(4))*cos(x(5)); r22=(sin(x(4))*sin(x(5)))*sin(x(3))+(cos(x(4))*cos(x(6))); r23=(sin(x(4))*sin(x(5)))*cos(x(3))-(cos(x(4))*sin(x(6))); r31=-sin(x(5)); r32=cos(x(5))*sin(x(6)); r33=cos(x(5))*cos(x(6)); R=[r11 r12 r13;r21 r22 r23;r31 r32 r33]; F_x=[diff(F0(0),x);diff(F0(1),y);diff(F0(2),z); diff(F0(3),a); diff(F0(4),b); diff(F0(5),r);] xn=x0-2.*inv(F0_x+F_x)*F0; %计算迭代结果的精度矩阵s1和精度矩阵值s s1==[diff(F0(1),x);diff(F0(2),y);diff(F0(3),z); diff(F0(4),a); diff(F0(5),b); diff(F0(6),r);] s=sqrt(s1(1)^2+s1(2)^2+s1(3)^2+s1(4)^2+s1(5)^2+s1(6)^2) %如果精度s不满足要求,则将牛顿迭代值保存为下一次迭代的起始点 x0=x; F0=s1; end %end for if (double(s)<vtr) % % end %end for while (t<=1) Px=vpa(xn(1)); Py=vpa(xn(2)); Pz=vpa(xn(3)); w=vpa(xn(4)*180/pi); v=vpa(xn(5)*180/pi); u=vpa(xn(6)*180/pi); % w=vpa(x(4)); % v=vpa(x(5)); % u=vpa(x(6)); xn=[Px,Py,Pz;w,v,u] t=toc