diff --git a/sourceCode/workpieceHolePositioning.cpp b/sourceCode/workpieceHolePositioning.cpp index 65f5674..cb0cf9f 100644 --- a/sourceCode/workpieceHolePositioning.cpp +++ b/sourceCode/workpieceHolePositioning.cpp @@ -1,4 +1,4 @@ -#include +#include #include "SG_baseDataType.h" #include "SG_baseAlgo_Export.h" #include "workpieceHolePositioning_Export.h" @@ -6,24 +6,25 @@ #include //version 1.0.0 : base version release to customer -//version 1.0.2 : Ìí¼ÓÁ˹¤¼þ×Ë̬£¨Å·À­½ÇÊä³ö) -//version 1.1.0 : c¶Ô¹¤¼þ×Ë̬¹æ·¶»¯ÎªÖÐÐĵ㣨²Ù×÷µã£©¼ÓÈý¸ö·½ÏòʸÁ¿ -std::string m_strVersion = "1.1.1"; +//version 1.0.2 : 添加了工件姿æ€�(欧拉角输出) +//version 1.1.0 : c对工件姿æ€�规范化为中心点(æ“�作点)加三个方å�‘矢é‡� +//version 1.2.0 : 算法完æˆ�了6轴验è¯� +std::string m_strVersion = "1.2.0"; const char* wd_workpieceHolePositioningVersion(void) { return m_strVersion.c_str(); } -//Ïà»úˮƽ°²×°¼ÆËãµØÃæµ÷ƽ²ÎÊý¡£ -//Ïà»úZÖá»ù±¾Æ½ÐеØÃæÊ±£¬ÐèÒªÒÔµØÃæÎª²ÎÕÕ£¬½«Ïà»úµ÷ˮƽ -//Ðýת¾ØÕóΪµ÷ƽ²ÎÊý£¬¼´½«Æ½Ãæ·¨Ïòµ÷ÕûΪ´¹Ö±ÏòÁ¿µÄ²ÎÊý +//相机水平安装计算地é�¢è°ƒå¹³å�‚数。 +//相机Z轴基本平行地é�¢æ—¶ï¼Œéœ€è¦�以地é�¢ä¸ºå�‚照,将相机调水平 +//旋转矩阵为调平å�‚数,å�³å°†å¹³é�¢æ³•å�‘调整为垂直å�‘é‡�çš„å�‚æ•° SSG_planeCalibPara wd_getGroundCalibPara( std::vector< std::vector>& scanLines) { return sg_getPlaneCalibPara2(scanLines); } -//Ïà»úˮƽʱ×Ë̬µ÷ƽ£¬²¢È¥³ýµØÃæ +//相机水平时姿æ€�调平,并去除地é�¢ void wd_lineDataR( std::vector< SVzNL3DPosition>& a_line, const double* camPoseR, @@ -41,7 +42,7 @@ SVzNL3DPoint _ptRotate(SVzNL3DPoint pt3D, const double matrix3d[9]) return _r_pt; } -//ËÑË÷×î½Ó½üdistanceµÄÄ¿±ê +//æ�œç´¢æœ€æŽ¥è¿‘distance的目标 int distanceSearchObject(SVzNL3DPoint seed, std::vector& holes, double distance, double distDeviation) { int result = -1; @@ -66,7 +67,7 @@ int distanceSearchObject(SVzNL3DPoint seed, std::vector& holes, do return result; } -//ËÑË÷×î½Ó½üdistanceÇҽǶÈΪangleµÄÄ¿±ê, ÒԽǶÈΪÓÅÏÈ +//æ�œç´¢æœ€æŽ¥è¿‘distance且角度为angle的目标, 以角度为优先 int angleConditionDistanceSearch( SVzNL3DPoint seed, SVzNL3DPoint angleSide, std::vector& holes, @@ -151,7 +152,7 @@ double _getMeanZ(std::vector>& quantiValue, SVzNL3DPoint see return (zSum / hist); } -//¹¤¼þ¿×¶¨Î» +//工件孔定ä½� void wd_workpieceHolePositioning( std::vector< std::vector>& scanLinesInput, const WD_workpieceHoleParam workpiecePara, @@ -175,20 +176,20 @@ void wd_workpieceHolePositioning( isGridData = false; scanLines[i].resize(scanLinesInput[i].size()); - std::copy(scanLinesInput[i].begin(), scanLinesInput[i].end(), scanLines[i].begin()); // ʹÓÃstd::copyËã·¨ + std::copy(scanLinesInput[i].begin(), scanLinesInput[i].end(), scanLines[i].begin()); // 使用std::copy算法 } - if (false == isGridData)//Êý¾Ý²»ÊÇÍø¸ñ¸ñʽ + if (false == isGridData)//æ•°æ�®ä¸�是网格格å¼� { *errCode = SG_ERR_NOT_GRID_FORMAT; return; } for (int i = 0; i < lineNum; i++) - { //Ðд¦Àí - //µ÷ƽ£¬È¥³ýµØÃæ + { //行处ç�† + //调平,去除地é�¢ wd_lineDataR(scanLines[i], groundCalibPara.planeCalib, -1); } - //Éú³ÉÁ¿»¯Êý¾Ý£¬ÒÔ1mmΪÁ¿»¯³ß¶È£¬ÓÃÓÚÈ·¶¨¹¤¼þ±íÃæ¸ß¶È + //生æˆ�é‡�化数æ�®ï¼Œä»¥1mm为é‡�化尺度,用于确定工件表é�¢é«˜åº¦ SVzNL3DRangeD roi3D = sg_getScanDataROI_vector( scanLines); SVzNLRect roi2D; roi2D.left = (int)roi3D.xRange.min; @@ -204,11 +205,11 @@ void wd_workpieceHolePositioning( for (int i = 0; i < quanti_X; i++) { quantiValue[i].resize(quanti_Y); - std::fill(quantiValue[i].begin(), quantiValue[i].end(), 0);//³õʼ»¯Îª0 + std::fill(quantiValue[i].begin(), quantiValue[i].end(), 0);//åˆ�始化为0 quantiHist[i].resize(quanti_Y); - std::fill(quantiHist[i].begin(), quantiHist[i].end(), 0);//³õʼ»¯Îª0 + std::fill(quantiHist[i].begin(), quantiHist[i].end(), 0);//åˆ�始化为0 } - //ÒÔ1mm³ß¶ÈÁ¿»¯ + //以1mm尺度é‡�化 for (int line = 0; line < lineNum; line++) { for (int j = 0; j < linePtNum; j++) @@ -236,7 +237,7 @@ void wd_workpieceHolePositioning( pointMask.resize(lineNum); std::vector endingPoints; - //ÌáÈ¡Ï߶ζ˵ãÌØÕ÷ + //æ��å�–线段端点特å¾� for (int line = 0; line < lineNum; line++) { if (line == 1677) @@ -244,8 +245,8 @@ void wd_workpieceHolePositioning( std::vector& lineData = scanLines[line]; pointMask[line].resize(lineData.size()); - std::fill(pointMask[line].begin(), pointMask[line].end(), 0);//³õʼ»¯Îª0 - //Â˲¨£¬Â˳ýÒì³£µã + std::fill(pointMask[line].begin(), pointMask[line].end(), 0);//åˆ�始化为0 + //滤波,滤除异常点 sg_lineDataRemoveOutlier_changeOriginData(&lineData[0], linePtNum, filterParam); std::vector segs; @@ -253,19 +254,19 @@ void wd_workpieceHolePositioning( lineData, lineSegPara, segs); - //½«seg¶Ëµã×÷Ϊ±ßÔµµã¡£×öÁ˵ØÃæµ÷ƽºó£¬´¹Ö±¿×µÄÄÚ²àÔÚXYÆ½ÃæÉϾùΪ±ßÔµµã¡£ + //å°†seg端点作为边缘点。å�šäº†åœ°é�¢è°ƒå¹³å�Žï¼Œåž‚直孔的内侧在XYå¹³é�¢ä¸Šå�‡ä¸ºè¾¹ç¼˜ç‚¹ã€‚ for (int i = 0, i_max = (int)segs.size(); i < i_max; i++) { int ptIdx = segs[i].start; endingPoints.push_back(lineData[ptIdx].pt3D); - pointMask[line][ptIdx] = 1; //·ÀÖ¹ÖØ¸´ + pointMask[line][ptIdx] = 1; //防止é‡�å¤� ptIdx = segs[i].start + segs[i].len - 1; endingPoints.push_back(lineData[ptIdx].pt3D); pointMask[line][ptIdx] = 1; } } - //Éú³ÉˮƽɨÃè + //生æˆ�水平扫æ�� std::vector> hLines_raw; hLines_raw.resize(linePtNum); for (int i = 0; i < linePtNum; i++) @@ -274,20 +275,20 @@ void wd_workpieceHolePositioning( { for (int j = 0; j < linePtNum; j++) { - scanLines[line][j].nPointIdx = 0; //½«Ô­Ê¼Êý¾ÝµÄÐòÁÐÇå0£¨»áתÒåʹÓã© + scanLines[line][j].nPointIdx = 0; //将原始数æ�®çš„åº�列清0(会转义使用) hLines_raw[j][line] = scanLines[line][j]; hLines_raw[j][line].pt3D.x = scanLines[line][j].pt3D.y; hLines_raw[j][line].pt3D.y = scanLines[line][j].pt3D.x; } } - //ˮƽarcÌØÕ÷ÌáÈ¡ + //æ°´å¹³arc特å¾�æ��å�– int lineNum_h_raw = (int)hLines_raw.size(); for (int line = 0; line < lineNum_h_raw; line++) { if (line == 974) int kkk = 1; std::vector& lineData = hLines_raw[line]; - //Â˲¨£¬Â˳ýÒì³£µã + //滤波,滤除异常点 int ptNum = (int)lineData.size(); sg_lineDataRemoveOutlier_changeOriginData(&lineData[0], ptNum, filterParam); @@ -296,11 +297,11 @@ void wd_workpieceHolePositioning( lineData, lineSegPara, segs); - //½«seg¶Ëµã×÷Ϊ±ßÔµµã¡£×öÁ˵ØÃæµ÷ƽºó£¬´¹Ö±¿×µÄÄÚ²àÔÚXYÆ½ÃæÉϾùΪ±ßÔµµã¡£ + //å°†seg端点作为边缘点。å�šäº†åœ°é�¢è°ƒå¹³å�Žï¼Œåž‚直孔的内侧在XYå¹³é�¢ä¸Šå�‡ä¸ºè¾¹ç¼˜ç‚¹ã€‚ for (int i = 0, i_max = (int)segs.size(); i < i_max; i++) { int ptIdx = segs[i].start; - if (pointMask[ptIdx][line] == 0) //·ÀÖ¹µãÖØ¸´ + if (pointMask[ptIdx][line] == 0) //防止点é‡�å¤� { SVzNL3DPoint an_ending; an_ending.x = lineData[ptIdx].pt3D.y; @@ -310,7 +311,7 @@ void wd_workpieceHolePositioning( pointMask[ptIdx][line] = 1; } ptIdx = segs[i].start + segs[i].len - 1; - if (pointMask[ptIdx][line] == 0) //·ÀÖ¹µãÖØ¸´ + if (pointMask[ptIdx][line] == 0) //防止点é‡�å¤� { SVzNL3DPoint an_ending; an_ending.x = lineData[ptIdx].pt3D.y; @@ -322,7 +323,7 @@ void wd_workpieceHolePositioning( } } - //±ê×¢ + //标注 std::vector> featureInfoMask; std::vector> feature3DInfo; featureInfoMask.resize(lineNum); @@ -333,7 +334,7 @@ void wd_workpieceHolePositioning( feature3DInfo[i].resize(lineNum_h_raw); } - //±ê×¢ + //标注 for (int line = 0; line < lineNum; line++) { std::vector& a_lineMask = pointMask[line]; @@ -353,9 +354,9 @@ void wd_workpieceHolePositioning( } } } - //¾ÛÀà - //²ÉÓõü´ú˼Ï룬»Ø¹é˼·½øÐиßЧ¾ÛÀà - std::vector> clusters; //Ö»¼Ç¼λÖà + //è�šç±» + //采用迭代æ€�想,回归æ€�路进行高效è�šç±» + std::vector> clusters; //å�ªè®°å½•ä½�ç½® std::vector clustersRoi3D; int clusterID = 1; int clusterCheckWin = 5; @@ -364,7 +365,7 @@ void wd_workpieceHolePositioning( for (int x = 0; x < lineNum; x++) { SSG_featureClusteringInfo& a_featureInfo = featureInfoMask[x][y]; - if ((0 == a_featureInfo.featurType) || (a_featureInfo.clusterID > 0)) //·ÇÌØÕ÷»òÒѾ­´¦Àí + if ((0 == a_featureInfo.featurType) || (a_featureInfo.clusterID > 0)) //é�žç‰¹å¾�或已ç»�处ç�† continue; SVzNL3DPoint& a_feature3DValue = feature3DInfo[x][y]; @@ -380,11 +381,11 @@ void wd_workpieceHolePositioning( std::vector< SVzNL2DPoint> a_cluster; a_cluster.push_back(a_seedPos); wd_gridPointClustering( - featureInfoMask,//int£¬¼ÇÂ¼ÌØÕ÷±ê¼ÇºÍclusterID£¬¸½¼ÓÒ»¸öflag - feature3DInfo,//double,¼ÇÂ¼×ø±êÐÅÏ¢ - clusterCheckWin, //ËÑË÷´°¿Ú - growParam,//¾ÛÀàÌõ¼þ - clusterID, //µ±Ç°ClusterµÄID + featureInfoMask,//int,记录特å¾�标记和clusterID,附加一个flag + feature3DInfo,//double,记录å��标信æ�¯ + clusterCheckWin, //æ�œç´¢çª—å�£ + growParam,//è�šç±»æ�¡ä»¶ + clusterID, //当å‰�Clusterçš„ID a_cluster, //result a_clusterRoi ); @@ -393,7 +394,7 @@ void wd_workpieceHolePositioning( clusterID++; } } - //¾ÛÀà½á¹û·ÖÎö + //è�šç±»ç»“果分æž� std::vector validCluserIndexing; int clusterSize = (int)clusters.size(); for (int i = 0; i < clusterSize; i++) @@ -405,14 +406,14 @@ void wd_workpieceHolePositioning( (W > workpiecePara.holeDiameter * 0.5) && (W < workpiecePara.holeDiameter * 2)) validCluserIndexing.push_back(i); } - //Éú³É½á¹û + //生æˆ�结果 std::vector< SWD_HoleInfo> holes; int objectSize = (int)validCluserIndexing.size(); for (int objIdx = 0; objIdx < objectSize; objIdx++) { std::vector pointArray; int clusterIdx = validCluserIndexing[objIdx]; - //È¡clusterÉϵĵã + //å�–cluster上的点 int clusterPtSize = (int)clusters[clusterIdx].size(); double minZ = DBL_MAX; for (int i = 0; i < clusterPtSize; i++) @@ -426,7 +427,7 @@ void wd_workpieceHolePositioning( minZ = a_pt3d.z; pointArray.push_back(a_pt3d); } - //Ô²ÄâºÏ + //圆拟å�ˆ SVzNL3DPoint center; double radius; double err = fitCircleByLeastSquare(pointArray, center, radius); @@ -436,9 +437,9 @@ void wd_workpieceHolePositioning( a_hole.radius = radius; holes.push_back(a_hole); } - //·Ö¸î - //·½·¨£ºÏÈËÑË÷ÓëW×î½Ó½üµÄµã£¬È»ºóÌõ¼þËÑË÷£¨´¹Ö±£©ÓëL×î½Ó½üµÄµã - double distDeviation = 5.0; //¾àÀëËÑË÷µÄºÏ¸ñÃÅÏÞ¡£Ð¡Óڴ˾àÀ룬ÈÏΪËÑË÷µ½µÄÄ¿±êΪÓÐЧ + //分割 + //方法:先æ�œç´¢ä¸ŽW最接近的点,然å�Žæ�¡ä»¶æ�œç´¢ï¼ˆåž‚直)与L最接近的点 + double distDeviation = 5.0; //è·�离æ�œç´¢çš„å�ˆæ ¼é—¨é™�。å°�于此è·�离,认为æ�œç´¢åˆ°çš„目标为有效 for (int objIdx = 0; objIdx < objectSize; objIdx++) { if (holes[objIdx].radius < 0) @@ -450,9 +451,9 @@ void wd_workpieceHolePositioning( if (idx1 < 0) continue; - SVzNLRangeD angleRange = { 85, 95 }; //´¹Ö±£¬5¶È·¶Î§ + SVzNLRangeD angleRange = { 85, 95 }; //垂直,5度范围 SWD_HoleInfo& p1 = holes[idx1]; - //ËÑË÷×î½Ó½üdistanceÇҽǶÈΪangleµÄÄ¿±ê, ÒԽǶÈΪÓÅÏÈ + //æ�œç´¢æœ€æŽ¥è¿‘distance且角度为angle的目标, 以角度为优先 int idx2 = angleConditionDistanceSearch( p0.center, p1.center, holes, @@ -462,7 +463,7 @@ void wd_workpieceHolePositioning( continue; SWD_HoleInfo& p2 = holes[idx2]; - //ËÑË÷×î½Ó½üdistanceÇҽǶÈΪangleµÄÄ¿±ê, ÒԽǶÈΪÓÅÏÈ + //æ�œç´¢æœ€æŽ¥è¿‘distance且角度为angle的目标, 以角度为优先 int idx3 = angleConditionDistanceSearch( p1.center, p0.center, holes, @@ -475,7 +476,7 @@ void wd_workpieceHolePositioning( p2.radius = -1; p3.radius = -1; - //ÖØÐ¼ÆËãZÖµ¡£ÒòΪ³Á¿×µÄÔ­Òò£¬ZÖµ»á²»×¼È·¡£È¡ËÄÌõ±ßµÄÖе㴦µÄZÖµµÄ¾ùÖµ×÷ΪÕû¸öµÄZÖµ + //é‡�新计算Z值。因为沉孔的原因,Z值会ä¸�准确。å�–å››æ�¡è¾¹çš„中点处的Z值的å�‡å€¼ä½œä¸ºæ•´ä¸ªçš„Z值 SVzNL3DPoint center_p0p1 = { (p0.center.x + p1.center.x) / 2,(p0.center.y + p1.center.y) / 2, (p0.center.z + p1.center.z) / 2 }; SVzNL3DPoint center_p0p2 = { (p0.center.x + p2.center.x) / 2,(p0.center.y + p2.center.y) / 2, (p0.center.z + p2.center.z) / 2 }; SVzNL3DPoint center_p1p3 = { (p1.center.x + p3.center.x) / 2,(p1.center.y + p3.center.y) / 2, (p1.center.z + p3.center.z) / 2 }; @@ -500,7 +501,7 @@ void wd_workpieceHolePositioning( for (int m = 0; m < 4; m++) { SVzNL3DPoint a_pt = a_workpiece.holes[m]; - a_pt.z = a_pt.z + 20; //·¨Ïò£¬ÒòΪ×ö¹ýµØÃæ¸ßƽ£¬ËùÒÔ·¨ÏòÖ»ÔÚzÏò + a_pt.z = a_pt.z + 20; //法å�‘,因为å�šè¿‡åœ°é�¢é«˜å¹³ï¼Œæ‰€ä»¥æ³•å�‘å�ªåœ¨zå�‘ a_workpiece.holesDir.push_back(a_pt); } a_workpiece.center = { (p0.center.x + p1.center.x + p2.center.x + p3.center.x) / 4, @@ -508,10 +509,10 @@ void wd_workpieceHolePositioning( (z1 + z2 + z3 + z4) / 4 }; SVzNL3DPoint y_dir; - if (p0.center.y < p2.center.y) - y_dir = { p2.center.x - p0.center.x, p2.center.y - p0.center.y, 0 }; + if (p0.center.x < p1.center.x) + y_dir = { p1.center.x - p0.center.x, p1.center.y - p0.center.y, 0 }; else - y_dir = { p0.center.x - p2.center.x, p0.center.y - p2.center.y, 0 }; + y_dir = { p0.center.x - p1.center.x, p0.center.y - p1.center.y, 0 }; double modLen = sqrt(pow(y_dir.x, 2) + pow(y_dir.y, 2)); y_dir = { y_dir.x / modLen, y_dir.y / modLen, 0 }; a_workpiece.y_dir = { y_dir.x * 20 + a_workpiece.center.x, y_dir.y * 20 + a_workpiece.center.y, a_workpiece.center.z }; @@ -521,7 +522,7 @@ void wd_workpieceHolePositioning( } int workpieceNum = (int)workpiecePositioning.size(); - //Ðýת»ØÈ¥ + //旋转回去 for (int i = 0; i < workpieceNum; i++) { SVzNL3DPoint rpt; @@ -546,10 +547,10 @@ void wd_workpieceHolePositioning( workpiecePositioning[i].y_dir.y - workpiecePositioning[i].center.y, workpiecePositioning[i].y_dir.z - workpiecePositioning[i].center.z }; double mod_vz = sqrt(pow(vector_z.x, 2) + pow(vector_z.y, 2) + pow(vector_z.z, 2)); - vector_z = { vector_z.x / mod_vz, vector_z.y / mod_vz, vector_z.z / mod_vz }; //¹éÒ»»¯ + vector_z = { vector_z.x / mod_vz, vector_z.y / mod_vz, vector_z.z / mod_vz }; //归一化 double mod_vy = sqrt(pow(vector_y.x, 2) + pow(vector_y.y, 2) + pow(vector_y.z, 2)); - vector_y = { vector_y.x / mod_vy, vector_y.y / mod_vy, vector_y.z / mod_vy }; //¹éÒ»»¯ - //²æ³Ë³övector_x + vector_y = { vector_y.x / mod_vy, vector_y.y / mod_vy, vector_y.z / mod_vy }; //归一化 + //å�‰ä¹˜å‡ºvector_x SVzNL3DPoint vector_x; vector_x.x = vector_y.y * vector_z.z - vector_z.y * vector_y.z; vector_x.y = vector_y.z * vector_z.x - vector_z.z * vector_y.x; @@ -558,7 +559,7 @@ void wd_workpieceHolePositioning( workpiecePositioning[i].y_dir = vector_y; workpiecePositioning[i].z_dir = vector_z; #if 0 - //µÃµ½Ðýת¾ØÕó + //得到旋转矩阵 double R[3][3]; R[0][0] = vector_x.x; R[1][0] = vector_x.y; diff --git a/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp b/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp index 07418fd..a1b1c45 100644 --- a/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp +++ b/workpieceHolePositioning_test/workpieceHolePositioning_test.cpp @@ -154,6 +154,12 @@ void _outputWorkpieceInfo(char* fileName, std::vector< WD_workpieceInfo>& workpi } sprintf_s(dataStr, 50, " center: (%g, %g, %g)", workpiecePositioning[i].center.x, workpiecePositioning[i].center.y, workpiecePositioning[i].center.z); sw << dataStr << std::endl; + sprintf_s(dataStr, 50, " x_dir: (%g, %g, %g)", workpiecePositioning[i].x_dir.x, workpiecePositioning[i].x_dir.y, workpiecePositioning[i].x_dir.z); + sw << dataStr << std::endl; + sprintf_s(dataStr, 50, " y_dir: (%g, %g, %g)", workpiecePositioning[i].y_dir.x, workpiecePositioning[i].y_dir.y, workpiecePositioning[i].y_dir.z); + sw << dataStr << std::endl; + sprintf_s(dataStr, 50, " z_dir: (%g, %g, %g)", workpiecePositioning[i].z_dir.x, workpiecePositioning[i].z_dir.y, workpiecePositioning[i].z_dir.z); + sw << dataStr << std::endl; } sw.close(); } @@ -444,7 +450,7 @@ int main() }; SVzNLRange fileIdx[TEST_GROUP] = { - {5,5}, + {6,6}, }; const char* ver = wd_workpieceHolePositioningVersion(); @@ -494,9 +500,13 @@ int main() std::cout << T << std::endl; //验算6è½´å§¿æ€� + std::vector verify_pts_eye; + verify_pts_eye.insert(verify_pts_eye.end(), pts_eye.begin(), pts_eye.end()); + cv::Point3d a_center = { 232.997, -173.533, 1795.9 }; + verify_pts_eye.push_back(a_center); std::vector> pose_eye; - pose_eye.resize(6); - for (int i = 0; i < 6; i++) + pose_eye.resize(7); + for (int i = 0; i < 7; i++) pose_eye[i].resize(3); pose_eye[0][0] = { -0.020, -1.000, -0.011 }; pose_eye[0][1] = { 1.000, -0.020, -0.001 }; pose_eye[0][2] = { 0.001, -0.011, 1.000 }; pose_eye[1][0] = { 0.021,-1.000,-0.011 }; pose_eye[1][1] = { 1.000,0.021,-0.000 }; pose_eye[1][2] = { 0.001,-0.011,1.000 }; @@ -504,13 +514,14 @@ int main() pose_eye[3][0] = { 0.008,-1.000,-0.011 }; pose_eye[3][1] = { 1.000,0.008,-0.000 }; pose_eye[3][2] = { 0.001,-0.011,1.000 }; pose_eye[4][0] = { 0.006,-1.000,-0.011 }; pose_eye[4][1] = { 1.000,0.006,-0.000 }; pose_eye[4][2] = { 0.001,-0.011,1.000 }; pose_eye[5][0] = { 0.139,-0.990,-0.011 }; pose_eye[5][1] = { 0.990,0.139,0.001 }; pose_eye[5][2] = { 0.001,-0.011,1.000 }; - - for (int i = 0; i < 6; i++) + pose_eye[6][0] = { 0.136746, -0.990563, -0.00926168 }; pose_eye[6][1] = { 0.990606, 0.136747, 0.000517805 }; pose_eye[6][2] = { 0.000753588, -0.00924548, 0.999957 }; + for (int i = 0; i < 7; i++) { cv::Point3d rtPt; - pointRT_2(R, T, pts_eye[i], rtPt); //RTå‰�å�Žçš„点 + pointRT_2(R, T, verify_pts_eye[i], rtPt); //RTå‰�å�Žçš„点 std::vector dirVectors_eye = pose_eye[i]; + //dirVectors_eye[0] = { -dirVectors_eye[0].x, -dirVectors_eye[0].y, -dirVectors_eye[0].z }; dirVectors_eye[1] = { -dirVectors_eye[1].x, -dirVectors_eye[1].y, -dirVectors_eye[1].z }; dirVectors_eye[2] = { -dirVectors_eye[2].x, -dirVectors_eye[2].y, -dirVectors_eye[2].z }; std::vector dirVectors_robot; @@ -613,7 +624,7 @@ int main() groundCalibPara.invRMatrix[i] = groundCalibPara.planeCalib[i]; char calibFile[250]; sprintf_s(calibFile, "%sground_calib_para.txt", dataPath[grp]); - //groundCalibPara = _readCalibPara(calibFile); + groundCalibPara = _readCalibPara(calibFile); for (int fidx = fileIdx[grp].nMin; fidx <= fileIdx[grp].nMax; fidx++) {