#pragma once #include "CCalib.h" #include "ILocalizationManager.h" #include "ICalibration.h" /* CTD:Camera Tip Distance 1、放置玻璃片在上视相机上方 2、保证已完成旋转中心标定。已经调用过SetHeadActualPos 3、调用StartCalib开始标定 */ struct CALIB_LOOKUP_PARAM { //bool m_bHaveHeadPos = false;//已完成旋转中心标定 double dCameraPosX = 0;; //下视标定时X位置 double dCameraPosY = 0; //下视标定时Y位置 double dCameraPosZ = 0; //下视标定时Z位置 double dHeadPosX = 0; //头位置X double dHeadPosY = 0; //头位置Y double dHeadPosZ = 0; //头位置Z double dCameraToHeadPosX = 0; //相机移动到头的相对位置 double dCameraToHeadPosY = 0; // double dHeadActualPosX = -1; double dHeadActualPosY = -1; double dCameraActualPosX = -1; //标定相机和上视相机对准时,绑头获取的位置 double dCameraActualPosY = -1; //标定相机和上视相机对准时,绑头获取的位置 int nBondTempID = 0; //绑头相机拍Mark点模板ID int nLookUpTempID = 0; //上视相机拍Mark点模板ID int nTipTempID = 0; //上视相机拍吸嘴模板 }; class __declspec(dllexport) CCTDCalib : public CCalib { enum CTDCalibType { useRotationCenter, NoUseRotationCenter }; public: /** * @brief 构造函数,创建CCTDCalib对象 * * @param id 标定的唯一标识符,用于区分不同的标定任务 * @param name 标定的名称,方便识别和管理标定任务 */ CCTDCalib(int id, std::string name); /** * @brief 析构函数,销毁CCTDCalib对象 */ ~CCTDCalib() {} /** * @brief 设置上视相机对象 * * @param camera 指向CCameraBase类型的相机对象指针,用于后续的拍照操作 */ void SetLookUpCamera(CCameraBase* camera) { m_pLookUpCamera = camera; } //旋转中心变化,重新更新相机到吸嘴间的距离 void UpdateCameraToHead(XY_DOUBLE_STRUCT rotCenter, XY_DOUBLE_STRUCT& cameraToHead); //没有旋转中心标定,直接用上视相机拍照吸嘴位置 LONG HeadActualPosCalib(int nozzleTemp); //计算相机到吸嘴距离 void CalCameraToHead(); /** * @brief 开始标定操作 * * 该函数会执行一系列的操作,包括相机拍照、视觉定位、轴移动等, * 最终计算出头部到相机的相对位置,并将结果保存到标定参数中。 * * @return int 标定操作的结果,成功返回OK,失败返回相应的错误码 */ int CameraPosCalib(); /** * @brief 设置标定参数 * * 将当前的标定参数保存到数据库中,以便后续使用。 */ virtual void SetParam() override; /** * @brief 获取标定参数 * * 从数据库中读取之前保存的标定参数,更新到当前对象的标定参数结构体中。 */ virtual LONG GetParam() override; /** * @brief 获取头部到相机的位置 * * 根据传入的头部位置和之前标定得到的头部到相机的相对位置, * 计算并返回头部到相机的位置。 * * @param headPos 头部的位置 * @return XY_DOUBLE_STRUCT 头部到相机的位置 */ XY_DOUBLE_STRUCT GetHeadToCameraPos(XY_DOUBLE_STRUCT headPos); /** * @brief 获取相机到头部的位置 * * 根据传入的相机位置和之前标定得到的头部到相机的相对位置, * 计算并返回相机到头部的位置。 * * @param cameraPos 相机的位置 * @return XY_DOUBLE_STRUCT 相机到头部的位置 */ XY_DOUBLE_STRUCT GetCameraToHeadPos(XY_DOUBLE_STRUCT cameraPos); //保存当前标定所使用的数据 void SetLookUpTempID(int lookUpTemp) { m_stLookUpParam.nLookUpTempID = lookUpTemp; SetParam(); } void SetHeadTempID(int tempID) { m_stLookUpParam.nBondTempID = tempID; SetParam(); } void SetNozzleTempID(int temp) { m_stLookUpParam.nTipTempID = temp; SetParam(); } void SetXYCalib(CXYCalib* HeadXYcalib,CXYCalib* lookupXYCalib) { m_pHeadCameraXYCalib = HeadXYcalib; m_pLookUpXYCalib = lookupXYCalib; } LONG MoveToCameraCalibPos(); LONG MoveToHeadCalibPos(); private: void DataChangNotice(string strDbName, string strTableName); private: // 标定的查找参数结构体,用于存储标定过程中的各种参数和结果 //CALIB_LOOKUP m_stParam; std::vector m_vecConfigStruct; CALIB_LOOKUP_PARAM m_stLookUpParam; // 上视相机对象指针,用于进行拍照操作 CCameraBase* m_pLookUpCamera = nullptr; CXYCalib* m_pHeadCameraXYCalib = nullptr; CXYCalib* m_pLookUpXYCalib = nullptr; };