按照机械臂系列第四篇中的公式,用C#实现机械臂的正向求解。
用到的矩阵乘法在http://blog.csdn.net/shaynerain/article/details/77692920中
1、首先对建立D-H表,上篇中建立的有些不太符合,在此处更正
-
public class D_H
-
{
-
public double[] theta = new double[4];
-
public double[] d = { 3, 0, 0, 2.5 };
-
public double[] a = { 0, 6.4, 5.5, 9.4 };
-
public double[] alpha = { (Math.PI / 2), 0, -Math.PI, 0 };
-
}
2、求出每个关节相对前个关节的姿态
-
public class T : D_H
-
{
-
public double[] GetAngle(double[][]tt)
-
{
-
double[] theta = new double[3];
-
theta[0] = -Math.Atan2(tt[0][2], tt[1][2]);
-
//theta[1] = Math.Atan(tt[2][0]/(Math.Cos(theta[0]) * tt[0][3] + Math.Sin(theta[0]) * tt[1][3]));
-
//theta[0] = -Math.Atan(tt[1][3]/tt[0][3]);
-
-
-
return theta;
-
}
-
public double[][] GetTii_1(int i)
-
{
-
double[][] t = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
-
-
t[0][0] = Math.Cos(theta[i]);
-
t[0][1] = -Math.Cos(alpha[i]) * Math.Sin(theta[i]);
-
t[0][2] = Math.Sin(alpha[i]) * Math.Sin(theta[i]);
-
t[0][3] = a[i] * Math.Cos(theta[i]);
-
-
t[1][0] = Math.Sin(theta[i]);
-
t[1][1] = Math.Cos(alpha[i]) * Math.Cos(theta[i]);
-
t[1][2] = -Math.Sin(alpha[i]) * Math.Cos(theta[i]);
-
t[1][3] = a[i] * Math.Sin(theta[i]);
-
-
t[2][0] = 0;
-
t[2][1] = Math.Sin(alpha[i]);
-
t[2][2] = Math.Cos(alpha[i]);
-
t[2][3] = d[i];
-
-
return t;
-
}
-
-
}
3、正解
定义以及初始化
-
T t = new T();
-
double[][] t0 = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
-
double[][] t1 = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
-
double[][] t2 = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
-
double[][] t3 = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
-
double[][] tt = new double[4][]{
-
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
-
};
赋值:
t.theta[0]= 0;
t.theta[1]= 0;
t.theta[2]= 0;
t.theta[3]= 0;
求解:
-
t0 = t.GetTii_1(0);
-
t1 = t.GetTii_1(1);
-
t2 = t.GetTii_1(2);
-
t3 = t.GetTii_1(3);
-
-
tt = MatrixMult(t0, t1);
-
tt = MatrixMult(tt, t2);
-
tt = MatrixMult(tt, t3);
-
//打印
-
PrintMatrix(tt);