diff --git a/App/App.pro b/App/App.pro index f059f45..aa99142 100644 --- a/App/App.pro +++ b/App/App.pro @@ -1,16 +1,16 @@ TEMPLATE = subdirs # 拆包项目 -# SUBDIRS += ./GrabBag/GrabBag.pro +SUBDIRS += ./GrabBag/GrabBag.pro # 撕裂项目 -SUBDIRS += ./BeltTearing/BeltTearing.pro +# SUBDIRS += ./BeltTearing/BeltTearing.pro #焊接 # SUBDIRS += ./LapWeld/LapWeld.pro #工件定位 -SUBDIRS += ./Workpiece/Workpiece.pro +# SUBDIRS += ./Workpiece/Workpiece.pro # 颗粒尺寸检测 # SUBDIRS += ./ParticleSize/ParticleSize.pro diff --git a/App/BeltTearing/BeltTearingServer/BeltTearingPresenter.cpp b/App/BeltTearing/BeltTearingServer/BeltTearingPresenter.cpp index 48ed2b8..a1e00c3 100644 --- a/App/BeltTearing/BeltTearingServer/BeltTearingPresenter.cpp +++ b/App/BeltTearing/BeltTearingServer/BeltTearingPresenter.cpp @@ -322,10 +322,12 @@ void BeltTearingPresenter::sendSimulationData() // 使用成员变量(开流时会清除) m_simulationCallCount++; + m_simulationTearIdCounter = 2629344; + // 固定生成2个撕裂,长度逐渐增大 for (int i = 0; i < 2; i++) { SSG_beltTearingInfo tear; - tear.tearID = ++m_simulationTearIdCounter; + tear.tearID = m_simulationTearIdCounter + i; tear.tearStatus = keSG_tearStatus_Growing; // 撕裂长度:基础长度 + 调用次数 * 10 diff --git a/App/GrabBag/Doc/视觉方案.docx b/App/GrabBag/Doc/视觉方案.docx index 4a686f7..a61c1e9 100644 --- a/App/GrabBag/Doc/视觉方案.docx +++ b/App/GrabBag/Doc/视觉方案.docx @@ -17,5 +17,8 @@ 4、视觉拍出多个袋子,一次只给一个位置数据,因为下次抓包前还需再次拍照。 四、通讯协议: 1、机械臂-->视觉:@,视觉号,视觉模版号,启动信息,$:如@,1,3,Trig,$(触发1号视觉拍照,调用3号视觉模版,发出Trig拍照) - 2、视觉-->机械臂:@,1,X,Y,Z,U,0/1,$(有无包),如有包时:@,1,X,Y,Z,U,1,$;无包时:@,1,0,0,0,0,0,$。 + 2、视觉-->机械臂:@,1,X,Y,Z,U,0/1/2,$(有无包/错误), + 如有包时:@,1,X,Y,Z,U,1,$; + 无包时: @,1,0,0,0,0,0,$。 + 错误是: @,1,0,0,0,0,2,$。 3、@为帧头,$为结束符。 diff --git a/App/GrabBag/GrabBagApp/Presenter/Src/DetectPresenter.cpp b/App/GrabBag/GrabBagApp/Presenter/Src/DetectPresenter.cpp index 6e6fe71..ef3d317 100644 --- a/App/GrabBag/GrabBagApp/Presenter/Src/DetectPresenter.cpp +++ b/App/GrabBag/GrabBagApp/Presenter/Src/DetectPresenter.cpp @@ -30,11 +30,13 @@ int DetectPresenter::DetectBag(std::vector& detectionDataCache // 3. 调用算法检测接口(使用当前相机的调平参数) std::vector objOps; - sg_getBagPosition(static_cast(detectionDataCache.data()), detectionDataCache.size(), algoParam, cameraCalibParam, objOps); + int nErr = 0; + sg_getBagPosition(static_cast(detectionDataCache.data()), detectionDataCache.size(), algoParam, cameraCalibParam, objOps, &nErr); // 从点云数据生成投影图像 detectionResult.image = PointCloudImageUtils::GeneratePointCloudImage(static_cast(detectionDataCache.data()), detectionDataCache.size(), objOps); + detectionResult.errorCode = nErr; // 转换检测结果为UI显示格式(使用机械臂坐标系数据) for (size_t i = 0; i < objOps.size(); i++) { diff --git a/App/GrabBag/GrabBagApp/Presenter/Src/GrabBagPresenter.cpp b/App/GrabBag/GrabBagApp/Presenter/Src/GrabBagPresenter.cpp index 9b775e0..c24d4a9 100644 --- a/App/GrabBag/GrabBagApp/Presenter/Src/GrabBagPresenter.cpp +++ b/App/GrabBag/GrabBagApp/Presenter/Src/GrabBagPresenter.cpp @@ -452,7 +452,7 @@ void GrabBagPresenter::onTcpDataReceivedFromCallback(const TCPClient* pClient, c std::string receivedData(pData, nLen); QString qData = QString::fromStdString(receivedData).trimmed(); - + LOG_INFO("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); LOG_INFO("TCP data received from client %p: %s\n", pClient, qData.toStdString().c_str()); if (m_pStatus) { @@ -1425,7 +1425,7 @@ int GrabBagPresenter::_DetectTask() m_pParameterManager->GetRgbColorPattern(), m_pParameterManager->GetFrontColorTemplate(), m_pParameterManager->GetBackColorTemplate(), detectionResult); - LOG_INFO("[Algo Thread] DetectBag returned: %d\n", nRet); + LOG_INFO("[Algo Thread] DetectBag return: %d\n", nRet); } catch (const std::exception& e) { LOG_ERROR("[Algo Thread] Exception in DetectBag: %s\n", e.what()); if (m_pStatus) { @@ -1450,7 +1450,7 @@ int GrabBagPresenter::_DetectTask() LOG_INFO("[Algo Thread] algo detected %zu objects time : %.2f ms\n", detectionResult.positions.size(), oTimeUtils.GetElapsedTimeInMilliSec()); // 8. 返回检测结果 - detectionResult.cameraIndex = m_currentCameraIndex; + detectionResult.cameraIndex = m_currentExecutionParams.cameraIndex; // 调用检测结果回调函数 m_pStatus->OnDetectionResult(detectionResult); @@ -1459,7 +1459,7 @@ int GrabBagPresenter::_DetectTask() m_pStatus->OnStatusUpdate(statusMsg.toStdString()); // 更新机械臂协议状态(发送转换后的目标位置数据) - _SendDetectionResultToRobot(detectionResult, m_currentCameraIndex); + _SendDetectionResultToRobot(detectionResult, m_currentExecutionParams.cameraIndex); // 9. 检测完成后,将工作状态更新为"完成" if (m_pStatus) { @@ -1469,8 +1469,7 @@ int GrabBagPresenter::_DetectTask() // 设置机械臂工作状态为相应相机工作完成(相机ID从1开始) if (m_pRobotProtocol) { - uint16_t workStatus = (m_currentCameraIndex == 1) ? - RobotProtocol::WORK_STATUS_CAMERA1_DONE : RobotProtocol::WORK_STATUS_CAMERA2_DONE; + uint16_t workStatus = (m_currentExecutionParams.cameraIndex == 1) ? RobotProtocol::WORK_STATUS_CAMERA1_DONE : RobotProtocol::WORK_STATUS_CAMERA2_DONE; m_pRobotProtocol->SetWorkStatus(workStatus); } @@ -1542,7 +1541,7 @@ void GrabBagPresenter::_SendDetectionResultToRobot(const DetectionResult& detect } } } else { - LOG_WARNING("Robot TCP protocol not available\n"); + LOG_WARNING("ModbusTCP protocol not available\n"); } // 发送到串口 @@ -1585,20 +1584,18 @@ void GrabBagPresenter::_SendDetectionResultToRobot(const DetectionResult& detect tcpipSent = true; }else { // 无包裹时:@,1,0,0,0,0,0,$ - result.append("0,0,0,0,0,$"); // 协议尾 + result.append("0,0,0,0,"); // 协议尾 + if(detectionResult.errorCode == SX_BAG_TRAY_EMPTY){ + result.append("0,$"); + }else{ + result.append("2,$"); + } tcpipSent = true; } m_pTcpServer->SendAllData(result.c_str(), result.length()); - } - - - // 总结发送状态 - if (robotSent || serialSent) { - LOG_INFO("Detection result sent successfully (Robot TCP: %s, Serial: %s)\n", - robotSent ? "Yes" : "No", serialSent ? "Yes" : "No"); } else { - LOG_WARNING("Failed to send detection result via any protocol\n"); + LOG_WARNING("TCP server not available\n"); } } @@ -2124,8 +2121,7 @@ void GrabBagPresenter::_UpdateCurrentExecutionParams() // 5.1 设置包裹参数(从包裹配置中获取) m_currentExecutionParams.bagParam = currentPackage->bagParam; - LOG_INFO("Using bag parameters: L=%.1f, W=%.1f, H=%.1f\n", - currentPackage->bagParam.bagL, currentPackage->bagParam.bagW, currentPackage->bagParam.bagH); + LOG_INFO("Using bag parameters: L=%.1f, W=%.1f, H=%.1f\n", currentPackage->bagParam.bagL, currentPackage->bagParam.bagW, currentPackage->bagParam.bagH); // 6. 设置调平参数(从相机配置中获取) if (currentCamera->planeCalibParam.isCalibrated && @@ -2136,11 +2132,9 @@ void GrabBagPresenter::_UpdateCurrentExecutionParams() m_currentExecutionParams.planeCalibParam.invRMatrix[i] = currentCamera->planeCalibParam.invRMatrix[i]; } m_currentExecutionParams.planeCalibParam.planeHeight = currentCamera->planeCalibParam.planeHeight; - LOG_INFO("Using calibrated plane parameters from camera %s (height=%.3f)\n", - currentCamera->cameraName.c_str(), currentCamera->planeCalibParam.planeHeight); + LOG_INFO("Using calibrated plane parameters from camera %s (height=%.3f)\n", currentCamera->cameraName.c_str(), currentCamera->planeCalibParam.planeHeight); } else { - LOG_INFO("Camera %s is not calibrated, using identity matrix for plane calibration\n", - currentCamera->cameraName.c_str()); + LOG_INFO("Camera %s is not calibrated, using identity matrix for plane calibration\n", currentCamera->cameraName.c_str()); } // 7. 设置手眼标定参数(从相机配置中获取) @@ -2152,8 +2146,7 @@ void GrabBagPresenter::_UpdateCurrentExecutionParams() } LOG_INFO("Using calibrated hand-eye matrix from camera %s\n", currentCamera->cameraName.c_str()); } else { - LOG_INFO("Camera %s hand-eye is not calibrated, using identity matrix\n", - currentCamera->cameraName.c_str()); + LOG_INFO("Camera %s hand-eye is not calibrated, using identity matrix\n", currentCamera->cameraName.c_str()); } LOG_INFO("Current execution parameters updated successfully\n"); @@ -2162,10 +2155,7 @@ void GrabBagPresenter::_UpdateCurrentExecutionParams() LOG_INFO(" Package: %s\n", currentPackage->name.c_str()); // 更新 ParameterManager 的当前执行参数 - m_pParameterManager->SetCurrentExecutionParams( - m_currentExecutionParams.planeCalibParam, - m_currentExecutionParams.handEyeCalibMatrix - ); + m_pParameterManager->SetCurrentExecutionParams(m_currentExecutionParams.planeCalibParam, m_currentExecutionParams.handEyeCalibMatrix); } // 重载版本:直接使用配置指针更新执行参数 diff --git a/App/GrabBag/GrabBagApp/Version.h b/App/GrabBag/GrabBagApp/Version.h index c564ffc..d694813 100644 --- a/App/GrabBag/GrabBagApp/Version.h +++ b/App/GrabBag/GrabBagApp/Version.h @@ -2,9 +2,9 @@ #define VERSION_H -#define GRABBAG_VERSION_STRING "1.3.3" +#define GRABBAG_VERSION_STRING "1.3.4" #define GRABBAG_BUILD_STRING "0" -#define GRABBAG_FULL_VERSION_STRING "V1.3.3_0" +#define GRABBAG_FULL_VERSION_STRING "V1.3.4_0" // 获取版本信息的便捷函数 inline const char* GetGrabBagVersion() { diff --git a/App/GrabBag/GrabBagApp/Version.md b/App/GrabBag/GrabBagApp/Version.md index f88dcc1..ef34943 100644 --- a/App/GrabBag/GrabBagApp/Version.md +++ b/App/GrabBag/GrabBagApp/Version.md @@ -1,9 +1,15 @@ -#1.3.3 +# 1.3.4 +## build_0 2025-12-14 +1. 修复协议对接使用相机参数错误 +2. 修复调平后重新读取参数文件 +3. 更新算法:空托盘的判断 + + +# 1.3.3 ## build_0 2025-12-10 1. 更新算法,增加outputMode参数 - -#1.3.2 +# 1.3.2 ## build_2 2025-11-23 1. config 修改默认数据 diff --git a/App/GrabBag/GrabBagApp/dialogconfigtree.cpp b/App/GrabBag/GrabBagApp/dialogconfigtree.cpp index 67852ab..1a0dc92 100644 --- a/App/GrabBag/GrabBagApp/dialogconfigtree.cpp +++ b/App/GrabBag/GrabBagApp/dialogconfigtree.cpp @@ -958,16 +958,22 @@ void DialogConfigTree::onCameraLevelClicked() int x = parentGeometry.left() + (parentGeometry.width() - dlg.width()) / 2; int y = parentGeometry.top() + (parentGeometry.height() - dlg.height()) / 2; dlg.move(x, y); -#if 0 - if (dlg.exec() == QDialog::Accepted) { - // 调平成功后,刷新相机配置显示 - showCameraConfig(m_currentWorkPos, m_currentCamera); - } -#else - dlg.exec(); - showCameraConfig(m_currentWorkPos, m_currentCamera); -#endif + dlg.exec(); + + // 对话框关闭后,重新加载配置文件 + IVrConfig* vrConfig = m_presenter->GetConfig(); + if (vrConfig) { + ConfigResult newConfig = vrConfig->LoadConfig(PathManager::GetInstance().GetConfigFilePath().toStdString()); + *m_configResult = newConfig; + } + + // 遍历所有工位的所有相机,刷新配置显示 + for (auto& wp : m_configResult->workPositions) { + for (auto& cam : wp.cameras) { + showCameraConfig(&wp, &cam); + } + } } void DialogConfigTree::displayHandEyeCalibInline() diff --git a/AppUtils/AppCommon/Inc/IVisionApplicationStatus.h b/AppUtils/AppCommon/Inc/IVisionApplicationStatus.h index 977af9a..0babd19 100644 --- a/AppUtils/AppCommon/Inc/IVisionApplicationStatus.h +++ b/AppUtils/AppCommon/Inc/IVisionApplicationStatus.h @@ -89,6 +89,7 @@ struct DetectionResultData { QImage image; std::vector positions; int cameraIndex = 1; // 相机索引,默认为1(第一个相机) + int errorCode = 0; // 结果错误码,0表示成功,非0表示错误 // 默认构造函数 DetectionResultData() = default; diff --git a/Device/VrEyeDevice/Src/VrEyeDevice.cpp b/Device/VrEyeDevice/Src/VrEyeDevice.cpp index c115909..56ea421 100644 --- a/Device/VrEyeDevice/Src/VrEyeDevice.cpp +++ b/Device/VrEyeDevice/Src/VrEyeDevice.cpp @@ -4,6 +4,11 @@ #include +#ifdef VR_EYE_DEBUG_MODE +#include "LaserDataLoader.h" +#include +#endif + CVrEyeDevice::CVrEyeDevice() : m_pHandle(nullptr) { @@ -11,6 +16,15 @@ CVrEyeDevice::CVrEyeDevice() CVrEyeDevice::~CVrEyeDevice() { +#ifdef VR_EYE_DEBUG_MODE + // 停止debug线程 + if (m_debugRunning) { + m_debugRunning = false; + if (m_debugThread.joinable()) { + m_debugThread.join(); + } + } +#endif // 确保设备被正确关闭 if (m_pHandle) { CloseDevice(); @@ -24,19 +38,28 @@ int CVrEyeDevice::InitDevice() int CVrEyeDevice::SetStatusCallback(VzNL_OnNotifyStatusCBEx fNotify, void *param) { +#ifdef VR_EYE_DEBUG_MODE + m_debugStatusCallback = fNotify; + m_debugStatusCallbackParam = param; + LOG_DEBUG("VR_EYE_DEBUG_MODE: Status callback stored\n"); + return SUCCESS; +#endif // 如果设备已经打开,立即设置回调 if (m_pHandle) { VzNL_SetDeviceStatusNotifyEx(m_pHandle, fNotify, param); - LOG_DEBUG("Status callback set for opened device\n"); } else { LOG_DEBUG("Status callback stored, will be set when device opens\n"); } - + return SUCCESS; } int CVrEyeDevice::OpenDevice(const char* sIP, bool bRGBD, bool bSwing, bool bFillLaser) { +#ifdef VR_EYE_DEBUG_MODE + LOG_DEBUG("VR_EYE_DEBUG_MODE: OpenDevice success\n"); + return SUCCESS; +#endif int nErrCode = SUCCESS; // 搜索设备 VzNL_ResearchDevice(keSearchDeviceFlag_EthLaserRobotEye); @@ -136,12 +159,21 @@ int CVrEyeDevice::OpenDevice(const char* sIP, bool bRGBD, bool bSwing, bool bFil int CVrEyeDevice::GetVersion(SVzNLVersionInfo &sVersionInfo) { +#ifdef VR_EYE_DEBUG_MODE + strcpy(sVersionInfo.szSDKVersion, "DEBUG_MODE_1.0.0"); + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetVersion(m_pHandle, &sVersionInfo); } int CVrEyeDevice::GetDevInfo(SVzNLEyeDeviceInfoEx &sDeviceInfo) { +#ifdef VR_EYE_DEBUG_MODE + memset(&sDeviceInfo, 0, sizeof(SVzNLEyeDeviceInfoEx)); + strcpy(sDeviceInfo.sEyeCBInfo.byServerIP, "192.168.1.100"); + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); memcpy(&sDeviceInfo, &m_sEeyCBDeviceInfo, sizeof(SVzNLEyeDeviceInfoEx)); return SUCCESS; @@ -149,6 +181,10 @@ int CVrEyeDevice::GetDevInfo(SVzNLEyeDeviceInfoEx &sDeviceInfo) int CVrEyeDevice::CloseDevice() { +#ifdef VR_EYE_DEBUG_MODE + LOG_DEBUG("VR_EYE_DEBUG_MODE: CloseDevice success\n"); + return SUCCESS; +#endif int nErrCode = SUCCESS; if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); VzNL_EndDetectLaser(m_pHandle); @@ -162,6 +198,15 @@ int CVrEyeDevice::CloseDevice() int CVrEyeDevice::StartDetect(VzNL_AutoOutputLaserLineExCB fCallFunc, EVzResultDataType eDataType, void *param) { +#ifdef VR_EYE_DEBUG_MODE + LOG_DEBUG("VR_EYE_DEBUG_MODE: StartDetect\n"); + m_debugCallback = fCallFunc; + m_debugCallbackParam = param; + m_debugDataType = eDataType; + m_debugRunning = true; + m_debugThread = std::thread(&CVrEyeDevice::DebugThreadFunc, this); + return SUCCESS; +#endif int nErrCode = SUCCESS; if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); VzNL_SetLaserLight(m_pHandle, VzTrue); @@ -177,6 +222,14 @@ bool CVrEyeDevice::IsDetectIng() int CVrEyeDevice::StopDetect() { +#ifdef VR_EYE_DEBUG_MODE + LOG_DEBUG("VR_EYE_DEBUG_MODE: StopDetect\n"); + m_debugRunning = false; + if (m_debugThread.joinable()) { + m_debugThread.join(); + } + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_StopAutoDetect(m_pHandle); } @@ -199,12 +252,19 @@ int CVrEyeDevice::GetDetectROI(SVzNLRect &leftROI, SVzNLRect &rightROI) int CVrEyeDevice::SetEyeExpose(unsigned int &exposeTime) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_ConfigEyeExpose(m_pHandle, keVzNLExposeMode_Fix, exposeTime); } int CVrEyeDevice::GetEyeExpose(unsigned int &exposeTime) { +#ifdef VR_EYE_DEBUG_MODE + exposeTime = 1000; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); EVzNLExposeMode peExposeMode; return VzNL_GetConfigEyeExpose(m_pHandle, &peExposeMode, &exposeTime); @@ -212,6 +272,9 @@ int CVrEyeDevice::GetEyeExpose(unsigned int &exposeTime) int CVrEyeDevice::SetEyeGain(unsigned int &gain) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); int nRet = VzNL_SetCameraGain(m_pHandle, keEyeSensorType_Left, gain); nRet |= VzNL_SetCameraGain(m_pHandle, keEyeSensorType_Right, gain); @@ -220,24 +283,38 @@ int CVrEyeDevice::SetEyeGain(unsigned int &gain) int CVrEyeDevice::GetEyeGain(unsigned int &gain) { +#ifdef VR_EYE_DEBUG_MODE + gain = 100; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetCameraGain(m_pHandle, keEyeSensorType_Left, reinterpret_cast(&gain)); } int CVrEyeDevice::SetFrame(int &frame) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_SetFrameRate(m_pHandle, frame); } int CVrEyeDevice::GetFrame(int &frame) { +#ifdef VR_EYE_DEBUG_MODE + frame = 30; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetFrameRate(m_pHandle, reinterpret_cast(&frame)); } bool CVrEyeDevice::IsSupport() { +#ifdef VR_EYE_DEBUG_MODE + return true; +#endif if(!m_pHandle) return false; int nRet = 0; @@ -247,12 +324,19 @@ bool CVrEyeDevice::IsSupport() int CVrEyeDevice::SetRGBDExposeThres(float &value) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_SetRGBAutoExposeThres(m_pHandle, value); } int CVrEyeDevice::GetRGBDExposeThres(float &value) { +#ifdef VR_EYE_DEBUG_MODE + value = 128.0f; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); int nRet = 0; value = VzNL_GetRGBAutoExposeThres(m_pHandle, &nRet); @@ -261,48 +345,78 @@ int CVrEyeDevice::GetRGBDExposeThres(float &value) int CVrEyeDevice::SetFilterHeight(double &dHeight) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_ConfigLaserLineFilterHeight(m_pHandle, dHeight); } int CVrEyeDevice::GetFilterHeight(double &dHeight) { +#ifdef VR_EYE_DEBUG_MODE + dHeight = 100.0; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetLaserLineFilterHeight(m_pHandle, &dHeight); } int CVrEyeDevice::GetSwingSpeed(float &fSpeed) { +#ifdef VR_EYE_DEBUG_MODE + fSpeed = 10.0f; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetSwingAngleSpeed(m_pHandle, &fSpeed); } int CVrEyeDevice::SetSwingSpeed(float &fSpeed) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_SetSwingAngleSpeed(m_pHandle, fSpeed); } int CVrEyeDevice::SetSwingAngle(float &fMin, float &fMax) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_SetSwingMotorAngle(m_pHandle, fMin, fMax); } int CVrEyeDevice::GetSwingAngle(float &fMin, float &fMax) { +#ifdef VR_EYE_DEBUG_MODE + fMin = -30.0f; + fMax = 30.0f; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetSwingMotorAngle(m_pHandle, &fMin, &fMax); } int CVrEyeDevice::SetWorkRange(double &nMin, double &nMax) { +#ifdef VR_EYE_DEBUG_MODE + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_SetSwingMotorWorkRange(m_pHandle, nMin, nMax); } int CVrEyeDevice::GetWorkRange(double &dMin, double &dMax) { +#ifdef VR_EYE_DEBUG_MODE + dMin = 500.0; + dMax = 1500.0; + return SUCCESS; +#endif if(!m_pHandle) return ERRCODE(DEV_NO_OPEN); return VzNL_GetSwingMotorWorkRange(m_pHandle, &dMin, &dMax); } @@ -314,3 +428,50 @@ int IVrEyeDevice::CreateObject(IVrEyeDevice** ppEyeDevice) *ppEyeDevice = p; return 0; } + +#ifdef VR_EYE_DEBUG_MODE +void CVrEyeDevice::DebugThreadFunc() +{ + // 固定的点云文件路径 + const std::string debugFilePath = "C:\\project\\QT\\GrabBag\\TestData\\LapWeld\\scanData_ground_1.txt"; + + LaserDataLoader loader; + std::vector> laserLines; + int lineNum = 0; + float scanSpeed = 0.0f; + int maxTimeStamp = 0; + int clockPerSecond = 0; + + // 加载点云文件 + int ret = loader.LoadLaserScanData(debugFilePath, laserLines, lineNum, scanSpeed, maxTimeStamp, clockPerSecond); + if (ret != SUCCESS) { + LOG_DEBUG("VR_EYE_DEBUG_MODE: Failed to load laser data from %s, error: %s\n",debugFilePath.c_str(), loader.GetLastError().c_str()); + m_debugRunning = false; + return; + } + + LOG_DEBUG("VR_EYE_DEBUG_MODE: Loaded %d laser lines from %s\n", lineNum, debugFilePath.c_str()); + + int currentIndex = 0; + + // 循环读取并回调 + while (m_debugRunning && currentIndex < lineNum) { + if (m_debugCallback && currentIndex < lineNum) { + auto& dataPair = laserLines[currentIndex]; + m_debugCallback(dataPair.first, &dataPair.second, m_debugCallbackParam); + } + currentIndex++; + + // 模拟采集间隔,约30ms + std::this_thread::sleep_for(std::chrono::milliseconds(5)); + } + if (m_debugStatusCallback) { + m_debugStatusCallback(keDeviceWorkStatus_Device_Swing_Finish, nullptr, 0, m_debugStatusCallbackParam); + m_debugStatusCallback(keDeviceWorkStatus_Device_Auto_Stop, nullptr, 0, m_debugStatusCallbackParam); + } + + // 释放数据 + loader.FreeLaserScanData(laserLines); + LOG_DEBUG("VR_EYE_DEBUG_MODE: Debug thread stopped\n"); +} +#endif diff --git a/Device/VrEyeDevice/VrEyeDevice.pro b/Device/VrEyeDevice/VrEyeDevice.pro index ae54b83..1d46507 100644 --- a/Device/VrEyeDevice/VrEyeDevice.pro +++ b/Device/VrEyeDevice/VrEyeDevice.pro @@ -64,6 +64,15 @@ win32:CONFIG(debug, debug|release) { LIBS += -L../../VrUtils -lVrUtils } +INCLUDEPATH += $$PWD/../../AppUtils/CloudUtils/Inc +win32:CONFIG(debug, debug|release) { + LIBS += -L../../AppUtils/CloudUtils/debug -lCloudUtils +}else:win32:CONFIG(release, debug|release){ + LIBS += -L../../AppUtils/CloudUtils/release -lCloudUtils +}else:unix:!macx { + LIBS += -L../../AppUtils/CloudUtils -lCloudUtils +} + # 添加libmodbus依赖 win32 { LIBS += -lws2_32 diff --git a/Device/VrEyeDevice/_Inc/VrEyeDevice.h b/Device/VrEyeDevice/_Inc/VrEyeDevice.h index 283f93c..6d731df 100644 --- a/Device/VrEyeDevice/_Inc/VrEyeDevice.h +++ b/Device/VrEyeDevice/_Inc/VrEyeDevice.h @@ -1,6 +1,11 @@ #ifndef CVREYEDEVICE_H #define CVREYEDEVICE_H +#ifdef _WIN32 +// Debug模式开关 - 修改此处开启/关闭debug功能 +#define VR_EYE_DEBUG_MODE +#endif + #include "IVrEyeDevice.h" #include "IVzDeviceCoreDataReader.h" #include "VrEyeCommon.h" @@ -13,6 +18,13 @@ #include "VZNL_RGBConfig.h" #include "VZNL_DetectLaser.h" +#ifdef VR_EYE_DEBUG_MODE +#include +#include +#include +#include +#endif + class CVrEyeDevice : public IVrEyeDevice { public: @@ -152,6 +164,20 @@ private: VZNLHANDLE m_pHandle = nullptr; SVzNLEyeDeviceInfoEx m_sEeyCBDeviceInfo; +#ifdef VR_EYE_DEBUG_MODE + // Debug模式相关成员 + VzNL_AutoOutputLaserLineExCB m_debugCallback = nullptr; + void* m_debugCallbackParam = nullptr; + EVzResultDataType m_debugDataType; + std::atomic m_debugRunning{false}; + std::thread m_debugThread; + std::mutex m_debugMutex; + VzNL_OnNotifyStatusCBEx m_debugStatusCallback = nullptr; + void* m_debugStatusCallbackParam = nullptr; + + void DebugThreadFunc(); +#endif + }; #endif // CVREYEDEVICE_H diff --git a/SDK/bagPosition/Inc/SG_bagPositioning_Export.h b/SDK/bagPosition/Inc/SG_bagPositioning_Export.h index 3ca4aa4..761260c 100644 --- a/SDK/bagPosition/Inc/SG_bagPositioning_Export.h +++ b/SDK/bagPosition/Inc/SG_bagPositioning_Export.h @@ -71,7 +71,8 @@ SG_APISHARED_EXPORT void sg_getBagPosition( //std::vector>& noisePts, const SG_bagPositionParam algoParam, const SSG_planeCalibPara poseCalibPara, - std::vector& objOps); + std::vector& objOps, + int* errCode); SG_APISHARED_EXPORT void sg_getBagPositionAndOrientation( SVzNLXYZRGBDLaserLine* laser3DPoints, diff --git a/SDK/bagPosition/Inc/SG_baseDataType.h b/SDK/bagPosition/Inc/SG_baseDataType.h index d2d3a3e..24b6550 100644 --- a/SDK/bagPosition/Inc/SG_baseDataType.h +++ b/SDK/bagPosition/Inc/SG_baseDataType.h @@ -478,3 +478,9 @@ typedef struct int markID; SVzNL3DPoint mark3D; }SWD_charuco3DMark; + +typedef struct +{ + SVzNL3DPoint pt1; + SVzNL3DPoint pt2; +}SWD_3DPointPair; \ No newline at end of file diff --git a/SDK/bagPosition/Inc/SG_errCode.h b/SDK/bagPosition/Inc/SG_errCode.h index c6a9432..5deb68a 100644 --- a/SDK/bagPosition/Inc/SG_errCode.h +++ b/SDK/bagPosition/Inc/SG_errCode.h @@ -19,4 +19,7 @@ //ץȡ #define SX_ERR_INVLID_CUTTING_Z -2101 -#define SX_ERR_ZERO_OBJ -2102 \ No newline at end of file +#define SX_ERR_ZERO_OBJ -2102 + +// +#define SX_BAG_TRAY_EMPTY -2201 diff --git a/SDK/bagPosition/Windows/x64/Debug/bagPositioning.dll b/SDK/bagPosition/Windows/x64/Debug/bagPositioning.dll index 235f78f..8099112 100644 Binary files a/SDK/bagPosition/Windows/x64/Debug/bagPositioning.dll and b/SDK/bagPosition/Windows/x64/Debug/bagPositioning.dll differ diff --git a/SDK/bagPosition/Windows/x64/Debug/bagPositioning.pdb b/SDK/bagPosition/Windows/x64/Debug/bagPositioning.pdb index e61059f..a33abe6 100644 Binary files a/SDK/bagPosition/Windows/x64/Debug/bagPositioning.pdb and b/SDK/bagPosition/Windows/x64/Debug/bagPositioning.pdb differ diff --git a/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.dll b/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.dll index a3f5907..2921f8c 100644 Binary files a/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.dll and b/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.dll differ diff --git a/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.pdb b/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.pdb index 8db6fd2..a3b4ef7 100644 Binary files a/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.pdb and b/SDK/bagPosition/Windows/x64/Debug/baseAlgorithm.pdb differ diff --git a/SDK/bagPosition/Windows/x64/Release/bagPositioning.dll b/SDK/bagPosition/Windows/x64/Release/bagPositioning.dll index 64cb13f..1c527d2 100644 Binary files a/SDK/bagPosition/Windows/x64/Release/bagPositioning.dll and b/SDK/bagPosition/Windows/x64/Release/bagPositioning.dll differ diff --git a/SDK/bagPosition/Windows/x64/Release/bagPositioning.pdb b/SDK/bagPosition/Windows/x64/Release/bagPositioning.pdb index fe0d496..c3fa0bc 100644 Binary files a/SDK/bagPosition/Windows/x64/Release/bagPositioning.pdb and b/SDK/bagPosition/Windows/x64/Release/bagPositioning.pdb differ diff --git a/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.dll b/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.dll index d3a16c6..5a97fec 100644 Binary files a/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.dll and b/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.dll differ diff --git a/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.pdb b/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.pdb index 81b1c88..e66d2d8 100644 Binary files a/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.pdb and b/SDK/bagPosition/Windows/x64/Release/baseAlgorithm.pdb differ