CRCalib.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #pragma once
  2. #include "CCalib.h"
  3. /**
  4. * @class CRCalib
  5. * 继承自 CCalib 的 R 轴标定类,用于实现 R 轴的标定功能
  6. * 1、需要先完成九点标定
  7. */
  8. struct CALIB_R_PARAM {
  9. double dCalibPosX = 0;
  10. double dCalibPosY = 0;
  11. double dGrabPosZ = 0; //拍照位
  12. int nTempId = 0;
  13. double dStartAngle = -40; //标定时角度下限
  14. double dEndAngle = 40; //标定时角度上限
  15. int nRotationNum = 10; //旋转次数
  16. XY_DOUBLE_STRUCT stRotateCenter = { 0,0 }; //旋转中心
  17. double dRad = 0; //旋转半径
  18. XY_DOUBLE_STRUCT stZeroOffset = { 0,0 }; //轴0度时的xy偏差,视觉拍照结果为准
  19. double dZeroAngle = 0; //轴0度时的角度
  20. double dZeroRadius = 0; //轴0度时的半径
  21. // double dZeroAngle = 0;
  22. };
  23. //离线模式
  24. class __declspec(dllexport) CRCalib : public CCalib {
  25. public:
  26. /**
  27. * @enum RCalibType
  28. * @brief 定义 R 轴标定的类型
  29. */
  30. enum RCalibType {
  31. StepCalib, // 步进标定
  32. RotationCenterCalib // 旋转中心标定
  33. };
  34. /**
  35. * @brief 构造函数
  36. * @param GetModuleType 模块类型,用于标识不同的模块
  37. * @param GetModuleName 模块名称,用于区分不同的模块
  38. */
  39. CRCalib(int GetModuleType, string GetModuleName);
  40. /**
  41. * @brief 析构函数
  42. */
  43. ~CRCalib() {}
  44. /**
  45. * @brief 开始标定操作
  46. * @return 标定操作的返回值,通常 0 表示成功,非 0 表示失败
  47. * @override 重写基类的纯虚函数
  48. */
  49. virtual int StartCalib() override;
  50. LONG InterpCalib();//插值补偿计算
  51. int ZeroOffset(XY_DOUBLE_STRUCT& offset);
  52. XY_DOUBLE_STRUCT GetZeroOffset() {
  53. return m_stCalibParam_R.stZeroOffset;
  54. }
  55. /**
  56. * @brief 设置标定参数
  57. * @override 重写基类的纯虚函数
  58. */
  59. virtual void SetParam() override;
  60. /**
  61. * @brief 从数据库管理类中加载标定参数
  62. * @override 重写基类的纯虚函数
  63. */
  64. virtual LONG GetParam() override;
  65. XY_DOUBLE_STRUCT CalibPos() {return XY_DOUBLE_STRUCT(m_stCalibParam_R.dCalibPosX, m_stCalibParam_R.dCalibPosY); };
  66. /**
  67. * @brief 获取旋转中心
  68. * @param center 输出的旋转中心坐标,通过引用传递
  69. * @return 操作结果,OK 表示成功,FAIL 表示失败
  70. */
  71. LONG GetCenter(XY_DOUBLE_STRUCT& center) {
  72. // 检查旋转中心坐标是否为 (0, 0),如果是则返回 FAIL
  73. if (m_stCalibParam_R.stRotateCenter.x == 0 && m_stCalibParam_R.stRotateCenter.y == 0) {
  74. return FAIL;
  75. }
  76. // 将旋转中心坐标赋值给输出参数
  77. center = m_stCalibParam_R.stRotateCenter;
  78. return OK;
  79. }
  80. /**
  81. * @brief 根据角度获取偏移量
  82. * @param dAngle 输入的角度
  83. * @param stCoefficient_R 输出的偏移量结果,通过引用传递
  84. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  85. */
  86. LONG GetOffsetByAngle(double dAngle, Step_RCalib_Result& stCoefficient_R);
  87. /**
  88. * @brief 计算标定结果
  89. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  90. */
  91. LONG CalResult();
  92. /**
  93. * @brief 计算旋转偏移量
  94. * @param angle 输入的旋转角度
  95. * @param dx 输出的 X 方向偏移量,通过引用传递
  96. * @param dy 输出的 Y 方向偏移量,通过引用传递
  97. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  98. */
  99. LONG CalRotationOffset(double angle, double& dx, double& dy);
  100. //DieToCenterPos 为芯片位置减去当前旋转中心所在位置,也就是芯片位置和旋转中心的偏差位置
  101. LONG CalRotationOffset(XY_DOUBLE_STRUCT dieToCenterPos, double angle, double& dx, double& dy);
  102. /**
  103. * @brief 计算点的旋转位置
  104. * @param point 输入的原始点坐标
  105. * @param rotationRad 输入的旋转弧度
  106. * @param rotatedPoint 输出的旋转后的点坐标,通过引用传递
  107. * @return 操作结果,布尔类型,true 表示成功,false 表示失败
  108. */
  109. bool rotationPos(const XY_DOUBLE_STRUCT& point, const double& rotationRad, XY_DOUBLE_STRUCT& rotatedPoint);
  110. LONG rotationPos(const XY_DOUBLE_STRUCT& point, const XY_DOUBLE_STRUCT& center, const double& rotationRad, XY_DOUBLE_STRUCT& rotatedPoint);
  111. //输入角度
  112. LONG rotationPos_Deg(const XY_DOUBLE_STRUCT& point, const XY_DOUBLE_STRUCT& center, const double& rotationDeg, XY_DOUBLE_STRUCT& rotatedPoint);
  113. // 屏幕坐标系,顺时针为正,逆时针为负数
  114. LONG RotationPos_Cw(const XY_DOUBLE_STRUCT& point, const XY_DOUBLE_STRUCT& center, const double& rotationDeg, XY_DOUBLE_STRUCT& rotatedPoint);
  115. //设置旋转中心
  116. void SetCenter(XY_DOUBLE_STRUCT center) {
  117. m_stCalibParam_R.stRotateCenter = center;
  118. SetParam();
  119. }
  120. //设置九点标定对象
  121. void SetXYCalib(CXYCalib* calib) {
  122. m_pXYCalib = calib;
  123. }
  124. //保存当前标定所使用的数据
  125. void SetTempID(int tempID) {
  126. m_stCalibParam_R.nTempId = tempID;
  127. SetParam();
  128. }
  129. //获得标定参数
  130. CALIB_R_PARAM GetCalibParam() { return m_stCalibParam_R; }
  131. LONG MoveToCalibPos();
  132. LONG MoveToCenter();
  133. LONG CalibTest();
  134. //角度转弧度公式
  135. double deg2Rad(double degrees)
  136. {
  137. return degrees * M_PI / 180.0;
  138. }
  139. bool GetInterpOffsetEnable() { return m_isInterpOffsetEn; }
  140. private:
  141. void DataChangNotice(string strDbName, string strTableName);
  142. private:
  143. //const int ROT_NUM = 8; // 旋转拍照的次数
  144. vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
  145. vector<MODULE_CONFIG_STRUCT> m_vecInterpConfigStruct;
  146. vector<Point2D> m_vetRotatinPoints; // 旋转拍照结果,存储旋转后的点坐标
  147. vector<XY_DOUBLE_STRUCT> m_vetInterpCalibPoints; //移到旋转中心旋转拍照结果,用于插值计算
  148. vector<double> m_vetRadius; // 结果半径,用于插值计算
  149. vector<double> m_vetAngle; // 结果角度,用于插值计算
  150. //CALIB_R m_stCalibR; // R 轴标定的相关参数结构体
  151. CALIB_R_PARAM m_stCalibParam_R;
  152. RCalibType m_calibType = StepCalib;//RotationCenterCalib; // 标定方式,默认为旋转中心标定
  153. //DOUBLE m_dAngleStep = 1; // 标定时旋转角度,角度单位
  154. //DOUBLE m_dAngleLower = -90; // 标定时角度下限
  155. //DOUBLE m_dAngleUpper = 90; // 标定时角度上限
  156. vector<Step_RCalib_Result> m_stVetCalib_R; // R 轴标定结果,存储每次标定的结果
  157. CXYCalib* m_pXYCalib = nullptr;
  158. int m_nTestTempId = 0;
  159. double m_dCheckAngle = 0;
  160. X_Y_ANGLE_STRUCT m_stCheckOffset{ 0,0,0 };
  161. bool m_isInterpOffsetEn = false; //是否插值补偿
  162. };