代码
代码
namespace jixiebi.net
{
/// <summary>
/// <summary>
/// 矩阵乘法
/// </summary>
/// <param name=”matrix1″>矩阵 1</param>
/// <param name=”matrix2″>矩阵 2</param>
/// <returns>积</returns>
public static double[][] MatrixMult(double[][] matrix1, double[][] matrix2)
{
//matrix1 是 m*n 矩阵,matrix2 是 n*p 矩阵,则 result 是 m*p 矩阵
int m = matrix1.Length, n = matrix2.Length, p = matrix2[0].Length;
double[][] result1 = new double[m][];
for (int i = 0; i < result1.Length; i++)
{
result1[i] = new double[p];
}
//矩阵乘法:c[i,j]=Sigma(k=1→n,a[i,k]*b[k,j])
for (int i = 0; i < m; i++)
{
for (int j = 0; j < p; j++)
{
//对乘加法则
for (int k = 0; k < n; k++)
{
result1[i][j] += (matrix1[i][k] * matrix2[k][j]);
}
}
}
return result1;
}
/// <summary>
/// 打印矩阵
/// </summary>
/// <param name=”matrix”>待打印矩阵</param>
public static void PrintMatrix(double[][] matrix)
{
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix[i].Length; j++)
{
Console.Write(matrix[i][j] + “\t”);
}
Console.WriteLine();
}
}
/* 正解 */
/* 初始化数组 */
double[][] T06 = new double[4][]{
new double[4],new double[4],new double[4],new double[4]{0,0,0,1}
};
T06 = MatrixMult(T01, T12);
T06 = MatrixMult(T06, T23);
T06 = MatrixMult(T06, T34);
T06 = MatrixMult(T06, T45);
T06 = MatrixMult(T06, T56);
PrintMatrix(T06);
}
}
/* 角 6,2,3,4 */
for (int i = 0; i < 8; i++) {
/* 角 6 */
double A6 = (EndPose[0][1] * Math.Sin(Results[i][0]) - EndPose[1][1] *
Math.Sin(Results[i][0])) / Math.Sin(Results[i][4]);
double B6 = -(EndPose[0][0] * Math.Sin(Results[i][0]) - EndPose[1][0] *
Math.Cos(Results[i][0])) / Math.Sin(Results[i][4]);
Results[i][5] = Math.Atan2(A6, B6);
/*
@brief A234 = sin(theta2 - theta2 + theta4)
*/
double A234 = EndPose[2][2] / Math.Sin(Results[i][4]);
double B234 = (EndPose[0][2] * Math.Cos(Results[i][0]) + EndPose[1][2]
* Math.Sin(Results[i][0])) / Math.Sin(Results[i][4]);
/* 角 2 */
double M2 = d5 * A234 - d6 * Math.Sin(Results[i][4]) * B234 +
EndPose[0][3] * Math.Cos(Results[i][0]) + EndPose[1][3] * Math.Sin(Results[i][0]);
double N2 = -d5 * B234 - d6 * Math.Sin(Results[i][4]) * A234 - d1 +
EndPose[2][3];
double L2 = (M2 * M2 + N2 * N2 + a2 * a2 - a3 * a3) / (2 * a2);
if (i % 2 == 0) {
Results[i][1] = Math.Atan2(N2, M2) - Math.Atan2(L2, Math.Sqrt(M2 * M2 +
N2 * N2 - L2 * L2));
} else {
Results[i][1] = Math.Atan2(N2, M2) - Math.Atan2(L2, -Math.Sqrt(M2 * M2
+ N2 * N2 - L2 * L2));
}
double A23 = (-M2 - a2 * sin(Results[i][1])) / a3;
double B23 = (N2 - a2 * cos(Results[i][1])) / a3;
/* 角 3 */
Results[i][2] = Results[i][1] - Math.Atan2(A23, B23);
/* 角 4 */
Results[i][3] = Math.Atan2(A234, B234) - Math.Atan2(A23, B23);
}
/* 将关节角度值限制在 -180 或 180 度内 */
for (int i = 0; i < 8; i++) {
for(int j = 0; j < 6; j++) {
if (Results[i][j] > Math.PI) {
Results[i][j] = Results[i][j] - 2 * Math.PI;
} else if(Results[i][j] < -Math.PI) {
Results[i][j] = Results[i][j] + 2 * Math.PI;
}
}
}
/* 八组逆解结果 */
PrintMatrix(Results);
}