我们有三个方程和3个未知数,但平方使这些困难的方程得到解决。我们需要找到一个参照系简化问题。通过这三个点的虚拟托架位置形成一个可行的框架(如绿色图7所示)。如果我们转移到支架,我们会发现,一个法向量穿过执行器平台位置的平面也通过由三个点形成的三角形的外心。三角形的外心是三边垂直平分线的交点。效应器的中心与这三个托架的位置形成一个四面体,其中增量臂形成四面体和由滑架的位置形成的三角形的三个边是一个不规则的金字塔的基座。这金字塔的侧面是等边三角形。根据定义,线是成直角等边三角形的基座中位点经历的顶点三角形。
图8
11
图9
现在,我们可以用公式来找到外心点。从维基百科条目“外接圆”我们有以下几点:
基于交叉和点产品的中心坐标
在欧几里德空间中,有一个独特的圆经过任何给定的三个非共线的点P1,P2,和P3。使用笛卡尔坐标来表示这些点作为空间矢量,以使用点积和交叉产品来计算圆的半径和中心。让
12
然后该圆的半径由下式给出
圆的中心由线性组合给出
由于
我们可以用这些公式得出的代码。下面是使用这个公式的一个Java程序。在我们发现外心点后,我们发现沿法线向量到笛卡尔点的距离。 然后我们可以对外心点添加适当大小的法向矢量而找到我们的笛卡尔点。
double[] forwardKinematics(double[] dZ){
double[] cartesian = new double[3]; double[][] dColP = new double[3][3];
//结合的输入的Z值为每列创建从X-Y的三个点 for(int iIdx = 0; iIdx < 3; iIdx++){
dColP[iIdx][0] = dCol[iIdx][0]; dColP[iIdx][1] = dCol[iIdx][1]; dColP[iIdx][2] = dZ[iIdx]; }
//dColP现在已经有三个点在列上。计算矢量来表示三角形的边。 double[] dv01 = vectorSub(dColP[1], dColP[0]); double[] dv02 = vectorSub(dColP[2], dColP[0]); double[] dv12 = vectorSub(dColP[2], dColP[1]); double dMag01 = vectorMag(dv01); double dMag02 = vectorMag(dv02); double dMag12 = vectorMag(dv12);
//这为我们提供了一个矢量垂直于三角形的平面 double[] dvZ = vectorCrossProd(dv02, dv01); double dMagZ = vectorMag(dvZ);
double dDeterminate = 2 * Math.pow(dMagZ, 2);
double alpha = Math.pow(dMag12, 2) * vectorDotProd(dv01,
13
dv02)/dDeterminate;
double beta = -Math.pow(dMag02, 2) * vectorDotProd(dv12, dv01)/dDeterminate;
double gamma = Math.pow(dMag01, 2) * vectorDotProd(dv02, dv12)/dDeterminate;
double[] pCircumcenter =
vectorAdd(vectorMult(dColP[0], alpha), vectorMult(dColP[1], beta));
pCircumcenter = vectorAdd(pCircumcenter, vectorMult(dColP[2], gamma)); double[] dvCircumcenter = vectorSub(pCircumcenter, dColP[0]);
//找到从外心到托架点上一列的长度(任何列通过外心定义的距离是相的) double dMag2Circumcenter = vectorMag(dvCircumcenter); //现在使用Pythagorem theorum计算距离
double dZLen =
Math.sqrt(Math.pow(dArmLen, 2) - Math.pow(dMag2Circumcenter, 2)); //创建新的载体,并把它添加到外心点
cartesian = vectorAdd(pCircumcenter, vectorMult(dvZ, dZLen/dMagZ)); return cartesian; }
更多增量分析
由于我们有公式正向和反向运动学的公式,我们就可以回答一些经常被提及 的问题。两个最常见的问题是:“什么是印刷区域的形状?”和“如何解决车厢位置的误差影响执行器的位置?”为此我写了一个创建一个颜色拓扑图的程序来显示打印形状和可能出现的错误。基于以上的讨论,我们可以分析的X-Y平面,其结果可以被转换为任何其它X-Y平面。
我写了一个程序,引导通过X-Y空间,并使用逆运动学计算需要为X-Y位置的车厢位置。然后由每一列误差值改变目标值。这有几种模式。在多列模式,我尝试错误的所有组合(+,0, - )所有的三列(26组合,27号全为0),并查找最大误差。在单表模式下我改变在 - 和+之间的每一列,保持另外两列在0(6组合),并寻找最大误差。我也有一些其他的方式,他们分别是:X轴误差,Y轴误差,Z轴误差,X-Y平面误差和X-Y-Z空间误差。有关Z.的说明。尽管我们的工作在一个给定的Z平面,所产生的车厢位置会造成效应器离开了飞机。因此Z错误。
进一步讨论错误是需要的。我试图做一些这方面的研究,但我还没有发现任何事物让我觉得我能够处理这个问题。所以,我不觉得能胜任这个讨论,但在这里不用。作为一名工程师,我在任何情况下进行测量都会想到一个概率分布。在许多情况下,人们会近似与高斯函数的概率分布相接近。但以我的思维,机制的类型决定了错误。例如,一个梯形螺杆,肯定会有一些间隙。一方面,几乎可以肯定会有一些错误。这样的误差分布不一定集中在0附近以及不是高斯概率分
14
布。另一方面,在DIY三维打印机中使用的皮带驱动器可能具有一个错误,它更多分布在0附近以及分布更可能是高斯概率分布。我提到这一点,是因为当我们分析在三角洲的错误时,我们必须考虑到,有三个来源会造成错误。一种能够在基于所有三列的最大误差的给定点计算最大误差,但要知道,误差分布发生了变化。例如,如果有10%的概率在给定列中的最大误差,则最大误差在所有三列的几率为10%* 10%* 10%(0.1 *0.1 *0.1* 100)或0.1%。但在梯形螺杆中,该错误更可能发生的情况下,多列错误具有更多的意义。所以,我创建了两个模式的测量误差。与往常一样,事实是介于两者之间。
由于每个图像都有自己的颜色图例。为每个组计算的误差范围被划分成10个区域,并分配在底部所示的颜色的图例中。第一套图像的价值是由约翰的马林码值得来的。虚拟半径124毫米和臂长为250mm。
继第一套图像显示了各种错误模式,有一些图片显示了打印区域的不同手臂和半径的组合图像。这些模式将大规模基于手臂和半径之间的比率。
15