hybridPosePositioning

version 1.3.4 : 修正了转子钢芯定位算法中的bug
This commit is contained in:
jerryzeng 2026-08-07 12:04:06 +08:00
parent 432c2a3289
commit ffd50bc6c5
2 changed files with 44 additions and 31 deletions

View File

@ -2087,7 +2087,7 @@ void HaiRuiMa_rotorCorePositioning_test(void)
};
SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = {
{1,9},
{1,10},
};
const char* ver = wd_hybridPositioningVersion();
@ -2130,7 +2130,10 @@ void HaiRuiMa_rotorCorePositioning_test(void)
sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx);
std::vector<WD_objArea2D> objROIs;
vzReadObj2DROI(_scan_file, objROIs);
if( (grp == 0) && (fidx <= 9))
vzReadObj2DROI(_scan_file, objROIs);
else
vzReadObj2DROI_1(_scan_file, objROIs);
SWD_Cylinder workpieceParam; //圆柱形工件的标称半径和高度
workpieceParam.radius = 45.0;
@ -2523,8 +2526,8 @@ typedef enum
int main()
{
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_地面调平;
ESG_testMode testMode = keSG_2D3D定位_海瑞马_锥形工件;
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_转子芯;
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_锥形工件;
ESG_testMode testMode = keSG_2D3D定位_海瑞马_转子芯;
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_码垛料筐定位;
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_码垛工件尺寸测量;
//ESG_testMode testMode = keSG_2D3D定位_海瑞马_码垛位置规划;

View File

@ -14,7 +14,8 @@
//version 1.3.1 : 添加了海瑞马转子钢芯定位位置属性计算,区分出中央,边和角的位置,按照中心排序,先输出最中央的目标
//version 1.3.2 : 添加了海瑞马锥形工件的ID号ID号为输入的ROI下标+1从1开始
//version 1.3.3 : 改进了海瑞马锥形工件定位算法优化的ROI重叠时的处理逻辑
std::string m_strVersion = "HybridPositioning 1.3.3";
//version 1.3.4 : 修正了转子钢芯定位算法中的bug
std::string m_strVersion = "HybridPositioning 1.3.4";
const char* wd_hybridPositioningVersion(void)
{
return m_strVersion.c_str();
@ -440,24 +441,27 @@ WD_workpieceInfo _computeWorkpiecePose(
exSegs.push_back(a_seg);
}
}
if (exSegs.size() == 0)
return a_pose;
//去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
int highestSeg = 0;
for (int m = 1; m < (int)exSegs.size(); m++)
{
if (exSegs[highestSeg].segMeanZ > exSegs[m].segMeanZ)
highestSeg = m;
}
double highestZ = exSegs[highestSeg].segMeanZ;
std::vector<SWD_indexingSeg> validExSegs;
for (int m = 0; m < (int)exSegs.size(); m++)
if (exSegs.size() > 0)
{
double zDiff = exSegs[m].segMeanZ - highestZ;
if (zDiff < workpieceParam.height / 2)
//去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
int highestSeg = 0;
for (int m = 1; m < (int)exSegs.size(); m++)
{
validExSegs.push_back(exSegs[m]);
if (exSegs[highestSeg].segMeanZ > exSegs[m].segMeanZ)
highestSeg = m;
}
double highestZ = exSegs[highestSeg].segMeanZ;
for (int m = 0; m < (int)exSegs.size(); m++)
{
double zDiff = exSegs[m].segMeanZ - highestZ;
if (zDiff < workpieceParam.height / 2)
{
validExSegs.push_back(exSegs[m]);
}
}
}
vScanLineSegs.push_back(validExSegs);
@ -541,22 +545,26 @@ WD_workpieceInfo _computeWorkpiecePose(
exSegs.push_back(a_seg);
}
}
//去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
int highestSeg = 0;
for (int m = 1; m < (int)exSegs.size(); m++)
{
if (exSegs[highestSeg].segMeanZ > exSegs[m].segMeanZ)
highestSeg = m;
}
double highestZ = exSegs[highestSeg].segMeanZ;
std::vector<SWD_indexingSeg> validExSegs;
for (int m = 0; m < (int)exSegs.size(); m++)
if (exSegs.size() > 0)
{
double zDiff = exSegs[m].segMeanZ - highestZ;
if (zDiff < workpieceParam.height / 2)
//去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
int highestSeg = 0;
for (int m = 1; m < (int)exSegs.size(); m++)
{
validExSegs.push_back(exSegs[m]);
if (exSegs[highestSeg].segMeanZ > exSegs[m].segMeanZ)
highestSeg = m;
}
double highestZ = exSegs[highestSeg].segMeanZ;
for (int m = 0; m < (int)exSegs.size(); m++)
{
double zDiff = exSegs[m].segMeanZ - highestZ;
if (zDiff < workpieceParam.height / 2)
{
validExSegs.push_back(exSegs[m]);
}
}
}
hScanLineSegs.push_back(validExSegs);
@ -1093,6 +1101,8 @@ void wd_HRM_RotorCorePositioning(
}
}
}
if (roiLineIndice.nMax < roiLineIndice.nMin)
continue;
//生成ROI中的扫描数据
SWDScanPosition centerPosition = { 0, 0 };