diff --git a/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.h b/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.h index 53bec7ba..2289e8fd 100644 --- a/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.h +++ b/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.h @@ -4,7 +4,7 @@ // 版本字符串 #define STATORWORKPIECEPOSITION_APP_NAME "转子钢芯定位" #define STATORWORKPIECEPOSITION_APP_KEY "WorkpieceRotorApp" -#define STATORWORKPIECEPOSITION_VERSION_STRING "2.1.2" +#define STATORWORKPIECEPOSITION_VERSION_STRING "2.1.3" #define STATORWORKPIECEPOSITION_BUILD_STRING "1" #define STATORWORKPIECEPOSITION_FULL_VERSION_STRING "V" STATORWORKPIECEPOSITION_VERSION_STRING "_" STATORWORKPIECEPOSITION_BUILD_STRING diff --git a/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.md b/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.md index eaea8346..54c685f4 100644 --- a/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.md +++ b/App/StatorWorkpiecePosition/WorkpieceRotorApp/Version.md @@ -1,3 +1,8 @@ +# 2.1.3 +## build_1 20261030 +1. 更新算法解决漏检 +2. 更新定子模型 + # 2.1.2 ## build_1 20261030 1. 更新转子模型 diff --git a/AppAlgo/hybridPosePositioning/Arm/aarch64/libhybridPosePositioning.so b/AppAlgo/hybridPosePositioning/Arm/aarch64/libhybridPosePositioning.so index d3e3f8d1..7df3ed33 100644 Binary files a/AppAlgo/hybridPosePositioning/Arm/aarch64/libhybridPosePositioning.so and b/AppAlgo/hybridPosePositioning/Arm/aarch64/libhybridPosePositioning.so differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.dll b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.dll index 346abe61..dcc66edc 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.dll and b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.dll differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.pdb b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.pdb index 073b99ae..e6691887 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.pdb and b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/baseAlgorithm.pdb differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.dll b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.dll index 4ff86c66..6a77d14a 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.dll and b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.dll differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.pdb b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.pdb index 3c8d66c5..e3faec0d 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.pdb and b/AppAlgo/hybridPosePositioning/Windows/x64/Debug/hybridPosePositioning.pdb differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.dll b/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.dll index cb8a84fb..dec959a2 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.dll and b/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.dll differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.pdb b/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.pdb index 141a5025..9132bd39 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.pdb and b/AppAlgo/hybridPosePositioning/Windows/x64/Release/baseAlgorithm.pdb differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.dll b/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.dll index de1d831b..1536bac5 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.dll and b/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.dll differ diff --git a/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.pdb b/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.pdb index 92a08cce..0619f7ff 100644 Binary files a/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.pdb and b/AppAlgo/hybridPosePositioning/Windows/x64/Release/hybridPosePositioning.pdb differ diff --git a/AppAlgo/hybridPosePositioning/hybridPosePositioning_test.cpp b/AppAlgo/hybridPosePositioning/hybridPosePositioning_test.cpp index d2ec08eb..7a1b8425 100644 --- a/AppAlgo/hybridPosePositioning/hybridPosePositioning_test.cpp +++ b/AppAlgo/hybridPosePositioning/hybridPosePositioning_test.cpp @@ -1,10 +1,13 @@ #include #include +#include +#include +#include +#include #include #include #include #include "direct.h" -#include #include "hybridPosePositioning_Export.h" #include #include @@ -776,14 +779,20 @@ void _outputRGBDResult_XYZ_RGBD_workpieceInfo( objNumber = 1; int lineNum = (int)scanLines.size(); - std::ofstream sw(fileName); + std::ofstream sw(fileName, std::ios::out | std::ios::trunc); int realLines = (objNumber == 0) ? lineNum : (lineNum + 1); - sw << "LineNum:" << realLines << std::endl; - sw << "DataType: 0" << std::endl; - sw << "ScanSpeed: 0" << std::endl; - sw << "PointAdjust: 1" << std::endl; - sw << "MaxTimeStamp: 0_0" << std::endl; - + sw << "LineNum:" << realLines << '\n'; + sw << "DataType: 0" << '\n'; + sw << "ScanSpeed: 0" << '\n'; + sw << "PointAdjust: 1" << '\n'; + sw << "MaxTimeStamp: 0_0" << '\n'; + if (!sw) { + std::cerr << "Write failed: line = MaxTimeStamp" + << ", rdstate = " << sw.rdstate() + << ", bad = " << sw.bad() + << ", fail = " << sw.fail() + << '\n'; + } int maxLineIndex = 0; int max_stamp = 0; SG_color rgb = { 0, 0, 0 }; @@ -855,9 +864,46 @@ void _outputRGBDResult_XYZ_RGBD_workpieceInfo( float x = (float)pt3D->pt3D.x; float y = (float)pt3D->pt3D.y; float z = (float)pt3D->pt3D.z; + + errno = 0; + // RGB 显式转为整数,避免 unsigned char 被按字符输出。 sw << "{" << x << "," << y << "," << z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << rgb.r << "," << rgb.g << "," << rgb.b << "," << size << " }" << std::endl; + sw << "{" + << static_cast(rgb.r) << "," + << static_cast(rgb.g) << "," + << static_cast(rgb.b) << "," + << size << " }" << '\n'; + + // 临时诊断:每个点写完都刷新,检查实际写出是否成功。 + // 定位完成后移除,避免影响保存速度。 + const char* stage = "write"; + if (sw) { + stage = "flush"; + sw.flush(); + } + + // 在其他日志操作之前保存 errno。 + const int savedErrno = errno; + + if (!sw) { + std::cerr + << "Write failed: stage = " << stage + << ", line = " << line + << ", i = " << i + << ", lineIdx = " << lineIdx + << ", rdstate = " << sw.rdstate() + << ", bad = " << sw.bad() + << ", fail = " << sw.fail() + << ", errno = " << savedErrno + << ", error = " + << (savedErrno ? std::strerror(savedErrno) + : "No errno information") + << '\n'; + + // 停止整个保存过程,不能只退出内层循环。 + throw std::runtime_error("Point-cloud file write failed"); + } } } @@ -896,13 +942,13 @@ void _outputRGBDResult_XYZ_RGBD_workpieceInfo( poseInfo[m].center.y - poseInfo[m].z_dir.y * dirLen, poseInfo[m].center.z - poseInfo[m].z_dir.z * dirLen }; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; } else @@ -914,39 +960,39 @@ void _outputRGBDResult_XYZ_RGBD_workpieceInfo( poseInfo[m].center.y - poseInfo[m].z_dir.y * dirLen, poseInfo[m].center.z - poseInfo[m].z_dir.z * dirLen }; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; double sapcerDirLen = 200; dirPt1 = { poseInfo[m].center.x + poseInfo[m].x_dir.x * sapcerDirLen, poseInfo[m].center.y + poseInfo[m].x_dir.y * sapcerDirLen, poseInfo[m].center.z + poseInfo[m].x_dir.z * sapcerDirLen }; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << poseInfo[m].center.x << "," << poseInfo[m].center.y << "," << poseInfo[m].center.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; dirPt2 = { poseInfo[m].center.x + poseInfo[m].y_dir.x * sapcerDirLen, poseInfo[m].center.y + poseInfo[m].y_dir.y * sapcerDirLen, poseInfo[m].center.z + poseInfo[m].y_dir.z * sapcerDirLen }; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << poseInfo[m].center.x << "," << poseInfo[m].center.y << "," << poseInfo[m].center.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; } } @@ -957,51 +1003,56 @@ void _outputRGBDResult_XYZ_RGBD_workpieceInfo( //输出外接矩形 SVzNL3DPoint dirPt1 = binInfo->minRectVertex[0]; SVzNL3DPoint dirPt2 = binInfo->minRectVertex[1]; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; dirPt1 = binInfo->minRectVertex[1]; dirPt2 = binInfo->minRectVertex[2]; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; dirPt1 = binInfo->minRectVertex[2]; dirPt2 = binInfo->minRectVertex[3]; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; dirPt1 = binInfo->minRectVertex[3]; dirPt2 = binInfo->minRectVertex[0]; - sw << "Poly_" << lineIdx << "_2" << std::endl; + sw << "Poly_" << lineIdx << "_2" << '\n'; sw << "{" << dirPt1.x << "," << dirPt1.y << "," << dirPt1.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; sw << "{" << dirPt2.x << "," << dirPt2.y << "," << dirPt2.z << "}-"; sw << "{0,0}-{0,0}-"; - sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << std::endl; + sw << "{" << (int)rgb.r << "," << (int)rgb.g << "," << (int)rgb.b << "," << size << "}" << '\n'; lineIdx++; } } sw.close(); + + if (sw.fail()) { + std::cerr << "Failed to close output file: " + << fileName << std::endl; + } } void _outputRGBDResult_XYZ_RGBD_planningResult( @@ -2466,8 +2517,50 @@ void HaiRuiMa_groundCalib_test(void) } +// directory:由 const char* 给出的测试目录 +namespace fs = std::filesystem; +bool ends_with(const std::string& str, const std::string& suffix) +{ + return str.size() >= suffix.size() && + str.compare(str.size() - suffix.size(), + suffix.size(), suffix) == 0; +} +void test_directory(const char* directory, std::vector& files) +{ + if (directory == nullptr) + return; + + try { + // 先收集文件,避免测试过程中生成结果文件影响目录遍历 + for (const auto& entry : fs::directory_iterator(directory)) { + if (!entry.is_regular_file()) + continue; + + const fs::path& path = entry.path(); + const std::string filename = path.filename().string(); + + if (path.extension() != ".txt") + continue; + + if (ends_with(filename, "_result.txt")) + continue; + if (ends_with(filename, "_info.txt")) + continue; + + files.push_back(path); + } + } + catch (const fs::filesystem_error& e) { + std::cerr << "Directory error: " << e.what() << '\n'; + return; + } + + // 固定测试顺序,不需要排序时可删除 + std::sort(files.begin(), files.end()); +} + //拓普发工件孔定位(工件定位) -#define HRM_RotorCore_TEST_GROUP 9 +#define HRM_RotorCore_TEST_GROUP 19 void HaiRuiMa_rotorCorePositioning_test(void) { const char* dataPath[HRM_RotorCore_TEST_GROUP] = { @@ -2475,22 +2568,35 @@ void HaiRuiMa_rotorCorePositioning_test(void) "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/数据2D3D/", //0 "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/WorkpieceRotor/", //1 "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/现场数据/", //2 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/2026-09-海瑞马/09-14/", //3 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/2026-09-海瑞马/09-14中/", //4 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/2026-09-海瑞马/异常数据/", //5 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/2026-09-海瑞马/10-09小/", //6 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/更换5mm镜头相机/", //7 - "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子钢芯/1019定子数据/", //8 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/09-14/", //3 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/09-14中/", //4 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/异常数据_1/", //5 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/10-09小/", //6 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/更换5mm镜头相机/", //7 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/10.21数据/1-24中型/", //8 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/10.21数据/25-63小型/", //9 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/10.21数据/64-87大型/", //10 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/20261023数据/", //11 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/20261024数据/", //12 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/异常数据/", //13 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/2楼转子异常数据/", //14 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/20261028数据/", //15 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/定子数据/20261029数据/", //16 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/20261028数据/", //17 + "F:/ShangGu/项目/冠钦项目/宁波海瑞马/转子定子抓取/转子数据/20261029数据/", //18 }; SVzNLRange fileIdx[HRM_RotorCore_TEST_GROUP] = { - {1,10}, {3,70},{9,9}, {1,54}, {1,54}, {1,6}, {1,8}, {1, 16},{4,78}, + {1,10}, {3,70},{9,9}, {1,54}, {1,54}, + {7,9}, {1,8}, {1, 16},{1,24}, {25,63}, + {64,87},{1,80}, {1,178}, {1, 39}, {1,38}, + {-1,-1}, {-1,-1}, {-1,-1}, {-1,-1} }; const char* ver = wd_hybridPositioningVersion(); printf("ver:%s\n", ver); - for (int grp = 4; grp <= 8; grp++) + for (int grp = 16; grp <= 18; grp++) { SSG_planeCalibPara groundCalibPara; //初始化成单位阵 @@ -2510,11 +2616,33 @@ void HaiRuiMa_rotorCorePositioning_test(void) sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]); groundCalibPara = _readCalibPara(calibFile); - for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) + int fstart = fileIdx[grp].nMin; + int fend = fileIdx[grp].nMax; + std::vector files; + if (fstart < 0) + { + test_directory(dataPath[grp], files); + if (files.size() == 0) + continue; + fstart = 0; + fend = (int)files.size() - 1; + } + for (int fidx = 98; fidx <= fend; fidx++) { //fidx = 50; char _scan_file[256]; - sprintf_s(_scan_file, "%s%d_cloud.txt", dataPath[grp], fidx); + if (fileIdx[grp].nMin >= 0) + { + if ((grp >= 12) && (grp <= 14)) + sprintf_s(_scan_file, "%s%d.txt", dataPath[grp], fidx); + else + sprintf_s(_scan_file, "%s%d_cloud.txt", dataPath[grp], fidx); + } + else + { + sprintf_s(_scan_file, "%s", files[fidx].string().c_str()); + + } std::vector> scanLines; vzReadLaserScanPointFromFile_XYZUV_vector(_scan_file, scanLines); _removeZeroLines_XYZUV(scanLines); @@ -2522,7 +2650,7 @@ void HaiRuiMa_rotorCorePositioning_test(void) continue; #if 0 - SVzNLRangeD yRange = { -400, 300 }; + SVzNLRangeD yRange = { -400, 400 }; _yRangeFilter_XYZUV(scanLines, yRange); int headNullLines = 0; sprintf_s(_scan_file, "%s%d_cloud.txt", dataPath[grp], fidx); @@ -2566,7 +2694,23 @@ void HaiRuiMa_rotorCorePositioning_test(void) std::vector objROIs; vzReadObj2DROI(_scan_file, objROIs); #else //使用掩膜 - sprintf_s(_scan_file, "%s%d_mask.bmp", dataPath[grp], fidx); + if (fileIdx[grp].nMin >= 0) + { + if (grp == 11) //20261023数据 + sprintf_s(_scan_file, "%s%d_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else if ((grp == 12) || (grp == 14)) ////20261024数据 + sprintf_s(_scan_file, "%s%d_input_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else if (grp == 13) + sprintf_s(_scan_file, "%s%d_reinspection_2d_mask.bmp", dataPath[grp], fidx); + else + sprintf_s(_scan_file, "%s%d_mask.bmp", dataPath[grp], fidx); + } + else + { + const std::string file_prefix = files[fidx].stem().string(); + const fs::path maskFile_path = files[fidx].parent_path() / (file_prefix + "_2d_mask.bmp"); + sprintf_s(_scan_file, "%s", maskFile_path.string().c_str()); + } // // 读取 BMP 文件(彩色,默认) cv::Mat img = cv::imread(_scan_file, cv::IMREAD_COLOR); @@ -2623,6 +2767,11 @@ void HaiRuiMa_rotorCorePositioning_test(void) workpieceParam.height = 20.0; } #endif + EWD_WorkpieceClass workpieceClass = keWD_Class_Stator; + if ((grp >= 8) && (grp <= 10)) + workpieceClass = keWD_Class_Rotor; + else if( (grp == 14) || (grp == 17) || (grp == 18)) + workpieceClass = keWD_Class_Rotor; SVzNLSizeD spacerParam; //隔板参数:长和宽 spacerParam.dWidth = 720.0; @@ -2641,7 +2790,7 @@ void HaiRuiMa_rotorCorePositioning_test(void) wd_HRM_RotorCorePositioning( scanLines, objDataMask, - keWD_Class_Rotor, + workpieceClass, groundCalibPara, spacerParam, workpieceParam, @@ -2672,7 +2821,14 @@ void HaiRuiMa_rotorCorePositioning_test(void) printf("%s: %d(ms), errCode=%d 结果: %d...", _scan_file, (int)(t2 - t1), errCode, num); } //输出测试结果 - sprintf_s(calibFile, "%sresult/LaserLine%d_workpiece_info.txt", dataPath[grp], fidx); + if (fileIdx[grp].nMin >= 0) + sprintf_s(calibFile, "%sresult/LaserLine%d_workpiece_info.txt", dataPath[grp], fidx); + else + { + const std::string file_prefix = files[fidx].stem().string(); + const fs::path rsltFile_path = files[fidx].parent_path() / ("result/" + file_prefix + "_workpiece_info.txt"); + sprintf_s(calibFile, "%s", rsltFile_path.string().c_str()); + } _outputWorkpieceInfo(calibFile, workpiecePositions); //旋转到调平坐标系 int workpieceNum = (int)workpiecePositions.size(); @@ -2688,10 +2844,22 @@ void HaiRuiMa_rotorCorePositioning_test(void) rpt = wd_ptRotate(workpiecePositions[i].x_dir, groundCalibPara.planeCalib); workpiecePositions[i].x_dir = rpt; } - sprintf_s(_scan_file, "%sresult/result_%d.txt", dataPath[grp], fidx); + if (fileIdx[grp].nMin >= 0) + { + sprintf_s(_scan_file, "%sresult/result_%d.txt", dataPath[grp], fidx); + sprintf_s(calibFile, "%sresult/result_%d_projection.png", dataPath[grp], fidx); + } + else + { + const std::string file_prefix = files[fidx].stem().string(); + const fs::path rsltFile_path_1 = files[fidx].parent_path() / ("result/" + file_prefix + "_result.txt"); + sprintf_s(_scan_file, "%s", rsltFile_path_1.string().c_str()); + const fs::path rsltFile_path_2 = files[fidx].parent_path() / ("result/" + file_prefix + "_projection.png"); + sprintf_s(calibFile, "%s", rsltFile_path_2.string().c_str()); + } + _outputRGBDResult_XYZ_RGBD_workpieceInfo(_scan_file, debugScanLines, workpiecePositions, &binInfo, 50); #if 1 - sprintf_s(calibFile, "%sresult/result_%d_projection.png", dataPath[grp], fidx); double rpy[3] = { 0, 0, 0 }; //{ 0,-45, 0 }; // double angleDrawLen = 15; double displayScale = 0.3; diff --git a/AppModel/WorkpieceStatorModel/Arm/model.rknn b/AppModel/WorkpieceStatorModel/Arm/model.rknn index c2025ebb..946c42f0 100644 Binary files a/AppModel/WorkpieceStatorModel/Arm/model.rknn and b/AppModel/WorkpieceStatorModel/Arm/model.rknn differ diff --git a/AppModel/WorkpieceStatorModel/Windows/model.onnx b/AppModel/WorkpieceStatorModel/Windows/model.onnx index 9de3c1fd..c381dde7 100644 Binary files a/AppModel/WorkpieceStatorModel/Windows/model.onnx and b/AppModel/WorkpieceStatorModel/Windows/model.onnx differ