ToolCoord.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. using MathNet.Numerics.LinearAlgebra;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace TeamAAS_VP.Core
  8. {
  9. /// <summary>
  10. /// 工具坐标系
  11. /// </summary>
  12. public class ToolCoord
  13. {
  14. /// <summary>
  15. /// 工具坐标编号
  16. /// </summary>
  17. public int ToolNumber { get; set; } = 0;
  18. /// <summary>
  19. /// 工具坐标X
  20. /// </summary>
  21. public double X { get; set; } = 0;
  22. /// <summary>
  23. /// 工具坐标Y
  24. /// </summary>
  25. public double Y { get; set; } = 0;
  26. /// <summary>
  27. /// 工具坐标
  28. /// </summary>
  29. public Vector<double> Coord { get; set; } = Vector<double>.Build.Dense(new double[] { 0, 0 });
  30. /// <summary>
  31. /// 创建工具坐标
  32. /// </summary>
  33. /// <param name="x">x坐标</param>
  34. /// <param name="y">Y坐标</param>
  35. public void SetTool(double x, double y)
  36. {
  37. SetTool(Vector<double>.Build.Dense(new double[] { x, y }));
  38. }
  39. /// <summary>
  40. /// 创建工具坐标
  41. /// </summary>
  42. /// <param name="coord">向量坐标</param>
  43. public void SetTool(Vector<double> coord)
  44. {
  45. X = coord[0]; Y = coord[1]; Coord = coord;
  46. }
  47. /// <summary>
  48. /// 已知Tool 0下的坐标和tool n下的坐标,计算Tool n
  49. /// </summary>
  50. /// <param name="x1">tool 0下的坐标,J4关节的旋转中心点</param>
  51. /// <param name="y1">tool 0下的坐标,J4关节的旋转中心点</param>
  52. /// <param name="u1">tool 0下的坐标,J4关节的旋转中心点</param>
  53. /// <param name="x2">tool n下的坐标</param>
  54. /// <param name="y2">tool n下的坐标</param>
  55. public void ComputeTool(double x1, double y1, double u1, double x2, double y2)
  56. {
  57. Vector<double> P0 = Vector<double>.Build.Dense(new double[] { x1, y1 });
  58. Vector<double> P1 = Vector<double>.Build.Dense(new double[] { x2, y2 });
  59. ComputeTool(P0, P1, u1);
  60. }
  61. /// <summary>
  62. /// 两点法计算工具坐标(已知Tool 0下的两个点的坐标计算 Tool n)
  63. /// </summary>
  64. /// <param name="x1">Tool 0下点1坐标</param>
  65. /// <param name="y1">Tool 0下点1坐标</param>
  66. /// <param name="u1">Tool 0下点1坐标</param>
  67. /// <param name="x2">Tool 0下点2坐标</param>
  68. /// <param name="y2">Tool 0下点2坐标</param>
  69. /// <param name="u2">Tool 0下点2坐标</param>
  70. public void ComputeTool(double x1, double y1, double u1, double x2, double y2, double u2)
  71. {
  72. Vector<double> P1 = Vector<double>.Build.Dense(new double[] { x1, y1 });
  73. Vector<double> P2 = Vector<double>.Build.Dense(new double[] { x2, y2 });
  74. ComputeTool(P1, P2, u1, u2);
  75. }
  76. /// <summary>
  77. /// 已知Tool 0下的坐标和tool n下的坐标,计算Tool n
  78. /// </summary>
  79. /// <param name="tool0">tool 0下的坐标,J4关节的旋转中心点</param>
  80. /// <param name="tooln">tool n下的坐标,</param>
  81. /// <param name="Angle">Tool 0旋转角度,J4关节的旋转角度</param>
  82. public void ComputeTool(Vector<double> P0, Vector<double> P1, double Angle)
  83. {
  84. //Pb=𝑹^(−𝟏)*(𝑷1-𝑷0)
  85. double rad = AngleToRad(Angle);
  86. // 创建旋转矩阵
  87. Matrix<double> rotationMatrix = Matrix<double>.Build.DenseOfArray(new double[,]
  88. {
  89. { Math.Cos(rad), -Math.Sin(rad) },
  90. { Math.Sin(rad), Math.Cos(rad) }
  91. });
  92. //逆矩阵
  93. var InvR = rotationMatrix.Inverse();
  94. Vector<double> Pb = InvR * (P1 - P0);
  95. Coord = Pb;
  96. X = Pb[0];
  97. Y = Pb[1];
  98. }
  99. /// <summary>
  100. /// 两点法计算工具坐标(已知Tool 0下的两个点的坐标计算 Tool n)
  101. /// </summary>
  102. /// <param name="P1">点1坐标</param>
  103. /// <param name="P2">点2坐标</param>
  104. /// <param name="Angle1">点1角度</param>
  105. /// <param name="Angle2">点2角度</param>
  106. public void ComputeTool(Vector<double> P1, Vector<double> P2, double Angle1, double Angle2)
  107. {
  108. //R1* 𝑷𝟑+ 𝑷𝟏= R2* 𝑷𝟑+ 𝑷𝟐
  109. //𝑷𝟑= (R1 −R𝟐)^−𝟏*(𝑷𝟐−𝑷𝟏)
  110. Angle1 = AngleToRad(Angle1);
  111. Angle2 = AngleToRad(Angle2);
  112. // 创建旋转矩阵
  113. Matrix<double> R1 = Matrix<double>.Build.DenseOfArray(new double[,]
  114. {
  115. { Math.Cos(Angle1), -Math.Sin(Angle1) },
  116. { Math.Sin(Angle1), Math.Cos(Angle1) }
  117. });
  118. Matrix<double> R2 = Matrix<double>.Build.DenseOfArray(new double[,]
  119. {
  120. { Math.Cos(Angle2), -Math.Sin(Angle2) },
  121. { Math.Sin(Angle2), Math.Cos(Angle2) }
  122. });
  123. Matrix<double> RN = R1 - R2;
  124. Vector<double> PN = P2 - P1;
  125. //Vector<double> P3 = RN.Inverse() * PN;
  126. Vector<double> P3 = RN.Solve(PN);
  127. Coord = P3;
  128. X = P3[0];
  129. Y = P3[1];
  130. }
  131. /// <summary>
  132. /// 已知Tool n下的坐标和Tool n旋转的角度,计算Tool 0下的坐标
  133. /// </summary>
  134. /// <param name="tooln">Tool n下的坐标</param>
  135. /// <param name="Angle">tool n旋转的角度</param>
  136. /// <returns></returns>
  137. public Vector<double> GetTool0Coord(Vector<double> tooln, double Angle)
  138. {
  139. Coord = Vector<double>.Build.Dense(new double[] { X, Y });
  140. double rad = AngleToRad(Angle);
  141. // 创建旋转矩阵
  142. Matrix<double> rotationMatrix = Matrix<double>.Build.DenseOfArray(new double[,]
  143. {
  144. { Math.Cos(rad), -Math.Sin(rad) },
  145. { Math.Sin(rad), Math.Cos(rad) }
  146. });
  147. Vector<double> P0 = rotationMatrix * (-Coord) + tooln;
  148. return P0;
  149. }
  150. /// <summary>
  151. /// 已知Tool 0下的坐标和Tool 0旋转的角度,计算Tool n下的坐标
  152. /// </summary>
  153. /// <param name="tool0">Tool 0下的坐标</param>
  154. /// <param name="Angle">tool 0旋转的角度</param>
  155. /// <returns></returns>
  156. public Vector<double> GetToolnCoord(Vector<double> tool0, double Angle)
  157. {
  158. Coord = Vector<double>.Build.Dense(new double[] { X, Y });
  159. double rad = AngleToRad(Angle);
  160. // 创建旋转矩阵
  161. Matrix<double> rotationMatrix = Matrix<double>.Build.DenseOfArray(new double[,]
  162. {
  163. { Math.Cos(rad), -Math.Sin(rad) },
  164. { Math.Sin(rad), Math.Cos(rad) }
  165. });
  166. Vector<double> P0 = rotationMatrix * Coord + tool0;
  167. return P0;
  168. }
  169. /// <summary>
  170. /// 角度转换成弧度
  171. /// </summary>
  172. /// <param name="angle">角度</param>
  173. /// <returns></returns>
  174. public static double AngleToRad(double angle)
  175. {
  176. return Math.PI * angle / 180;
  177. }
  178. /// <summary>
  179. /// 弧度转换成度数
  180. /// </summary>
  181. /// <param name="radian">弧度</param>
  182. /// <returns></returns>
  183. public static double RadToAngle(double radian)
  184. {
  185. return radian * 180 / Math.PI; ;
  186. }
  187. }
  188. }