diff --git a/HC_planeLocalization_test/HC_planeLocalization_test.cpp b/HC_planeLocalization_test/HC_planeLocalization_test.cpp index b488fbf..7cc40fb 100644 --- a/HC_planeLocalization_test/HC_planeLocalization_test.cpp +++ b/HC_planeLocalization_test/HC_planeLocalization_test.cpp @@ -543,22 +543,24 @@ SSX_planeParkingParam _readParkingPara(char* fileName) #define TEST_COMPUTE_GROUND_PARA 0 #define TEST_COMPUTE_POSITION 1 -#define TEST_GROUP 1 +#define TEST_GROUP 3 int main() { const char* dataPath[TEST_GROUP] = { "F:/ShangGu/项目/水木宏创/停机位停靠引导/数据/20260613_144419-波音737/", //0 + "F:/ShangGu/项目/水木宏创/停机位停靠引导/中心线锥桶数据/", //1 + "F:/ShangGu/项目/水木宏创/停机位停靠引导/数据/现场数据/0729夜晚雷达采集数据/", //2 }; SVzNLRange fileIdx[TEST_GROUP] = { - {1,43}, + {1,43}, {1,10}, {1, 145} }; const char* ver = wd_PlaneLocalizationVersion(); printf("ver:%s\n", ver); #if TEST_COMPUTE_GROUND_PARA - int cvtGrp = 0; + int cvtGrp = 2; char _calib_datafile[256]; sprintf_s(_calib_datafile, "%sLaserData_1.txt", dataPath[cvtGrp]); std::vector> scanData; @@ -608,7 +610,7 @@ int main() #endif #if TEST_COMPUTE_POSITION - for (int grp = 0; grp < TEST_GROUP; grp++) + for (int grp = 2; grp < TEST_GROUP; grp++) { SSG_planeCalibPara groundCalibPara; //初始化成单位阵 @@ -633,7 +635,7 @@ int main() for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) { - //fidx =31; + //fidx =32; char _scan_file[256]; sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx); @@ -648,9 +650,9 @@ int main() SSG_treeGrowParam growParam; growParam.maxLineSkipNum = 10; - growParam.yDeviation_max = 300.0; - growParam.maxSkipDistance = 300.0; - growParam.zDeviation_max = 300.0;// + growParam.yDeviation_max = 2000.0;// 300.0; + growParam.maxSkipDistance = 2000.0; // 300.0; + growParam.zDeviation_max = 2000.0; // 300.0;// growParam.minLTypeTreeLen = 500; //mm growParam.minVTypeTreeLen = 500; //mm diff --git a/sourceCode/planeLocalization.cpp b/sourceCode/planeLocalization.cpp index a4eea26..54cd8df 100644 --- a/sourceCode/planeLocalization.cpp +++ b/sourceCode/planeLocalization.cpp @@ -9,7 +9,8 @@ //version 1.1.0 : Ż˻ǵȡûзɻ //version 1.2.0 : ˻عзֵ //version 1.3.0 : ȡһBug -std::string m_strVersion = " PlaneLocalization 1.3.0"; +//version 1.3.1 : Ľȡ㷨 +std::string m_strVersion = " PlaneLocalization 1.3.1"; const char* wd_PlaneLocalizationVersion(void) { return m_strVersion.c_str(); @@ -432,22 +433,26 @@ SSX_planeInfo wd_planeLocalization( for (int m = 0; m < (int)allClusters.size(); m++) { SVzNL3DRangeD& a_roi = allClusterROIs[m]; - if ((a_roi.zRange.min - rotateParkingPoint.z) < nearFarTh) + double height = groundCalibParam.planeHeight - a_roi.yRange.min; + if (height >= 2000.00) //2׸߶ޣ һ { - if ((a_roi.xRange.min >= ROI_x_near.min) && (a_roi.xRange.max <= ROI_x_near.max) && - (a_roi.zRange.min >= ROI_z.min) && (a_roi.zRange.max <= ROI_z.max)) + if ((a_roi.zRange.min - rotateParkingPoint.z) < nearFarTh) { - objClusters.push_back(allClusters[m]); - objClustersROIs.push_back(a_roi); + if ((a_roi.xRange.min >= ROI_x_near.min) && (a_roi.xRange.max <= ROI_x_near.max) && + (a_roi.zRange.min >= ROI_z.min) && (a_roi.zRange.max <= ROI_z.max)) + { + objClusters.push_back(allClusters[m]); + objClustersROIs.push_back(a_roi); + } } - } - else - { - if ((a_roi.xRange.min >= ROI_x_far.min) && (a_roi.xRange.max <= ROI_x_far.max) && - (a_roi.zRange.min >= ROI_z.min) && (a_roi.zRange.max <= ROI_z.max)) + else { - objClusters.push_back(allClusters[m]); - objClustersROIs.push_back(a_roi); + if ((a_roi.xRange.min >= ROI_x_far.min) && (a_roi.xRange.max <= ROI_x_far.max) && + (a_roi.zRange.min >= ROI_z.min) && (a_roi.zRange.max <= ROI_z.max)) + { + objClusters.push_back(allClusters[m]); + objClustersROIs.push_back(a_roi); + } } } } @@ -766,18 +771,66 @@ SSX_planeInfo wd_planeLocalization( } //ȡҵ㼯͵㣬ΪҷIJο - SVzNL3DPosition leftEnginePoint = distanceValidData[leftEngineIdx][0]; + + + SVzNL3DPosition leftNearestPoint = distanceValidData[leftEngineIdx][0]; for (int i = 1; i < (int)distanceValidData[leftEngineIdx].size(); i++) { - if (leftEnginePoint.pt3D.y < distanceValidData[leftEngineIdx][i].pt3D.y) - leftEnginePoint = distanceValidData[leftEngineIdx][i]; + if (leftNearestPoint.pt3D.z > distanceValidData[leftEngineIdx][i].pt3D.z) + leftNearestPoint = distanceValidData[leftEngineIdx][i]; } - SVzNL3DPosition rightEnginePoint = distanceValidData[rightEngineIdx][0]; + std::vector leftEengineData; + + for (int i = 0; i < (int)distanceValidData[leftEngineIdx].size(); i++) + { + double zDiff = distanceValidData[leftEngineIdx][i].pt3D.z - leftNearestPoint.pt3D.z; + if (zDiff < 500.0) //0.5׷Χ + leftEengineData.push_back(distanceValidData[leftEngineIdx][i]); + } + SVzNL3DPosition leftEnginePoint = leftEengineData[0]; + SVzNL3DPosition leftCentroid = { 0, {0, 0, 0} }; + for (int i = 1; i < (int)leftEengineData.size(); i++) + { + if (leftEnginePoint.pt3D.y < leftEengineData[i].pt3D.y) + leftEnginePoint = leftEengineData[i]; + leftCentroid.pt3D.x += leftEengineData[i].pt3D.x; + leftCentroid.pt3D.y += leftEengineData[i].pt3D.y; + leftCentroid.pt3D.z += leftEengineData[i].pt3D.z; + } + int leftEngineDataSize = (int)leftEengineData.size(); + leftCentroid.pt3D.x = leftCentroid.pt3D.x / leftEngineDataSize; + leftCentroid.pt3D.y = leftCentroid.pt3D.y / leftEngineDataSize; + leftCentroid.pt3D.z = leftCentroid.pt3D.z / leftEngineDataSize; + + SVzNL3DPosition rightNearestPoint = distanceValidData[rightEngineIdx][0]; for (int i = 1; i < (int)distanceValidData[rightEngineIdx].size(); i++) { - if (rightEnginePoint.pt3D.y < distanceValidData[rightEngineIdx][i].pt3D.y) - rightEnginePoint = distanceValidData[rightEngineIdx][i]; + if (rightNearestPoint.pt3D.z > distanceValidData[rightEngineIdx][i].pt3D.z) + rightNearestPoint = distanceValidData[rightEngineIdx][i]; } + std::vector rightEngineData; + for (int i = 0; i < (int)distanceValidData[rightEngineIdx].size(); i++) + { + double zDiff = distanceValidData[rightEngineIdx][i].pt3D.z - rightNearestPoint.pt3D.z; + if (zDiff < 500.0) //0.5׷Χ + rightEngineData.push_back(distanceValidData[rightEngineIdx][i]); + } + + SVzNL3DPosition rightEnginePoint = rightEngineData[0]; + SVzNL3DPosition rightCentroid = { 0, {0, 0, 0} }; + for (int i = 1; i < (int)rightEngineData.size(); i++) + { + if (rightEnginePoint.pt3D.y < rightEngineData[i].pt3D.y) + rightEnginePoint = rightEngineData[i]; + + rightCentroid.pt3D.x += rightEngineData[i].pt3D.x; + rightCentroid.pt3D.y += rightEngineData[i].pt3D.y; + rightCentroid.pt3D.z += rightEngineData[i].pt3D.z; + } + int rightEngineDataSize = (int)rightEngineData.size(); + rightCentroid.pt3D.x = rightCentroid.pt3D.x / rightEngineDataSize; + rightCentroid.pt3D.y = rightCentroid.pt3D.y / rightEngineDataSize; + rightCentroid.pt3D.z = rightCentroid.pt3D.z / rightEngineDataSize; #if _OUTPUT_DEBUG_DATA { int nose_lineIdx = nosePoint.nPointIdx >> 16; @@ -794,6 +847,9 @@ SSX_planeInfo wd_planeLocalization( debugData[nose_lineIdx][nose_ptIdx].nPointIdx |= 0x40000; //ǵ } #endif + leftEnginePoint.pt3D = leftCentroid.pt3D; + rightEnginePoint.pt3D = rightCentroid.pt3D; + //̬ //axisҷֱ, (-y,, x)ʽ SVzNL2DPointD axis = { -(rightEnginePoint.pt3D.z - leftEnginePoint.pt3D.z), rightEnginePoint.pt3D.x - leftEnginePoint.pt3D.x };