QuakeGod
2024-07-27 842bb64195f958b050867c50db66fc0aa413dafb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#include "LindarPos.h"
#include "OrdLidar.h"
#include "KMachine.h"
 
int ProcessPos(int nLidarIdx, stLidarDot * pLindarDots, int nCount)
{
    int nValidCount0 = nCount;
    int minDisIndex = 0;        int minDistance = 55555;
    int minZ = 10000; int minZIndex= -1;
    int planeCount =0;            // ×îµ×²ãƽÃæµÄµãÊýÁ¿¡£
    int firstmin = 1000,firstmax = -1000;
    int secondmin = 1000, secondmax = -1000;
 
    int firstCount=0; int secondCount =0;            int midCount =0;
    results[0]=0;
    // Çó minZ ºÍ minDistance;
    for (int j = 0;j < nValidCount0;j++){
        if (pLindarDots[j].distance < 50) continue;        // skip too small points;
        if (pLindarDots[j].y < 40) continue;        // skip too small points;                            
        if (pLindarDots[j].x < -200 || pLindarDots[j].x > 500) continue;                            
        if (pLindarDots[j].y < minZ) {    minZIndex = j; minZ = pLindarDots[j].y;    }
        if (pLindarDots[j].distance < minDistance) {
            minDisIndex = j; minDistance = pLindarDots[j].distance;
        }    
    }
 
    for (int j = nValidCount0 -1 ;j>=0 && minZ < 500;j--)
    {
        int x = pLindarDots[j].x;
        int y = pLindarDots[j].y;
        int d = pLindarDots[j].distance;        
        
        if (d < 50) continue;        // skip too small points;
        if (y < 40) continue;        // skip too small points;                                                
        if (x < -200 || x > 500) continue;                                    
        // Ö»²éÕÒ µ×²¿ 50mm Êý¾Ý
 
        //results[0]++;                            
        if (y >= minZ + 50) {
            if ((firstCount >0 && secondCount == 0) 
                || (secondCount >0 && firstCount == 0)) {
                midCount++;
            }
            continue;
        }
 
        if (planeCount < 40)    {
            KMem.WDT[40+2 * planeCount]=d;
            KMem.WDT[40+2 * planeCount +1 ]=x;
        }
            
        planeCount++;
        if (x > -200 && x < 500) 
            {
            if (x < firstmin)  firstmin = x;
            if (x > secondmax) secondmax = x;
        }
            // ºóÑØ
        if (x > -200 && x < 100 && y < minZ + 40 )
        {
            if (x > firstmax)  firstmax = x;
            firstCount++;
        }
            // Ç°ÑØ
        if (x > 200 && x < 500 && y < minZ + 40 )
        {
            if (x < secondmin)  secondmin = x;
            secondCount ++;
        }
 
    }
    results[0]=planeCount;
    results[1]=firstCount;
    results[2]=midCount;
    results[3]=secondCount;
 
    results[4]=firstmin;
    results[5]=firstmax;
    results[6]=secondmin;
    results[7]=secondmax;
    int avg=0;
    if (firstCount > 0 && secondCount > 0 && midCount > 0 ){
        avg = (secondmin + firstmax) / 2;
    }else if (planeCount>10) {
        avg = (firstmin + secondmax) /2;
    }
 
    nPosX = (nPosX *3 + avg) /4;
    if (minZ < 9999) nPosZ1 = (minZ + nPosZ1 * 3)/4;    
    return 0;
    
    
    
}