극한의 아두이노 DIY생활 - 곡률측정기22
안녕하세요 Jimae입니다.
에이블에 오랜만에 글쓰다보니 어제같은경우 약간 꼬였습니다.
아무튼 오늘도 이어서 글을 써보도록 하겠습니다.
void LaserCurvatureCalculation(void)
{
unsigned char c1, c2, c3;
unsigned char num = 0;
double plusdata = 0;
if(CurvatureFlag != START) return;
switch(detectionOrderCurvature)
{
case LASERSHOOT:
LeftLaserShoot();
delay(10);
CenterLaserShoot();
delay(10);
RightLaserShoot();
delay(10);
laserAnswerTimeC = millis(); // 레이저 오류일때 다시보내기 위한 시간
detectionOrderCurvature = LASERRREAD;
break;
case LASERRREAD:
waitTimeC = millis() - laserAnswerTimeC; // 레이저 오류일때 다시보내기 비교 시간
if(waitTimeC >= 3000) // 2초 이상
{
CurvatureSynchronization = 0;
detectionOrderCurvature = LASERSHOOT; // error 만약 3개의 레이저를 쓸때 한개라도 에러나면 전부다 다시 해줘야 한다.
break;
}
if (LEFTLASER.available() > 0)
{
c1 = LEFTLASER.read();
LeftLaserqueue.enqueue(c1);
if(c1 == ',') CurvatureSynchronization++;
c1 = 0;
}
if (CENTERLASER.available() > 0)
{
c2 = CENTERLASER.read();
CenterLaserqueue.enqueue(c2);
if(c2 == ',') CurvatureSynchronization++;
c2 = 0;
}
if (RIGHTLASER.available() > 0)
{
c3 = RIGHTLASER.read();
RightLaserqueue.enqueue(c3);
if(c3 == ',') CurvatureSynchronization++;
c3 = 0;
}
//Serial.println(CurvatureSynchronization);
if(CurvatureSynchronization >= 3)
{
CurvatureSynchronization = 0;
detectionOrderCurvature = DATAPROCESS;
}
break;
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;
default:
detectionOrderCurvature = LASERSHOOT;
break;
}
}
오늘부터 이부분에대해서 글을 써볼까 합니다.
이부분 같은경우 거리측정 레이저 모듈에서 데이터를 3개 전부 읽어서 그 부분을 이용하여 곡률을 구하는 알고리즘도 여기있기 때문입니다.
http://egloos.zum.com/heilow/v/418569
이알고리즘을 참조해서 프로그램을 구현을 했기때문에 이렇게 링크를 올립니다.
3점을 이용하여 원의 곡률을 구하는 공식입니다.
그리고 그것을 프로그램으로 정리를 하신것이죠.
case LASERSHOOT:
LeftLaserShoot();
delay(10);
CenterLaserShoot();
delay(10);
RightLaserShoot();
delay(10);
laserAnswerTimeC = millis(); // 레이저 오류일때 다시보내기 위한 시간
detectionOrderCurvature = LASERRREAD;
break;
저번에것과 비슷합니다.
우선 레이저를 하나하나씩 전부 거리 측정을 위해 레이저를 쏘개 합니다.
case LASERRREAD:
waitTimeC = millis() - laserAnswerTimeC; // 레이저 오류일때 다시보내기 비교 시간
if(waitTimeC >= 3000) // 2초 이상
{
CurvatureSynchronization = 0;
detectionOrderCurvature = LASERSHOOT; // error 만약 3개의 레이저를 쓸때 한개라도 에러나면 전부다 다시 해줘야 한다.
break;
}
if (LEFTLASER.available() > 0)
{
c1 = LEFTLASER.read();
LeftLaserqueue.enqueue(c1);
if(c1 == ',') CurvatureSynchronization++;
c1 = 0;
}
if (CENTERLASER.available() > 0)
{
c2 = CENTERLASER.read();
CenterLaserqueue.enqueue(c2);
if(c2 == ',') CurvatureSynchronization++;
c2 = 0;
}
if (RIGHTLASER.available() > 0)
{
c3 = RIGHTLASER.read();
RightLaserqueue.enqueue(c3);
if(c3 == ',') CurvatureSynchronization++;
c3 = 0;
}
//Serial.println(CurvatureSynchronization);
if(CurvatureSynchronization >= 3)
{
CurvatureSynchronization = 0;
detectionOrderCurvature = DATAPROCESS;
}
break;
그 다음에 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
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.