CRCalib.h 3.8 KB

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