CRCalib.h 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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. };
  19. //离线模式
  20. class __declspec(dllexport) CRCalib : public CCalib {
  21. public:
  22. /**
  23. * @enum RCalibType
  24. * @brief 定义 R 轴标定的类型
  25. */
  26. enum RCalibType {
  27. StepCalib, // 步进标定
  28. RotationCenterCalib // 旋转中心标定
  29. };
  30. /**
  31. * @brief 构造函数
  32. * @param GetModuleType 模块类型,用于标识不同的模块
  33. * @param GetModuleName 模块名称,用于区分不同的模块
  34. */
  35. CRCalib(int GetModuleType, string GetModuleName);
  36. /**
  37. * @brief 析构函数
  38. */
  39. ~CRCalib() {}
  40. /**
  41. * @brief 开始标定操作
  42. * @return 标定操作的返回值,通常 0 表示成功,非 0 表示失败
  43. * @override 重写基类的纯虚函数
  44. */
  45. virtual int StartCalib() override;
  46. /**
  47. * @brief 设置标定参数
  48. * @override 重写基类的纯虚函数
  49. */
  50. virtual void SetParam() override;
  51. /**
  52. * @brief 从数据库管理类中加载标定参数
  53. * @override 重写基类的纯虚函数
  54. */
  55. virtual LONG GetParam() override;
  56. /**
  57. * @brief 获取旋转中心
  58. * @param center 输出的旋转中心坐标,通过引用传递
  59. * @return 操作结果,OK 表示成功,FAIL 表示失败
  60. */
  61. LONG GetCenter(XY_DOUBLE_STRUCT& center) {
  62. // 检查旋转中心坐标是否为 (0, 0),如果是则返回 FAIL
  63. if (m_stCalibParam_R.stRotateCenter.x == 0 && m_stCalibParam_R.stRotateCenter.y == 0) {
  64. return FAIL;
  65. }
  66. // 将旋转中心坐标赋值给输出参数
  67. center = m_stCalibParam_R.stRotateCenter;
  68. return OK;
  69. }
  70. /**
  71. * @brief 根据角度获取偏移量
  72. * @param dAngle 输入的角度
  73. * @param stCoefficient_R 输出的偏移量结果,通过引用传递
  74. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  75. */
  76. LONG GetOffsetByAngle(double dAngle, Step_RCalib_Result& stCoefficient_R);
  77. /**
  78. * @brief 计算标定结果
  79. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  80. */
  81. LONG CalResult();
  82. /**
  83. * @brief 计算旋转偏移量
  84. * @param angle 输入的旋转角度
  85. * @param dx 输出的 X 方向偏移量,通过引用传递
  86. * @param dy 输出的 Y 方向偏移量,通过引用传递
  87. * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
  88. */
  89. LONG CalRotationOffset(double angle, double& dx, double& dy);
  90. /**
  91. * @brief 计算点的旋转位置
  92. * @param point 输入的原始点坐标
  93. * @param rotationRad 输入的旋转弧度
  94. * @param rotatedPoint 输出的旋转后的点坐标,通过引用传递
  95. * @return 操作结果,布尔类型,true 表示成功,false 表示失败
  96. */
  97. bool rotationPos(const XY_DOUBLE_STRUCT& point, const double& rotationRad, XY_DOUBLE_STRUCT& rotatedPoint);
  98. //设置旋转中心
  99. void SetCenter(XY_DOUBLE_STRUCT center) {
  100. m_stCalibParam_R.stRotateCenter = center;
  101. SetParam();
  102. }
  103. //设置九点标定对象
  104. void SetXYCalib(CXYCalib* calib) {
  105. m_pXYCalib = calib;
  106. }
  107. //保存当前标定所使用的数据
  108. void SetTempID(int tempID) {
  109. m_stCalibParam_R.nTempId = tempID;
  110. SetParam();
  111. }
  112. //获得标定参数
  113. CALIB_R_PARAM GetCalibParam() { return m_stCalibParam_R; }
  114. LONG MoveToCalibPos();
  115. LONG CalibTest();
  116. private:
  117. void DataChangNotice(string strDbName, string strTableName);
  118. private:
  119. const int ROT_NUM = 8; // 旋转拍照的次数
  120. vector<MODULE_CONFIG_STRUCT> m_vecConfigStruct;
  121. vector<Point2D> m_vetRotatinPoints; // 旋转拍照结果,存储旋转后的点坐标
  122. vector<double> m_vetRadius; // 结果半径,用于插值计算
  123. vector<double> m_vetAngle; // 结果角度,用于插值计算
  124. //CALIB_R m_stCalibR; // R 轴标定的相关参数结构体
  125. CALIB_R_PARAM m_stCalibParam_R;
  126. RCalibType m_calibType = RotationCenterCalib; // 标定方式,默认为旋转中心标定
  127. //DOUBLE m_dAngleStep = 1; // 标定时旋转角度,角度单位
  128. //DOUBLE m_dAngleLower = -90; // 标定时角度下限
  129. //DOUBLE m_dAngleUpper = 90; // 标定时角度上限
  130. vector<Step_RCalib_Result> m_stVetCalib_R; // R 轴标定结果,存储每次标定的结果
  131. CXYCalib* m_pXYCalib = nullptr;
  132. };