본문 바로가기

나래온 1기(~2012.6)/라인트레이서 이야기

(3부작) 라인트레이서 이야기 - 3. line.c 독해 길잡이 (하)


상편에 이어서 쓰는 글입니다.
상편을 보지 않으신 분은 상편 먼저 보시고 오시길 바랍니다.

2010/07/31 - [학생용 라인트레이서/라인트레이서 이야기] - (3부작) 라인트레이서 이야기 - 4. BreezeCore 독해 길잡이

2010/07/31 - [학생용 라인트레이서/라인트레이서 이야기] - (3부작) 라인트레이서 이야기 - 3. line.c 독해 길잡이 (하)
2010/07/28 - [학생용 라인트레이서/라인트레이서 이야기] - (3부작) 라인트레이서 이야기 - 2. line.c 독해 길잡이 (상)
2010/07/18 - [학생용 라인트레이서/라인트레이서 이야기] - (3부작) 라인트레이서 이야기 - 1. 지금 내가 쓰는 로봇에 대하여


- 회전에 대하여 -


Q : 그 다음으로 많이 발생하는 문제는 회전할 때 덜 회전해서 길을 못찾는 문제같습니다. 이 문제를 해결하는 법을 묻기 전에, Turn이라는 함수의 내용 먼저 알려주시겠습니까?
A : 턴 함수의 내용 자체는 회전에 대한 큰 역할을 하지 않습니다.
그저 길을 인식할 때까지 돌도록 하고, 끝입니다.
예를 들어 좌회전 시에는 다음의 코드를 실행하게 되어있습니다.
while(!VSL3)DC_MOVE(-speed2*0.9,speed3*0.9);
while(VSL3)DC_MOVE(-speed2*0.8,speed3*0.8);
while(!VSL2)DC_MOVE(-speed2*0.7,speed2*0.7);
이 부분을 한 번 읽어보자면,
1. 왼쪽 3번째 센서가 걸릴때까지 좌회전
2. 왼쪽 3번째 센서가 해제될때까지 좌회전
3. 왼쪽 2번째 센서가 걸릴때까지 좌회전
이런 식입니다.
우회전이나 유턴도 다 비슷한 식이라고 생각하시면 됩니다.

Q : 그런데 이런 간단한 소스에서 의외로 잘못되는 경우가 많더군요, 도대체 이 부분의 어디가 문제가 되어서 덜 회전하는 경우가 생기나요?
A : 덜 회전하는 문제는 위에서 보았듯 양쪽의 두번째 센서까지만 인식하고 끝나기 때문에, 버그가 아니라 일부러 덜 회전하게 되어있는 것이 맞습니다.
제 생각에 이 부분은 직선코스가 아닌 여러 자유곡선, 사선의 길을 잘 이동하게 하기 위해서 제작자가 의도적으로 이렇게 만든 것 같습니다.

Q : 그러면 해결할 수는 없나요?
A : 센서를 VSC(가운데센서)까지 인식하게 하는 방법도 있지만, 이는 자유곡선이나 사선에서 문제를 일으킬 수 있습니다.
현재 나래온 산들바람이 취하고 있는 해결책은 Turn함수 실행시 약간 앞으로 가게 한 다음 회전하게 하여 회전반경을 크게 하는 방법입니다. 이는 자유곡선이나 사선, 직선코스 모두에서 어느 정도의 인식률 상승을 기대할 수 있습니다.

이 이외의 방법으로는 확인해 본 적은 없으나, 뫼비우스의 띠(3.0)을 개발하면서 아카데미의 소스를 처음부터 다시 짤 생각이기 때문에 그 때 자세하게 설명하도록 하겠습니다.

- 미션에 대하여 -

Q : 미션은 코드가 워낙 쉬워서 내용을 궁금해 하는 사람은 별로 없을 거라 생각합니다. 그런데 요즘 여러 회사에서 이동하면서 미션을 수행하도록 만드는 함수가 유행이라 하더군요, 이런 건 어떻게 구현하나요?
A : 아카데미에서도 편법을 사용하면 구현할 수 있습니다.(나래온 산들바람에는 개발 일정 문제로 인해 수정되지 않았었습니다. 뫼비우스의 띠 버전에서는 등장할 예정입니다.) 제작법은 다음과 같습니다.
1. 위의 MOTOR_BREAK를 불러오는 부분을 삭제합니다.
2. for문의 틀(for명령과 {}로 이루어진 코드를 둘러싼 틀)을 제거합니다.
3. 밑의 time부분을 제거합니다
4. 선택에 따라 부저나 LED를 켭니다(LED_ON등의 함수로 이루어져 있습니다).
5. Time_Trace를 이용해 time/2만큼 라인트레이싱을 합니다.
6. 위에서 켠 부저나 LED를 끕니다.