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] = { SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = {
{1,9}, {1,10},
}; };
const char* ver = wd_hybridPositioningVersion(); 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); sprintf_s(_scan_file, "%s%d_result.txt", dataPath[grp], fidx);
std::vector<WD_objArea2D> objROIs; 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; //圆柱形工件的标称半径和高度 SWD_Cylinder workpieceParam; //圆柱形工件的标称半径和高度
workpieceParam.radius = 45.0; workpieceParam.radius = 45.0;
@ -2523,8 +2526,8 @@ typedef enum
int main() 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定位_海瑞马_码垛料筐定位;
//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.1 : 添加了海瑞马转子钢芯定位位置属性计算,区分出中央,边和角的位置,按照中心排序,先输出最中央的目标
//version 1.3.2 : 添加了海瑞马锥形工件的ID号ID号为输入的ROI下标+1从1开始 //version 1.3.2 : 添加了海瑞马锥形工件的ID号ID号为输入的ROI下标+1从1开始
//version 1.3.3 : 改进了海瑞马锥形工件定位算法优化的ROI重叠时的处理逻辑 //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) const char* wd_hybridPositioningVersion(void)
{ {
return m_strVersion.c_str(); return m_strVersion.c_str();
@ -440,24 +441,27 @@ WD_workpieceInfo _computeWorkpiecePose(
exSegs.push_back(a_seg); 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; std::vector<SWD_indexingSeg> validExSegs;
for (int m = 0; m < (int)exSegs.size(); m++) if (exSegs.size() > 0)
{ {
double zDiff = exSegs[m].segMeanZ - highestZ; //去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
if (zDiff < workpieceParam.height / 2) 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); vScanLineSegs.push_back(validExSegs);
@ -541,22 +545,26 @@ WD_workpieceInfo _computeWorkpiecePose(
exSegs.push_back(a_seg); 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; std::vector<SWD_indexingSeg> validExSegs;
for (int m = 0; m < (int)exSegs.size(); m++) if (exSegs.size() > 0)
{ {
double zDiff = exSegs[m].segMeanZ - highestZ; //去除低的段如果两个段的meanZ相差达到工件高度的一半视为低的段
if (zDiff < workpieceParam.height / 2) 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); hScanLineSegs.push_back(validExSegs);
@ -1093,6 +1101,8 @@ void wd_HRM_RotorCorePositioning(
} }
} }
} }
if (roiLineIndice.nMax < roiLineIndice.nMin)
continue;
//生成ROI中的扫描数据 //生成ROI中的扫描数据
SWDScanPosition centerPosition = { 0, 0 }; SWDScanPosition centerPosition = { 0, 0 };