rodAndBarDetection version 1.2.11 : 根据现场数据调整特征生长参数

This commit is contained in:
jerryzeng 2026-05-15 00:18:31 +08:00
parent da5b2c90a2
commit 968fd0910c
3 changed files with 45 additions and 25 deletions

View File

@ -878,23 +878,28 @@ void _outputRGBDScan_RGBD_weldSeam(
sw.close();
}
#define SCREW_TEST_GROUP 3
#define SCREW_TEST_GROUP 7
void screwTest(void)
{
const char* dataPath[SCREW_TEST_GROUP] = {
"F:/ShangGu/项目/冠钦项目/螺杆测量/数据/模拟数据/", //0
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云2/上方两根/", //1
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云3/", //2
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置1/", //3
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2/", //4
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2未动螺杆拧进去100mm左右/", //5
"F:/ShangGu/项目/冠钦项目/螺杆测量/配天现场点云/螺杆点云4/位置2向前100mm螺杆拧进去100mm左右/", //6
};
SVzNLRange fileIdx[SCREW_TEST_GROUP] = {
{1,4},{1,30},{1,11}
{1,4},{1,30},{1,11},
{1,20}, {1,20}, {1,5}, {1,21}
};
const char* ver = wd_rodAndBarDetectionVersion();
printf("ver:%s\n", ver);
for (int grp = 2; grp < SCREW_TEST_GROUP; grp++)
for (int grp = 3; grp < SCREW_TEST_GROUP; grp++)
{
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
{
@ -924,7 +929,7 @@ void screwTest(void)
//double rodDiameter = 10.0;
SSG_cornerParam cornerParam;
cornerParam.cornerTh = 60; //45度角
cornerParam.cornerTh = 30; //45度角
cornerParam.scale = rodDiameter/4; // algoParam.bagParam.bagH / 8; // 15; // algoParam.bagParam.bagH / 8;
cornerParam.minEndingGap = 20; // algoParam.bagParam.bagW / 4;
cornerParam.minEndingGap_z = 5.0;
@ -936,12 +941,12 @@ void screwTest(void)
filterParam.outlierTh = 5;
SSG_treeGrowParam growParam;
growParam.maxLineSkipNum = 10;
growParam.yDeviation_max = 20.0;
growParam.maxSkipDistance = 20.0;
growParam.zDeviation_max = 50.0;//
growParam.minLTypeTreeLen = 10; //mm, 螺杆长度
growParam.minVTypeTreeLen = 10; //mm
growParam.maxLineSkipNum = 30;
growParam.yDeviation_max = 5.0;
growParam.maxSkipDistance = 30.0;
growParam.zDeviation_max = 50;//
growParam.minLTypeTreeLen = 50; //mm, 螺杆长度
growParam.minVTypeTreeLen = 50; //mm
bool isHorizonScan = true; //true:激光线平行槽道false:激光线垂直槽道
int errCode = 0;
@ -1025,21 +1030,22 @@ void locatingPlateTest(void)
}
}
#define ROD_POSITION_TEST_GROUP 1
#define ROD_POSITION_TEST_GROUP 2
void rodPositionTest(void)
{
const char* dataPath[ROD_POSITION_TEST_GROUP] = {
"F:/ShangGu/项目/冠钦项目/棒材抓取/", //0
"F:/ShangGu/项目/冠钦项目/矩森棒材抓取/", //0
"F:/ShangGu/项目/冠钦项目/胶布圆棒抓取/模拟测试数据/", //1
};
SVzNLRange fileIdx[ROD_POSITION_TEST_GROUP] = {
{1,8},
{1,8}, {1,5}
};
const char* ver = wd_rodAndBarDetectionVersion();
printf("ver:%s\n", ver);
for (int grp = 0; grp < ROD_POSITION_TEST_GROUP; grp++)
for (int grp = 1; grp < ROD_POSITION_TEST_GROUP; grp++)
{
SSG_planeCalibPara poseCalibPara;
//初始化成单位阵
@ -1063,6 +1069,9 @@ void rodPositionTest(void)
{
//fidx =1;
char _scan_file[256];
if(1 == grp)
sprintf_s(_scan_file, "%s%d_LaserData_Hi229156.txt", dataPath[grp], fidx);
else
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
std::vector<std::vector< SVzNL3DPosition>> scanLines;
@ -1075,8 +1084,16 @@ void rodPositionTest(void)
long t1 = (long)GetTickCount64();//统计时间
SSX_rodParam rodParam;
if (0 == grp)
{
rodParam.diameter = 52.0; //圆棒直径
rodParam.len = 290;
}
else
{
rodParam.diameter = 68.0; //圆棒直径
rodParam.len = 187;
}
SSG_cornerParam cornerParam;
cornerParam.cornerTh = 60; //45度角
@ -1231,7 +1248,7 @@ int main()
locatingPlateTest();
#endif
#else //棒材抓取定位测试
#if 0
#if 1
rodPositionTest();
#else
rodWeldSeamPosition_test();

View File

@ -4619,6 +4619,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod(
//逐个极小值点判断
int peakNum = (int)localZMin.size();
SSG_intPair prePos = { -1, -1, -1 };
for (int i = 0; i < peakNum; i++)
{
int pkIdx = localZMin[i].jumpPos2D.y;
@ -4628,7 +4629,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod(
ptDirAngles, lineData,
arcPerPointCornerMinValue, arcTotalCornerMinValue,
a_rodPos);
if (true == isArc)
if ( (true == isArc) && (prePos.idx != a_rodPos.idx))
{
SWD_rodArcFeature a_rodArc;
memset(&a_rodArc, 0, sizeof(SWD_rodArcFeature));
@ -4641,6 +4642,7 @@ void wd_getRodArcFeature_segmentPeakCornerMethod(
a_rodArc.peakPt = lineData[a_rodPos.idx].pt3D;
a_rodArc.featureValue = ptDirAngles[a_rodPos.idx].corner;
line_rodArcs.push_back(a_rodArc);
prePos = a_rodPos;
}
}
return;

View File

@ -19,7 +19,8 @@
//version 1.2.8 : 修正螺杆定位算法中的一个Bug
//version 1.2.9 : 修正螺杆定位算法中轴向拟合计算时方向确定的问题保证投影后的点云与投影前的点云的Z变化趋势一致
//version 1.2.10 : 改进螺杆定位取点算法
std::string m_strVersion = "1.2.10";
//version 1.2.11 : 根据现场数据调整特征生长参数
std::string m_strVersion = "1.2.11";
const char* wd_rodAndBarDetectionVersion(void)
{
return m_strVersion.c_str();
@ -242,7 +243,7 @@ void rodAarcFeatueDetection(
int linePtNum = (int)scanLines[0].size();
for (int line = 0; line < lineNum; line++)
{
if (line == 827)
if (line == 1304)
int kkk = 1;
std::vector<SVzNL3DPosition>& lineData = scanLines[line];
@ -632,8 +633,8 @@ SVzNL3DRangeD _getPointCloudROI(std::vector<SWD3DPointPostion>& scanData)
}
fitPoints.erase(fitPoints.begin(), fitPoints.begin() + eraseIdx);
fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + eraseIdx);
fitPoints.erase(fitPoints.end() - 5, fitPoints.end());
fit2DPos.erase(fit2DPos.end() - 5, fit2DPos.end());
fitPoints.erase(fitPoints.end() - 15, fitPoints.end());
fit2DPos.erase(fit2DPos.end() - 15, fit2DPos.end());
}
else
{
@ -655,8 +656,8 @@ SVzNL3DRangeD _getPointCloudROI(std::vector<SWD3DPointPostion>& scanData)
int eraseNum = (int)fitPoints.size() - eraseIdx;
fitPoints.erase(fitPoints.end() - eraseNum, fitPoints.end());
fit2DPos.erase(fit2DPos.end() - eraseNum, fit2DPos.end());
fitPoints.erase(fitPoints.begin(), fitPoints.begin() + 5);
fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + 5);
fitPoints.erase(fitPoints.begin(), fitPoints.begin() + 15);
fit2DPos.erase(fit2DPos.begin(), fit2DPos.begin() + 15);
}
//置标志
for (int j = 0; j < (int)fit2DPos.size(); j++)