123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- #pragma once
- #include "CCalib.h"
- /**
- * @class CRCalib
- * 继承自 CCalib 的 R 轴标定类,用于实现 R 轴的标定功能
- * 1、需要先完成九点标定
- */
- class __declspec(dllexport) CRCalib : public CCalib {
- public:
- /**
- * @enum RCalibType
- * @brief 定义 R 轴标定的类型
- */
- enum RCalibType {
- StepCalib, // 步进标定
- RotationCenterCalib // 旋转中心标定
- };
- /**
- * @brief 构造函数
- * @param GetModuleType 模块类型,用于标识不同的模块
- * @param GetModuleName 模块名称,用于区分不同的模块
- */
- CRCalib(int GetModuleType, string GetModuleName);
- /**
- * @brief 析构函数
- */
- ~CRCalib() {}
- /**
- * @brief 开始标定操作
- * @return 标定操作的返回值,通常 0 表示成功,非 0 表示失败
- * @override 重写基类的纯虚函数
- */
- virtual int StartCalib() override;
- /**
- * @brief 设置标定参数
- * @override 重写基类的纯虚函数
- */
- virtual void SetParam() override;
- /**
- * @brief 从数据库管理类中加载标定参数
- * @override 重写基类的纯虚函数
- */
- virtual LONG GetParam() override;
- /**
- * @brief 获取旋转中心
- * @param center 输出的旋转中心坐标,通过引用传递
- * @return 操作结果,OK 表示成功,FAIL 表示失败
- */
- LONG GetCenter(XY_DOUBLE_STRUCT& center) {
- // 检查旋转中心坐标是否为 (0, 0),如果是则返回 FAIL
- if (m_stCalibR.m_stRotateCenter.x == 0 && m_stCalibR.m_stRotateCenter.y == 0) {
- return FAIL;
- }
- // 将旋转中心坐标赋值给输出参数
- center = m_stCalibR.m_stRotateCenter;
- return OK;
- }
- /**
- * @brief 根据角度获取偏移量
- * @param dAngle 输入的角度
- * @param stCoefficient_R 输出的偏移量结果,通过引用传递
- * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
- */
- LONG GetOffsetByAngle(double dAngle, Step_RCalib_Result& stCoefficient_R);
- /**
- * @brief 计算标定结果
- * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
- */
- LONG CalResult();
- /**
- * @brief 计算旋转偏移量
- * @param angle 输入的旋转角度
- * @param dx 输出的 X 方向偏移量,通过引用传递
- * @param dy 输出的 Y 方向偏移量,通过引用传递
- * @return 操作结果,LONG 类型,通常 0 表示成功,非 0 表示失败
- */
- LONG CalRotationOffset(double angle, double& dx, double& dy);
- /**
- * @brief 计算点的旋转位置
- * @param point 输入的原始点坐标
- * @param rotationRad 输入的旋转弧度
- * @param rotatedPoint 输出的旋转后的点坐标,通过引用传递
- * @return 操作结果,布尔类型,true 表示成功,false 表示失败
- */
- bool rotationPos(const XY_DOUBLE_STRUCT& point, const double& rotationRad, XY_DOUBLE_STRUCT& rotatedPoint);
-
- //设置旋转中心
- void SetCenter(XY_DOUBLE_STRUCT center) {
- m_stCalibR.m_stRotateCenter = center;
- SetParam();
- }
- //设置九点标定对象
- void SetXYCalib(CXYCalib* calib) {
- m_pXYCalib = calib;
- }
- //保存当前标定所使用的数据
- void SetTempID(int tempID) {
- m_stCalibR.m_nTempId = tempID;
- SetParam();
- }
- //获得标定参数
- CALIB_R GetCalibParam() { return m_stCalibR; }
- LONG MoveToCalibPos();
- private:
- const int ROT_NUM = 8; // 旋转拍照的次数
- vector<Point2D> m_vetRotatinPoints; // 旋转拍照结果,存储旋转后的点坐标
- vector<double> m_vetRadius; // 结果半径,用于插值计算
- vector<double> m_vetAngle; // 结果角度,用于插值计算
- CALIB_R m_stCalibR; // R 轴标定的相关参数结构体
- RCalibType m_calibType = RotationCenterCalib; // 标定方式,默认为旋转中心标定
- //DOUBLE m_dAngleStep = 1; // 标定时旋转角度,角度单位
- //DOUBLE m_dAngleLower = -90; // 标定时角度下限
- //DOUBLE m_dAngleUpper = 90; // 标定时角度上限
- vector<Step_RCalib_Result> m_stVetCalib_R; // R 轴标定结果,存储每次标定的结果
- CXYCalib* m_pXYCalib = nullptr;
- };
|