극한의 아두이노 DIY생활 - 곡률측정기24

in kr-dev 커뮤니티last year (edited)

안녕하세요 Jimae입니다.

오늘은 곡률 알고리즘에 관련하여 글을 써나가볼까 합니다.


 case DATACALCULATION:

                    leftData = (double) (leftLaserData[1] + (leftLaserData[3] * 0.1) + (leftLaserData[4] * 0.01) + (leftLaserData[5] * 0.001)); // 배열값 계산 배열의 0번째 ' ' 2번째 '.'

                    centerData = (double) (centerLaserData[1] + (centerLaserData[3] * 0.1) + (centerLaserData[4] * 0.01) + (centerLaserData[5] * 0.001)); // 배열값 계산 배열의 0번째 ' ' 2번째 '.'

                    rightData = (double) (rightLaserData[1] + (rightLaserData[3] * 0.1) + (rightLaserData[4] * 0.01) + (rightLaserData[5] * 0.001)); // 배열값 계산 배열의 0번째 ' ' 2번째 '.'        

                    //현재 cm단위
                    leftData = ((leftData * 100) - LEFTDISTANCECORRECTION) + CALCULATIONCORRENTION;
                    centerData = ((centerData * 100) - CENTERDISTANCECORRECTION) + CALCULATIONCORRENTION;
                    rightData = ((rightData * 100) - RIGHTDISTANCECORRECTION) + CALCULATIONCORRENTION;

                    if(leftData <= 0) leftData = 0;
                    else if(centerData <= 0) centerData = 0;
                    else if(rightData <= 0) rightData = 0;
/*
                    sumData = leftData + centerData + rightData;

                    if(sumData - previousSumData < LASERFILITER && previousSumData - sumData < LASERFILITER)
                    {
                      leftData = previousLeftData;
                      centerData = previousCenterData;
                      rightData = previousRightData;
                      sumData = previousSumData;
                    }
                    
                    previousLeftData = leftData;
                    previousCenterData = centerData;
                    previousRightData = rightData;

                    previousSumData = sumData;
*/
                    leftX = leftData * cos(radians(LEFTANGLE));
                    leftY = leftData * sin(radians(LEFTANGLE));
                    
                    centerX = 0;
                    centerY = centerData * sin(radians(CENTERANGLE));
                    
                    rightX = rightData * cos(radians(RIGHTANGLE));
                    rightY = rightData * sin(radians(RIGHTANGLE));

                    d1 = (centerX - leftX)/(centerY - leftY);
                    d2 = (rightX - centerX)/(rightY - centerY);

                    cX = ((rightY - leftY) + (centerX + rightX) * d2 - (leftX + centerX) * d1) / (2 * (d2 - d1));
                    cY = -d1 * (cX - (leftX + centerX) / 2) + (leftY + centerY) / 2;

                    curvature = sqrt(pow((leftX - cX),2) + pow((leftY - cY),2));

                    plusdata = curvature / 100;

                    plusdata = plusdata * 1.5; // 1.5 % 데이터 계산

                    curvature = curvature + plusdata;
                    
                    /*
                    Serial.print("left : ");
                    Serial.println(leftData);
                    Serial.print("center : ");
                    Serial.println(centerData);
                    Serial.print("right : ");
                    Serial.println(rightData);
                    Serial.print("curva : ");
                    Serial.println(curvature);
                    Serial.println("");
              */
                    
                    detectionOrderCurvature = LASERSHOOT;

                    break;

이곳에서 실제 곡률을 계산하는 알고리즘을 따로 떼어서 보게 된다면


                    leftX = leftData * cos(radians(LEFTANGLE));
                    leftY = leftData * sin(radians(LEFTANGLE));
                    
                    centerX = 0;
                    centerY = centerData * sin(radians(CENTERANGLE));
                    
                    rightX = rightData * cos(radians(RIGHTANGLE));
                    rightY = rightData * sin(radians(RIGHTANGLE));

                    d1 = (centerX - leftX)/(centerY - leftY);
                    d2 = (rightX - centerX)/(rightY - centerY);

                    cX = ((rightY - leftY) + (centerX + rightX) * d2 - (leftX + centerX) * d1) / (2 * (d2 - d1));
                    cY = -d1 * (cX - (leftX + centerX) / 2) + (leftY + centerY) / 2;

                    curvature = sqrt(pow((leftX - cX),2) + pow((leftY - cY),2));

                    plusdata = curvature / 100;

                    plusdata = plusdata * 1.5; // 1.5 % 데이터 계산

                    curvature = curvature + plusdata;

이부분들 입니다.

저번에 보여드린 링크에 나온대로 구현을 한거라고 보시면 됩니다.

그런대 실제 적용한 알고리즘과 링크쪽에서 설명한 부분에 약간 괴리감이 있을것입니다.

이부분은 실제 좌표를 구하는 과정에서 이루어진 차이인대요.


                    leftX = leftData * cos(radians(LEFTANGLE));
                    leftY = leftData * sin(radians(LEFTANGLE));
                    
                    centerX = 0;
                    centerY = centerData * sin(radians(CENTERANGLE));
                    
                    rightX = rightData * cos(radians(RIGHTANGLE));
                    rightY = rightData * sin(radians(RIGHTANGLE));

3점의 좌표를 구하려고 하는이유가 실질적으로 우리가 아는것은 거리지 그것에 관한 X,Y 좌표가 아닙니다.

그래서 거리를 측정한 거리값이 빗변으로 보고

image.png

이공식들을 적용하여 실질적으로 측정된 물체의 X,Y의 좌표값을 구하는것입니다.

이래야 3점의 좌표를 구할수있고 위의 링크에있는 알고리즘에 적용할수 있는것이죠.

곡률을 구하는 방법은 우리가 수학적으로 2차원 평면에서 이루어지는 것입니다.

실질 물체가 존재하는 현실에서는 2차원 평면을 유지하기 힘들죠 약간 오차가 있습니다.

기구 설계로 아무리 잘맞춰준다고 하더라도 오차가 존재하며 레이저 모듈에도 오차가 있습니다.

그래서 이 프로젝트 같은경우 곡률을 구했다고 하더라도 이게 정확한 데이터인지 아닌지 따져봐야 했던것도 있어요.

왜냐하면 3점의 좌표가 평면이 아니기 때문에 그랬습니다.

오늘은 글이 길어져서 여기까지 다음에 이러서 하도록 하겠습니다.

다들 좋은 주말 보내세요.

극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6
극한의 아두이노 DIY생활 - 곡률측정기7
극한의 아두이노 DIY생활 - 곡률측정기8
극한의 아두이노 DIY생활 - 곡률측정기9
극한의 아두이노 DIY생활 - 곡률측정기10
극한의 아두이노 DIY생활 - 곡률측정기11
극한의 아두이노 DIY생활 - 곡률측정기12
극한의 아두이노 DIY생활 - 곡률측정기13
극한의 아두이노 DIY생활 - 곡률측정기14
극한의 아두이노 DIY생활 - 곡률측정기15
극한의 아두이노 DIY생활 - 곡률측정기16
극한의 아두이노 DIY생활 - 곡률측정기17
극한의 아두이노 DIY생활 - 곡률측정기18
극한의 아두이노 DIY생활 - 곡률측정기19
극한의 아두이노 DIY생활 - 곡률측정기20
극한의 아두이노 DIY생활 - 곡률측정기21
극한의 아두이노 DIY생활 - 곡률측정기22
극한의 아두이노 DIY생활 - 곡률측정기23

Posted through the AVLE Dapp (https://avle.io)
Sort:  
 last year 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.030
BTC 58679.35
ETH 3155.04
USDT 1.00
SBD 2.44