planeLocalization
version 1.3.1 : 改进了取发动机点特征点算法
This commit is contained in:
parent
7342a322d9
commit
6e9cdf27c4
@ -543,22 +543,24 @@ SSX_planeParkingParam _readParkingPara(char* fileName)
|
|||||||
|
|
||||||
#define TEST_COMPUTE_GROUND_PARA 0
|
#define TEST_COMPUTE_GROUND_PARA 0
|
||||||
#define TEST_COMPUTE_POSITION 1
|
#define TEST_COMPUTE_POSITION 1
|
||||||
#define TEST_GROUP 1
|
#define TEST_GROUP 3
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
const char* dataPath[TEST_GROUP] = {
|
const char* dataPath[TEST_GROUP] = {
|
||||||
"F:/ShangGu/项目/水木宏创/停机位停靠引导/数据/20260613_144419-波音737/", //0
|
"F:/ShangGu/项目/水木宏创/停机位停靠引导/数据/20260613_144419-波音737/", //0
|
||||||
|
"F:/ShangGu/项目/水木宏创/停机位停靠引导/中心线锥桶数据/", //1
|
||||||
|
"F:/ShangGu/项目/水木宏创/停机位停靠引导/数据/现场数据/0729夜晚雷达采集数据/", //2
|
||||||
};
|
};
|
||||||
|
|
||||||
SVzNLRange fileIdx[TEST_GROUP] = {
|
SVzNLRange fileIdx[TEST_GROUP] = {
|
||||||
{1,43},
|
{1,43}, {1,10}, {1, 145}
|
||||||
};
|
};
|
||||||
|
|
||||||
const char* ver = wd_PlaneLocalizationVersion();
|
const char* ver = wd_PlaneLocalizationVersion();
|
||||||
printf("ver:%s\n", ver);
|
printf("ver:%s\n", ver);
|
||||||
|
|
||||||
#if TEST_COMPUTE_GROUND_PARA
|
#if TEST_COMPUTE_GROUND_PARA
|
||||||
int cvtGrp = 0;
|
int cvtGrp = 2;
|
||||||
char _calib_datafile[256];
|
char _calib_datafile[256];
|
||||||
sprintf_s(_calib_datafile, "%sLaserData_1.txt", dataPath[cvtGrp]);
|
sprintf_s(_calib_datafile, "%sLaserData_1.txt", dataPath[cvtGrp]);
|
||||||
std::vector<std::vector< SVzNL3DPosition>> scanData;
|
std::vector<std::vector< SVzNL3DPosition>> scanData;
|
||||||
@ -608,7 +610,7 @@ int main()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TEST_COMPUTE_POSITION
|
#if TEST_COMPUTE_POSITION
|
||||||
for (int grp = 0; grp < TEST_GROUP; grp++)
|
for (int grp = 2; grp < TEST_GROUP; grp++)
|
||||||
{
|
{
|
||||||
SSG_planeCalibPara groundCalibPara;
|
SSG_planeCalibPara groundCalibPara;
|
||||||
//初始化成单位阵
|
//初始化成单位阵
|
||||||
@ -633,7 +635,7 @@ int main()
|
|||||||
|
|
||||||
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++)
|
||||||
{
|
{
|
||||||
//fidx =31;
|
//fidx =32;
|
||||||
char _scan_file[256];
|
char _scan_file[256];
|
||||||
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
|
sprintf_s(_scan_file, "%sLaserData_%d.txt", dataPath[grp], fidx);
|
||||||
|
|
||||||
@ -648,9 +650,9 @@ int main()
|
|||||||
|
|
||||||
SSG_treeGrowParam growParam;
|
SSG_treeGrowParam growParam;
|
||||||
growParam.maxLineSkipNum = 10;
|
growParam.maxLineSkipNum = 10;
|
||||||
growParam.yDeviation_max = 300.0;
|
growParam.yDeviation_max = 2000.0;// 300.0;
|
||||||
growParam.maxSkipDistance = 300.0;
|
growParam.maxSkipDistance = 2000.0; // 300.0;
|
||||||
growParam.zDeviation_max = 300.0;//
|
growParam.zDeviation_max = 2000.0; // 300.0;//
|
||||||
growParam.minLTypeTreeLen = 500; //mm
|
growParam.minLTypeTreeLen = 500; //mm
|
||||||
growParam.minVTypeTreeLen = 500; //mm
|
growParam.minVTypeTreeLen = 500; //mm
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,8 @@
|
|||||||
//version 1.1.0 : 优化了机鼻点提取(迭代),增加了没有飞机的输出
|
//version 1.1.0 : 优化了机鼻点提取(迭代),增加了没有飞机的输出
|
||||||
//version 1.2.0 : 修正了回归测试中发现的问题
|
//version 1.2.0 : 修正了回归测试中发现的问题
|
||||||
//version 1.3.0 : 修正了取发动机点特征点的一个Bug
|
//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)
|
const char* wd_PlaneLocalizationVersion(void)
|
||||||
{
|
{
|
||||||
return m_strVersion.c_str();
|
return m_strVersion.c_str();
|
||||||
@ -432,6 +433,9 @@ SSX_planeInfo wd_planeLocalization(
|
|||||||
for (int m = 0; m < (int)allClusters.size(); m++)
|
for (int m = 0; m < (int)allClusters.size(); m++)
|
||||||
{
|
{
|
||||||
SVzNL3DRangeD& a_roi = allClusterROIs[m];
|
SVzNL3DRangeD& a_roi = allClusterROIs[m];
|
||||||
|
double height = groundCalibParam.planeHeight - a_roi.yRange.min;
|
||||||
|
if (height >= 2000.00) //2米高度门限, 跳过一般人身高
|
||||||
|
{
|
||||||
if ((a_roi.zRange.min - rotateParkingPoint.z) < nearFarTh)
|
if ((a_roi.zRange.min - rotateParkingPoint.z) < nearFarTh)
|
||||||
{
|
{
|
||||||
if ((a_roi.xRange.min >= ROI_x_near.min) && (a_roi.xRange.max <= ROI_x_near.max) &&
|
if ((a_roi.xRange.min >= ROI_x_near.min) && (a_roi.xRange.max <= ROI_x_near.max) &&
|
||||||
@ -451,6 +455,7 @@ SSX_planeInfo wd_planeLocalization(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
//分析聚类之间的关系
|
//分析聚类之间的关系
|
||||||
//建立聚类Mask
|
//建立聚类Mask
|
||||||
@ -766,18 +771,66 @@ SSX_planeInfo wd_planeLocalization(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//取左右点集的最低点,作为左右发动机的参考点
|
//取左右点集的最低点,作为左右发动机的参考点
|
||||||
SVzNL3DPosition leftEnginePoint = distanceValidData[leftEngineIdx][0];
|
|
||||||
|
|
||||||
|
SVzNL3DPosition leftNearestPoint = distanceValidData[leftEngineIdx][0];
|
||||||
for (int i = 1; i < (int)distanceValidData[leftEngineIdx].size(); i++)
|
for (int i = 1; i < (int)distanceValidData[leftEngineIdx].size(); i++)
|
||||||
{
|
{
|
||||||
if (leftEnginePoint.pt3D.y < distanceValidData[leftEngineIdx][i].pt3D.y)
|
if (leftNearestPoint.pt3D.z > distanceValidData[leftEngineIdx][i].pt3D.z)
|
||||||
leftEnginePoint = distanceValidData[leftEngineIdx][i];
|
leftNearestPoint = distanceValidData[leftEngineIdx][i];
|
||||||
}
|
}
|
||||||
SVzNL3DPosition rightEnginePoint = distanceValidData[rightEngineIdx][0];
|
std::vector<SVzNL3DPosition> 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++)
|
for (int i = 1; i < (int)distanceValidData[rightEngineIdx].size(); i++)
|
||||||
{
|
{
|
||||||
if (rightEnginePoint.pt3D.y < distanceValidData[rightEngineIdx][i].pt3D.y)
|
if (rightNearestPoint.pt3D.z > distanceValidData[rightEngineIdx][i].pt3D.z)
|
||||||
rightEnginePoint = distanceValidData[rightEngineIdx][i];
|
rightNearestPoint = distanceValidData[rightEngineIdx][i];
|
||||||
}
|
}
|
||||||
|
std::vector<SVzNL3DPosition> 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
|
#if _OUTPUT_DEBUG_DATA
|
||||||
{
|
{
|
||||||
int nose_lineIdx = nosePoint.nPointIdx >> 16;
|
int nose_lineIdx = nosePoint.nPointIdx >> 16;
|
||||||
@ -794,6 +847,9 @@ SSX_planeInfo wd_planeLocalization(
|
|||||||
debugData[nose_lineIdx][nose_ptIdx].nPointIdx |= 0x40000; //机鼻点
|
debugData[nose_lineIdx][nose_ptIdx].nPointIdx |= 0x40000; //机鼻点
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
leftEnginePoint.pt3D = leftCentroid.pt3D;
|
||||||
|
rightEnginePoint.pt3D = rightCentroid.pt3D;
|
||||||
|
|
||||||
//计算姿态
|
//计算姿态
|
||||||
//axis与左右发动机连续垂直, 采用(-y,, x)形式
|
//axis与左右发动机连续垂直, 采用(-y,, x)形式
|
||||||
SVzNL2DPointD axis = { -(rightEnginePoint.pt3D.z - leftEnginePoint.pt3D.z), rightEnginePoint.pt3D.x - leftEnginePoint.pt3D.x };
|
SVzNL2DPointD axis = { -(rightEnginePoint.pt3D.z - leftEnginePoint.pt3D.z), rightEnginePoint.pt3D.x - leftEnginePoint.pt3D.x };
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user