using MathNet.Numerics.LinearAlgebra;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TeamAAS_VP.Core
{
///
/// 工具坐标系
///
public class ToolCoord
{
///
/// 工具坐标编号
///
public int ToolNumber { get; set; } = 0;
///
/// 工具坐标X
///
public double X { get; set; } = 0;
///
/// 工具坐标Y
///
public double Y { get; set; } = 0;
///
/// 工具坐标
///
public Vector Coord { get; set; } = Vector.Build.Dense(new double[] { 0, 0 });
///
/// 创建工具坐标
///
/// x坐标
/// Y坐标
public void SetTool(double x, double y)
{
SetTool(Vector.Build.Dense(new double[] { x, y }));
}
///
/// 创建工具坐标
///
/// 向量坐标
public void SetTool(Vector coord)
{
X = coord[0]; Y = coord[1]; Coord = coord;
}
///
/// 已知Tool 0下的坐标和tool n下的坐标,计算Tool n
///
/// tool 0下的坐标,J4关节的旋转中心点
/// tool 0下的坐标,J4关节的旋转中心点
/// tool 0下的坐标,J4关节的旋转中心点
/// tool n下的坐标
/// tool n下的坐标
public void ComputeTool(double x1, double y1, double u1, double x2, double y2)
{
Vector P0 = Vector.Build.Dense(new double[] { x1, y1 });
Vector P1 = Vector.Build.Dense(new double[] { x2, y2 });
ComputeTool(P0, P1, u1);
}
///
/// 两点法计算工具坐标(已知Tool 0下的两个点的坐标计算 Tool n)
///
/// Tool 0下点1坐标
/// Tool 0下点1坐标
/// Tool 0下点1坐标
/// Tool 0下点2坐标
/// Tool 0下点2坐标
/// Tool 0下点2坐标
public void ComputeTool(double x1, double y1, double u1, double x2, double y2, double u2)
{
Vector P1 = Vector.Build.Dense(new double[] { x1, y1 });
Vector P2 = Vector.Build.Dense(new double[] { x2, y2 });
ComputeTool(P1, P2, u1, u2);
}
///
/// 已知Tool 0下的坐标和tool n下的坐标,计算Tool n
///
/// tool 0下的坐标,J4关节的旋转中心点
/// tool n下的坐标,
/// Tool 0旋转角度,J4关节的旋转角度
public void ComputeTool(Vector P0, Vector P1, double Angle)
{
//Pb=𝑹^(−𝟏)*(𝑷1-𝑷0)
double rad = AngleToRad(Angle);
// 创建旋转矩阵
Matrix rotationMatrix = Matrix.Build.DenseOfArray(new double[,]
{
{ Math.Cos(rad), -Math.Sin(rad) },
{ Math.Sin(rad), Math.Cos(rad) }
});
//逆矩阵
var InvR = rotationMatrix.Inverse();
Vector Pb = InvR * (P1 - P0);
Coord = Pb;
X = Pb[0];
Y = Pb[1];
}
///
/// 两点法计算工具坐标(已知Tool 0下的两个点的坐标计算 Tool n)
///
/// 点1坐标
/// 点2坐标
/// 点1角度
/// 点2角度
public void ComputeTool(Vector P1, Vector P2, double Angle1, double Angle2)
{
//R1* 𝑷𝟑+ 𝑷𝟏= R2* 𝑷𝟑+ 𝑷𝟐
//𝑷𝟑= (R1 −R𝟐)^−𝟏*(𝑷𝟐−𝑷𝟏)
Angle1 = AngleToRad(Angle1);
Angle2 = AngleToRad(Angle2);
// 创建旋转矩阵
Matrix R1 = Matrix.Build.DenseOfArray(new double[,]
{
{ Math.Cos(Angle1), -Math.Sin(Angle1) },
{ Math.Sin(Angle1), Math.Cos(Angle1) }
});
Matrix R2 = Matrix.Build.DenseOfArray(new double[,]
{
{ Math.Cos(Angle2), -Math.Sin(Angle2) },
{ Math.Sin(Angle2), Math.Cos(Angle2) }
});
Matrix RN = R1 - R2;
Vector PN = P2 - P1;
//Vector P3 = RN.Inverse() * PN;
Vector P3 = RN.Solve(PN);
Coord = P3;
X = P3[0];
Y = P3[1];
}
///
/// 已知Tool n下的坐标和Tool n旋转的角度,计算Tool 0下的坐标
///
/// Tool n下的坐标
/// tool n旋转的角度
///
public Vector GetTool0Coord(Vector tooln, double Angle)
{
Coord = Vector.Build.Dense(new double[] { X, Y });
double rad = AngleToRad(Angle);
// 创建旋转矩阵
Matrix rotationMatrix = Matrix.Build.DenseOfArray(new double[,]
{
{ Math.Cos(rad), -Math.Sin(rad) },
{ Math.Sin(rad), Math.Cos(rad) }
});
Vector P0 = rotationMatrix * (-Coord) + tooln;
return P0;
}
///
/// 已知Tool 0下的坐标和Tool 0旋转的角度,计算Tool n下的坐标
///
/// Tool 0下的坐标
/// tool 0旋转的角度
///
public Vector GetToolnCoord(Vector tool0, double Angle)
{
Coord = Vector.Build.Dense(new double[] { X, Y });
double rad = AngleToRad(Angle);
// 创建旋转矩阵
Matrix rotationMatrix = Matrix.Build.DenseOfArray(new double[,]
{
{ Math.Cos(rad), -Math.Sin(rad) },
{ Math.Sin(rad), Math.Cos(rad) }
});
Vector P0 = rotationMatrix * Coord + tool0;
return P0;
}
///
/// 角度转换成弧度
///
/// 角度
///
public static double AngleToRad(double angle)
{
return Math.PI * angle / 180;
}
///
/// 弧度转换成度数
///
/// 弧度
///
public static double RadToAngle(double radian)
{
return radian * 180 / Math.PI; ;
}
}
}