1.基于FPGA的六轴机械臂运动方程逆解求解的方法,其特征在于,FPGA系统包括两个浮点乘法器、一个浮点除法器、一个浮点开方模块、一个Cordic模块、一个反正切模块和两个浮点加法器;两个浮点乘法器、一个浮点除法器、一个浮点开方模块、一个Cordic模块、一个反正切模块和两个浮点加法器全并行工作;两个浮点乘法器包括第一浮点乘法器和第二浮点乘法器;两个浮点加法器包括第一浮点加法器和第二浮点加法器;
所述方法包括:
步骤s1、通过六轴机械臂末端目标的位姿矩阵,根据逆解求解要求目标的位置信息以及计算过程,对所有计算过程进行拆解后进行去相关,然后重新整合;
步骤s2、通过FPGA系统直接实现逆解计算,根据重新整合后的计算过程,得到相应关节角;
步骤s1和s2具体包括:
步骤一:输入的位姿信息
[nx ox ax px]
[ny oy ay py]
[nz oz az pz]
[0 0 0 1]
其中,x,y,z表示机械臂末端位置,n,o,a三个旋转矢量表示机械臂末端姿态;在第I时钟计算d6*ax、d6*ay,d6表示机械臂第六根轴的长度;在第I+6时钟计算mul_o1+py、mul_o2+px,其中mul_o1、mul_o2分别为第一浮点乘法器、第二浮点乘法器在当前时钟的输出;在第I+14时钟计算add_o1/add_o2,其中add_o1、add_o2分别为第一浮点加法器、第二浮点加法器在当前时钟的输出;在第I+21时钟计算atan(‑div_o),其中div_o为浮点除法器在当前时钟的输出;在第I+40时钟寄存atan_o为关节角angle1,其中atan_o为反正切模块在当前时钟的输出;
步骤二:在I+40时钟计算cordic(angle1),获得的sin(angle1)记为s1,cos(angle1)记为c1;在第I+71时钟计算nx*s1、ny*c1;在第I+72时钟计算nx*c1、ny*s1;在第I+73时钟计算ox*s1、oy*c1;在第I+74时钟计算ox*c1、oy*s1;在第I+75时钟计算ax*s1、ay*c1;在第I+76时钟计算ax*c1、ay*s1;在第I+77时钟计算nyc1‑nxs1,其中nyc1、nxs1分别表示ny*c1、nx*s1的乘积;在第I+78时钟计算‑nxc1‑nys1;在第I+79时钟计算oyc1‑oxs1;在第I+80时钟计算‑oxc1‑oys1;在第I+81时钟计算ayc1‑axs1;在第I+82时钟计算‑axc1‑ays1;
步骤三:在第I+1时钟计算d6*az;在第I+7时钟计算‑pz‑mul_o1;在第I+15时钟寄存add_o1为b;在I+77时钟计算py*c1、px*s1;在第I+83时钟计算pyc1‑pxs1;在第I+91时钟计算add_o1‑d2;在第I+93时钟计算d6*ax1;在第I+99时钟计算add_o1+mul_o1;在第I+101时钟计算b*b;在第I+107时钟寄存add_o1为a,计算2d5*b、2a4*a,计算b*b+a4*a4,其中d5为机械臂第五轴的长度,2d5即两倍d5的值,a4为第三第四轴的z方向平移距离,2a4为两倍a4;在第I+108时钟计算2a4*b、2d5*a;在第I+113时钟计算mul_o1+mul_o2;在第I+114时钟计算mul_o1‑mul_o2;在第I+115时钟计算mul_o1‑add_o1;在第I+121时钟寄存add_o1为c_2;在第I+122时钟计算add_o1/c_2;在第I+123时钟计算add_o1/c_2;在第I+129时钟寄存div_o为c,计算c*c;在第I+130时钟寄存div_o为d,计算d*d;在第I+135时钟寄存cc;在第I+136时钟计算cc‑mul_o1;在第I+144时钟计算add_o1+1;在第I+152时钟计算add_o1*4;在第I+158时钟寄存mul_o1为e;
步骤四:在第I+158时钟计算sqrt(e);在第I+163时钟计算c*d;在第I+169时钟计算mul_o1*2、cc*2;在第I+175时钟计算sqrt(e)‑2cd、2cc+2;在第I+183时钟计算add_o1/add_o2;在第I+190时钟寄存div_o为c23,计算mul_o1*c;在第I+196时钟计算mul_o1+d、d5*c23;
在第I+197时钟计算a4*c23;在第I+202时钟计算a‑mul_o1;在第I+203时钟计算b+mul_o1;
在第I+204时钟寄存add_o1为s23,计算a4*add_o1;在第I+205计算d5*s23;在第I+210时钟计算add_o1‑mul_o1;在第I+211时钟计算add_o1‑mul_o1;在第I+218时钟计算add_o1/d5;
在第I+219时钟计算add_o1/‑d5;在第I+226时钟寄存add_o1为s2在第I,寄存div_o为c2,计算atan(s2,c2);在第I+227时钟计算atan(s23,c23);在第I+245时钟寄存atan_o为angle2;
在第I+246时钟计算atan_o‑angle2寄存为angle3;
步骤五:在第I+206时钟计算nx1*s23、ny1*c23;在第I+207时钟计算ox1*s23、oy1*c23;
在第I+208时钟计算ax1*s23、ay1*c23;在第I+209时钟计算ax1*c23、ay1*s23;在第I+212时钟计算nx1s23‑ny1c23;在第I+213时钟计算ox1s23‑oy1c23;在第I+214时钟计算ax1s23‑ay1c23;在第I+215时钟计算ax1c23+ay1s23;在第I+220时钟寄存add_o1为nx3;在第I+221时钟寄存add_o1为ox3;在第I+222时钟寄存add_o1为ax3计算atan(ay3,ax3);在第I+223时钟寄存add_o1为az3;在第I+241时钟寄存atan_o为angle4;
步骤六:在第I+241时钟计算cordic(angle4);在第I+272时钟寄存cordic_o为s4,c4,计算ay3*s4、ax3*c4;在第I+273时钟计算ox3*s4、oy3*c4;在第I+274时钟计算ny3*c4、nx3*s4;在第I+278时钟计算ay3s4+ax3c4;在第I+279时钟计算ox3s4‑oy3c4;在第I+280时钟计算ny3c4‑nx3s4;在第I+286时钟计算atan(s5,c5);在第I+287时钟寄存add_o为s6;在第I+
288时钟计算atan(s6,c6);在第I+305时钟寄存atan_o为angle5;在第I+307时钟寄存atan_o为angle6;
步骤七:执行完成步骤一~六获得的angle1、angle2、angle3、angle4、angle5、angle6的值记为angle_all1,angle_all1为角度组,包含6个角度;判断angle4是否大于0,若大于零,则angle4赋值为angle4‑180°,反之赋值为angle4+180°,然后再次执行步骤六,获得第二组angle1、angle2、angle3、angle4、angle5、angle6的值记为angle_all2;
步骤八:修改步骤四中I+175时钟为计算‑sqrt(e)‑2cd,步骤一~三不变,重新执行步骤四~七,获得angle_all3和agnle_all4;
步骤九:判断angle1是否大于0,若大于零,则angle1赋值为angle1‑180°,反之赋值为angle1+180°;重新执行步骤一~八,获得angle_all5、angle_all6、angle_all7、angle_all8;此时存在八组angle1、angle2、angle3、angle4、angle5、angle6的角度值,与前一次传感器输入角度进行比对,选取最优解。