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,