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

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

안녕하세요 Jimae입니다.

저번에 곡률계산 알고리즘이 포함된 기능에대해 설명하다 도중에 끊었습니다.

우선 레이저 모듈 센서가 3개다 보니 하나하나씩 왼쪽부터 중간 오른쪽 이렇게 순차적으로 쏘게 하고 데이터를 모두 읽습니다.

    case DATAPROCESS:    
                    if(!LeftLaserqueue.isEmpty())
                    {
                        c1 = LeftLaserqueue.dequeue();                        
                        
                        if(c1 == ':')  // 길이 데이터만 건짐
                        {
                          for(num = 0; num < 6; num++)  // 데이터 길이 6개 단위 M
                          {
                            leftLaserData[num] = (LeftLaserqueue.dequeue() - 48); // 아스키 코드를 숫자값으로 변환 - 48
                          }
                        }
                        else if(c1 == 'm')  //큐 비우기
                        {
                          CurvatureSynchronization++;
                          while(!LeftLaserqueue.isEmpty())  c1 = LeftLaserqueue.dequeue();
                        }
          
                        c1 = 0;
                     }

                    if(!CenterLaserqueue.isEmpty())
                    {
                        c2 = CenterLaserqueue.dequeue();   
                                                    
                        
                        if(c2 == ':')  // 길이 데이터만 건짐
                        {
                          for(num = 0; num < 6; num++)  // 데이터 길이 6개 단위 M
                          {
                            centerLaserData[num] = (CenterLaserqueue.dequeue() - 48); // 아스키 코드를 숫자값으로 변환 - 48
                          }
                        }
                        else if(c2 == 'm')  //큐 비우기
                        {
                          CurvatureSynchronization++;
                          while(!CenterLaserqueue.isEmpty())  c2 = CenterLaserqueue.dequeue();
                          
                        }
          
                        c2 = 0;
                     }

                    if(!RightLaserqueue.isEmpty())
                    {
                        c3 = RightLaserqueue.dequeue();   
                                                    
                        
                        if(c3 == ':')  // 길이 데이터만 건짐
                        {
                          for(num = 0; num < 6; num++)  // 데이터 길이 6개 단위 M
                          {
                            rightLaserData[num] = (RightLaserqueue.dequeue() - 48); // 아스키 코드를 숫자값으로 변환 - 48
                          }
                        }
                        else if(c3 == 'm')  //큐 비우기
                        {
                          CurvatureSynchronization++;
                          while(!RightLaserqueue.isEmpty())  c3 = RightLaserqueue.dequeue();
                          
                        }
          
                        c3 = 0;
                     }


                    if(CurvatureSynchronization >= 3)
                    {
                      CurvatureSynchronization = 0;
                      detectionOrderCurvature = DATACALCULATION;
                    }
                    
                    break;

그 다음 데이터를 수집할때 넣었던 큐에 데이터를 빼고, 아스키 코드로 되어있던 거리 데이터를 우리가 아는 정수값으로 변환시키는거죠. 그 과정에서 큐에 데이터를 빼고 이렇게 진행을 합니다.

 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;

이제 핵심부분 입니다.

정수로 따로저장한 데이터를 이제 계산에 필요한 데이터로 변환하고 이것을 곡률로 구하는 공식에다 대입하는 것입니다.

이부분이 이기기에 핵심기능이라고 보시면됩니다.

곡률측정기니까 곡률을 계산하는것이죠.

이부분은 저번에 누차 말했지만

http://egloos.zum.com/heilow/v/418569

위의 링크를 참고해서 구현되어진 겁니다.

오늘은 여기까지 다들 좋은하루 되세요.

극한의 아두이노 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

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