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; ; } } }