#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 m_vetRotatinPoints; // 旋转拍照结果,存储旋转后的点坐标 vector m_vetRadius; // 结果半径,用于插值计算 vector m_vetAngle; // 结果角度,用于插值计算 CALIB_R m_stCalibR; // R 轴标定的相关参数结构体 RCalibType m_calibType = RotationCenterCalib; // 标定方式,默认为旋转中心标定 //DOUBLE m_dAngleStep = 1; // 标定时旋转角度,角度单位 //DOUBLE m_dAngleLower = -90; // 标定时角度下限 //DOUBLE m_dAngleUpper = 90; // 标定时角度上限 vector m_stVetCalib_R; // R 轴标定结果,存储每次标定的结果 CXYCalib* m_pXYCalib = nullptr; };