From 7342a322d92c10d96e6fb12c759e0c64dfe45ad1 Mon Sep 17 00:00:00 2001 From: jerryzeng Date: Wed, 29 Jul 2026 08:34:39 +0800 Subject: [PATCH] =?UTF-8?q?hybridPosePositioning=20version=201.3.1=20:=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E6=B5=B7=E7=91=9E=E9=A9=AC=E8=BD=AC?= =?UTF-8?q?=E5=AD=90=E9=92=A2=E8=8A=AF=E5=AE=9A=E4=BD=8D=E4=BD=8D=E7=BD=AE?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E8=AE=A1=E7=AE=97=EF=BC=8C=E5=8C=BA=E5=88=86?= =?UTF-8?q?=E5=87=BA=E4=B8=AD=E5=A4=AE=EF=BC=8C=E8=BE=B9=E5=92=8C=E8=A7=92?= =?UTF-8?q?=E7=9A=84=E4=BD=8D=E7=BD=AE=EF=BC=8C=E6=8C=89=E7=85=A7=E4=B8=AD?= =?UTF-8?q?=E5=BF=83=E6=8E=92=E5=BA=8F=EF=BC=8C=E5=85=88=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E6=9C=80=E4=B8=AD=E5=A4=AE=E7=9A=84=E7=9B=AE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bagPositioning_test.vcxproj | 4 +- .../hybridPosePositioning_test.cpp | 5 + sourceCode/SG_errCode.h | 1 + sourceCode/hybridPosePositioning.cpp | 283 +++++++++++++++++- sourceCode/hybridPosePositioning_Export.h | 3 +- 5 files changed, 284 insertions(+), 12 deletions(-) diff --git a/bagPositioning_test/bagPositioning_test.vcxproj b/bagPositioning_test/bagPositioning_test.vcxproj index a012fc7..c2a96f7 100644 --- a/bagPositioning_test/bagPositioning_test.vcxproj +++ b/bagPositioning_test/bagPositioning_test.vcxproj @@ -42,13 +42,13 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode diff --git a/hybridPosePositioning_test/hybridPosePositioning_test.cpp b/hybridPosePositioning_test/hybridPosePositioning_test.cpp index 9027afc..64331d4 100644 --- a/hybridPosePositioning_test/hybridPosePositioning_test.cpp +++ b/hybridPosePositioning_test/hybridPosePositioning_test.cpp @@ -2110,6 +2110,10 @@ void HaiRuiMa_rotorCorePositioning_test(void) sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]); groundCalibPara = _readCalibPara(calibFile); + //读取料筐参数 + sprintf_s(calibFile, "%sbin_info.txt", dataPath[grp]); + WD_HRM_BinInfo binInfo = _readBinInfo(calibFile); + for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) { //fidx = 3; @@ -2137,6 +2141,7 @@ void HaiRuiMa_rotorCorePositioning_test(void) wd_HRM_RotorCorePositioning( scanLines, objROIs, + binInfo, groundCalibPara, workpieceParam, workpiecePositions, diff --git a/sourceCode/SG_errCode.h b/sourceCode/SG_errCode.h index 1123220..25af7df 100644 --- a/sourceCode/SG_errCode.h +++ b/sourceCode/SG_errCode.h @@ -29,6 +29,7 @@ #define SX_ERR_ZERO_OBJ_TOPLAYER -2102 #define SX_ERR_ZERO_OBJ_BTMLAYER -2103 #define SX_ERR_GET_INVALID_PALTE -2104 //ȡ +#define SX_ERR_BIN_EDGE_ERROR -2105 // #define SX_BAG_TRAY_EMPTY -2201 diff --git a/sourceCode/hybridPosePositioning.cpp b/sourceCode/hybridPosePositioning.cpp index 5b3fa22..2a03983 100644 --- a/sourceCode/hybridPosePositioning.cpp +++ b/sourceCode/hybridPosePositioning.cpp @@ -11,7 +11,8 @@ //version 1.1.0 : 滮汾 //version 1.2.0 : ˺׶ιλ汾ζλ //version 1.3.0 : ˺תӸоλ -std::string m_strVersion = "HybridPositioning 1.3.0"; +//version 1.3.1 : ˺תӸоλλԼ㣬ֳ룬ߺͽǵλãĿ +std::string m_strVersion = "HybridPositioning 1.3.1"; const char* wd_hybridPositioningVersion(void) { return m_strVersion.c_str(); @@ -799,6 +800,16 @@ typedef struct std::vector mappings;//ÿ2DܶӦ3D }mapping2DTo3D; +typedef struct +{ + double dist; + int idx; +}WD_indexingDistance; +bool _compareByDistance(WD_indexingDistance& a, WD_indexingDistance& b) +{ + return a.dist < b.dist; +} + bool _compareByXValue(WD_workpieceInfo& a, WD_workpieceInfo& b) { return a.center.x < b.center.x; @@ -834,6 +845,7 @@ void _getYTopLine( void wd_HRM_RotorCorePositioning( std::vector< std::vector>& scanLinesInput, std::vector& objROIs, + const WD_HRM_BinInfo binInfo, const SSG_planeCalibPara groundCalibPara, const SWD_Cylinder workpieceParam, //Բιıư뾶͸߶ std::vector< WD_workpieceInfo>& workpiecePositions, @@ -1174,15 +1186,268 @@ void wd_HRM_RotorCorePositioning( if (allWorkpiece[i].center.z < topLayerTh) zSortWorkpiece.push_back(allWorkpiece[i]); } - //ˮƽ - while (zSortWorkpiece.size() > 0) + + if (binInfo.binTopZ > 1e-4) { - std::vector< WD_workpieceInfo> firstLine; - std::vector< WD_workpieceInfo> restWorkpiece; - _getYTopLine(zSortWorkpiece, firstLine, restWorkpiece, workpieceParam.radius); - workpiecePositions.insert(workpiecePositions.end(), firstLine.begin(), firstLine.end()); - zSortWorkpiece.clear(); - zSortWorkpiece.insert(zSortWorkpiece.end(), restWorkpiece.begin(), restWorkpiece.end()); + //㹤λ + std::vector linePoint; + linePoint.resize(4); + linePoint[0].pt1 = binInfo.minRectVertex[0]; + linePoint[0].pt2 = binInfo.minRectVertex[1]; + linePoint[1].pt1 = binInfo.minRectVertex[1]; + linePoint[1].pt2 = binInfo.minRectVertex[2]; + linePoint[2].pt1 = binInfo.minRectVertex[2]; + linePoint[2].pt2 = binInfo.minRectVertex[3]; + linePoint[3].pt1 = binInfo.minRectVertex[3]; + linePoint[3].pt2 = binInfo.minRectVertex[0]; + int lineTopIdx = -1; + for (int i = 0; i < (int)linePoint.size(); i++) + { + if ((linePoint[i].pt1.y < binInfo.center.y) && (linePoint[i].pt2.y < binInfo.center.y)) + { + lineTopIdx = i; + break; + } + } + if (lineTopIdx < 0) + { + *errCode = SX_ERR_BIN_EDGE_ERROR; + //תȥ + int workpieceNum = (int)workpiecePositions.size(); + for (int i = 0; i < workpieceNum; i++) + { + SVzNL3DPoint rpt; + rpt = wd_ptRotate(workpiecePositions[i].center, groundCalibPara.invRMatrix); + workpiecePositions[i].center = rpt; + rpt = wd_ptRotate(workpiecePositions[i].y_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].y_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].z_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].z_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].x_dir = rpt; + } + return; + } + SWD_3DPointPair lineTop = linePoint[lineTopIdx]; + linePoint.erase(linePoint.begin() + lineTopIdx);//ȥѾʶedge + + int lineBtmIdx = -1; + for (int i = 0; i < (int)linePoint.size(); i++) + { + if ((linePoint[i].pt1.y > binInfo.center.y) && (linePoint[i].pt2.y > binInfo.center.y)) + { + lineBtmIdx = i; + break; + } + } + if (lineBtmIdx < 0) + { + *errCode = SX_ERR_BIN_EDGE_ERROR; + //תȥ + int workpieceNum = (int)workpiecePositions.size(); + for (int i = 0; i < workpieceNum; i++) + { + SVzNL3DPoint rpt; + rpt = wd_ptRotate(workpiecePositions[i].center, groundCalibPara.invRMatrix); + workpiecePositions[i].center = rpt; + rpt = wd_ptRotate(workpiecePositions[i].y_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].y_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].z_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].z_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].x_dir = rpt; + } + return; + } + SWD_3DPointPair lineBtm = linePoint[lineBtmIdx]; + linePoint.erase(linePoint.begin() + lineBtmIdx); //ȥѾʶedge + + int lineLeftIdx = -1; + for (int i = 0; i < (int)linePoint.size(); i++) + { + if ((linePoint[i].pt1.x < binInfo.center.x) && (linePoint[i].pt2.x < binInfo.center.x)) + { + lineLeftIdx = i; + break; + } + } + if (lineLeftIdx < 0) + { + *errCode = SX_ERR_BIN_EDGE_ERROR; + //תȥ + int workpieceNum = (int)workpiecePositions.size(); + for (int i = 0; i < workpieceNum; i++) + { + SVzNL3DPoint rpt; + rpt = wd_ptRotate(workpiecePositions[i].center, groundCalibPara.invRMatrix); + workpiecePositions[i].center = rpt; + rpt = wd_ptRotate(workpiecePositions[i].y_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].y_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].z_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].z_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].x_dir = rpt; + } + return; + } + SWD_3DPointPair lineLeft = linePoint[lineLeftIdx]; + linePoint.erase(linePoint.begin() + lineLeftIdx); //ȥѾʶedge + + int lineRightIdx = -1; + for (int i = 0; i < (int)linePoint.size(); i++) + { + if ((linePoint[i].pt1.x > binInfo.center.x) && (linePoint[i].pt2.x > binInfo.center.x)) + { + lineRightIdx = i; + break; + } + } + if (lineRightIdx < 0) + { + *errCode = SX_ERR_BIN_EDGE_ERROR; + //תȥ + int workpieceNum = (int)workpiecePositions.size(); + for (int i = 0; i < workpieceNum; i++) + { + SVzNL3DPoint rpt; + rpt = wd_ptRotate(workpiecePositions[i].center, groundCalibPara.invRMatrix); + workpiecePositions[i].center = rpt; + rpt = wd_ptRotate(workpiecePositions[i].y_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].y_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].z_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].z_dir = rpt; + rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.invRMatrix); + workpiecePositions[i].x_dir = rpt; + } + return; + } + SWD_3DPointPair lineRight = linePoint[lineRightIdx]; + //㹤λãϡϡ¡ĸǣߣ벿 + //е۶ԲֵͬĹòͬץȡ + double diameter = workpieceParam.radius * 2; + double lineTop_a, lineTop_b, lineTop_c; + compute2ptLine(lineTop.pt1, lineTop.pt2, &lineTop_a, &lineTop_b, &lineTop_c); + double lineBtm_a, lineBtm_b, lineBtm_c; + compute2ptLine(lineBtm.pt1, lineBtm.pt2, &lineBtm_a, &lineBtm_b, &lineBtm_c); + double lineLeft_a, lineLeft_b, lineLeft_c; + compute2ptLine(lineLeft.pt1, lineLeft.pt2, &lineLeft_a, &lineLeft_b, &lineLeft_c); + double lineRight_a, lineRight_b, lineRight_c; + compute2ptLine(lineRight.pt1, lineRight.pt2, &lineRight_a, &lineRight_b, &lineRight_c); + std::vector< WD_workpieceInfo> topSide; //ϱ + std::vector< WD_workpieceInfo> btmSide; //± + std::vector< WD_workpieceInfo> leftSide; // + std::vector< WD_workpieceInfo> rightSide; //ұ + std::vector< WD_workpieceInfo> LTCorner; //Ͻ + std::vector< WD_workpieceInfo> RTCorner; //Ͻ + std::vector< WD_workpieceInfo> LBCorner; // + std::vector< WD_workpieceInfo> RBCorner; //ұ + std::vector< WD_workpieceInfo> centerRegion; //ұ + for (int i = 0; i < (int)zSortWorkpiece.size(); i++) //ϲĿз + { + SVzNL3DPoint& objCenter = zSortWorkpiece[i].center; + double distTop = computePtDistToLine(objCenter.x, objCenter.y, lineTop_a, lineTop_b, lineTop_c); + double distBtm = computePtDistToLine(objCenter.x, objCenter.y, lineBtm_a, lineBtm_b, lineBtm_c); + double distLeft = computePtDistToLine(objCenter.x, objCenter.y, lineLeft_a, lineLeft_b, lineLeft_c); + double distRight = computePtDistToLine(objCenter.x, objCenter.y, lineRight_a, lineRight_b, lineRight_c); + + if (distTop < diameter) + { + if (distLeft < diameter) + { + zSortWorkpiece[i].workpieceType = 5; // + LTCorner.push_back(zSortWorkpiece[i]); + } + else if (distRight < diameter) + { + zSortWorkpiece[i].workpieceType = 6; // + RTCorner.push_back(zSortWorkpiece[i]); + } + else + { + zSortWorkpiece[i].workpieceType = 1; // + topSide.push_back(zSortWorkpiece[i]); + } + } + else if (distBtm < diameter) + { + if (distLeft < diameter) + { + zSortWorkpiece[i].workpieceType = 7; // + LBCorner.push_back(zSortWorkpiece[i]); + } + else if (distRight < diameter) + { + zSortWorkpiece[i].workpieceType = 8; // + RBCorner.push_back(zSortWorkpiece[i]); + } + else + { + zSortWorkpiece[i].workpieceType = 2; // + btmSide.push_back(zSortWorkpiece[i]); + } + } + else if (distLeft < diameter) + { + zSortWorkpiece[i].workpieceType = 3; // + leftSide.push_back(zSortWorkpiece[i]); + } + else if (distRight < diameter) + { + zSortWorkpiece[i].workpieceType = 4; // + rightSide.push_back(zSortWorkpiece[i]); + } + else + { + zSortWorkpiece[i].workpieceType = 0; // + centerRegion.push_back(zSortWorkpiece[i]); + } + } + //벿ֹ + if (centerRegion.size() > 0) + { + std::vector distanceIndice; + distanceIndice.resize(centerRegion.size()); + for (int m = 0; m < (int)centerRegion.size(); m++) + { + distanceIndice[m].dist = sqrt(pow(centerRegion[m].center.x - binInfo.center.x, 2) + + pow(centerRegion[m].center.y - binInfo.center.y, 2)); + distanceIndice[m].idx = m; + } + std::sort(distanceIndice.begin(), distanceIndice.end(), _compareByDistance); + for (int m = 0; m < (int)distanceIndice.size(); m++) + { + int idx = distanceIndice[m].idx; + workpiecePositions.push_back(centerRegion[idx]); + } + } + if(topSide.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), topSide.begin(), topSide.end()); + if (btmSide.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), btmSide.begin(), btmSide.end()); + if(leftSide.size() >0) + workpiecePositions.insert(workpiecePositions.end(), leftSide.begin(), leftSide.end()); + if (rightSide.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), rightSide.begin(), rightSide.end()); + if(LTCorner.size() >0) + workpiecePositions.insert(workpiecePositions.end(), LTCorner.begin(), LTCorner.end()); + if (RTCorner.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), RTCorner.begin(), RTCorner.end()); + if (LBCorner.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), LBCorner.begin(), LBCorner.end()); + if (RBCorner.size() > 0) + workpiecePositions.insert(workpiecePositions.end(), RBCorner.begin(), RBCorner.end()); + } + else + {//ˮƽ + while (zSortWorkpiece.size() > 0) + { + std::vector< WD_workpieceInfo> firstLine; + std::vector< WD_workpieceInfo> restWorkpiece; + _getYTopLine(zSortWorkpiece, firstLine, restWorkpiece, workpieceParam.radius); + workpiecePositions.insert(workpiecePositions.end(), firstLine.begin(), firstLine.end()); + zSortWorkpiece.clear(); + zSortWorkpiece.insert(zSortWorkpiece.end(), restWorkpiece.begin(), restWorkpiece.end()); + } } //תȥ diff --git a/sourceCode/hybridPosePositioning_Export.h b/sourceCode/hybridPosePositioning_Export.h index 58507c4..cd7c9d7 100644 --- a/sourceCode/hybridPosePositioning_Export.h +++ b/sourceCode/hybridPosePositioning_Export.h @@ -14,7 +14,7 @@ typedef struct typedef struct { - int workpieceType; + int workpieceType; //0:; 1-ϱ; 2-±; 3-; 4-ұ; 5-Ͻ; 6-Ͻ; 7-½; 8-½; SVzNL3DPoint center; SVzNL3DPoint z_dir; //zһ SVzNL3DPoint y_dir; //yһ @@ -60,6 +60,7 @@ SG_APISHARED_EXPORT void wd_lineDataR( SG_APISHARED_EXPORT void wd_HRM_RotorCorePositioning( std::vector< std::vector>& scanLinesInput, std::vector& objROIs, + const WD_HRM_BinInfo binInfo, const SSG_planeCalibPara groundCalibPara, const SWD_Cylinder workpieceParam, //Բιıư뾶͸߶ std::vector< WD_workpieceInfo>& workpiecePositions,