본문 바로가기

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

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



- 운영 전반에 대하여 -

Q : line.c와 main.c는 어떤 개념의 파일인가요?

A : 쉬운 개념으로 설명해드리겠습니다.
누군가가 '청소해라'라는 명령을 받았다고 치면 그 '청소'는 '청소'라는 동작 하나가 아니고, 그 안에는 진공청소기로 바닥을 훑고, 이곳 저곳을 걸레로 닦는 등의 동작이
포함되어 있을 것입니다.
그것에 비유한다면 main.c는 '움직여라'라는 대략의 명령을 내리는 곳이고,
line.c는 명령에 대해서 '어떻게' 대응할 것인가에 대한 정보가 들어있습니다.

Q : 그러면 line.c를 수정하면 로봇의 행동 자체를 조작할 수 있는 건가요?
A : 대체로 그렇습니다.
line.c에는 라인트레이서 운영 전반에 대한 내용이 들어있기 때문에, line.c를 조절하면 로봇의 소프트웨어 적인 면까지는 모두 수정할 수 있습니다. 그러나 직접적인 주행부분은 수정하지 못하도록 막아놓았기 때문에, '아직' 깊은 부분의 수정까지는 불가능합니다.


Q : 이 프로그램이 전반적으로 C로 되어있는데, 알아야 할 문법은?
A : 대부분 VB만 하고 넘어오셨을 텐데(다른 언어를 한 번도 안 접해보고 시작하셨다면 앞으로 강의가 진행되는 도중 이해에 어려움이 있을지도 모릅니다), 연산자가 아무래도 가장 헷갈릴 것 같습니다. (실제로 저와 제 주변 사람들이 그랬습니다.)
|| : or
&& : and
== : 같은지 아닌지의 판별(vb에서의 =와 같습니다.)
= : 변수 지정
>>, << : 비트를 밀고 당기는 비트시프트연산(이해가 잘 안 가시겠지만, 사실 이 연산을 사용한 부분을 고쳐서 우리가 원하는 결과를 낼 수 있는 경우도 별로 없습니다. 그러니 그렇다고만 기억해두시면 될 듯 합니다.)
if문의 문법은 : if(조건) {내용;}
문장 하나를 쓴 뒤 끝에 꼭 세미콜론(;)을 달아야 합니다! (VB사용자들 주의)


- 교차로에 대하여 -


Q : 아무래도 라인트레이서를 다루면서 느끼는 게, 가장 많이 부딪치는 문제는 교차로 인식 부분인 것 같습니다. 그 문제의 해결책부터 먼저 설명해주세요.
A : 항상 무엇을 수정하려 할 때는 중심이 되는 변수나 함수를 잘 찾아야 합니다.
대부분의 코드가 트레이서 작동 함수인 Trace에 의해 이루어집니다.
이 Trace를 구성하고 있는 두 뼈대는 CROSS_CHECK 함수와 TURN_CROSS 함수인데, 일단 그들을 찾아가봅시다.
그러면
 모두 끝에 Cross_flag의 값에 따라 이동할지 말지를 결정하는 부분이 달려있다는 것을 볼 수 있습니다.
결국
교차로에 관한 문제의 가장 확실한 해답은 Cross_flag 변수(현재 교차로 형태를 정의하는 변수)의 값을 정의하는 데 있다고 할 수 있습니다.
하지만 교차로 판별 함수로 보이는 CROSS_CHECK 함수 소스를 본다 해도 딱 답이 나오지 않지요.
그런데 이 부분들을 잘 보면 Cross_flag를 살펴보기만 하지 정의하지는 않습니다.
거기서 추론할 수 있는 건 '누군가는 Cross_flag를 정의하는 역할을 할 것이다'라는 것입니다.
그렇다면 소스 전체에서 행위자를 찾아볼 필요가 있습니다.
찾기 메뉴에서 "Cross_flag="라는 검색어로 찾아보면, 저 두 함수 외에 cross라는 함수의 한 부분이 나옵니다. 나머지 부분은 Cross_flag라는 변수를 '읽는' 부분이었다면, cross함수는 다른 데서 값을 읽어 여기에 '쓰는' 부분이므로 이게 중요한게 분명합니다.

그렇다면 이제 결론입니다.
결론 : 교차로 인식 문제는, Cross_flag 변수를 설정하는 cross함수를 수정해 고쳐야 합니다.

Q : cross함수의 구조에 대해서 좀 자세하게 설명해 주실 수 있으신지?
A : 대략적인 구조를 설명해 드리도록 하겠습니다.
1. cross 함수의 임시 변수 K에 우리가 입력한 교차로(cross_type)을 넣습니다.
2. cross 함수에서는 이 센서의 배치형태가 원하는 교차로가 맞을 때(SENSOR_DATA에서 값을 읽어들여 지정된 센서가 흰색을 인식할 때까지 길을 따라가다가 아니면 풀어줌) 3번으로 넘어갑니다.
3. 현재의 교차로 형태를 입력한 교차로로 설정하고 (Cross_flag=cross_type) 끝냅니다.

Q : 그렇다면 이 부분을 어떻게 고쳐야 인식률이 올라가나요?
A : 나래온 산들바람의 경우는, 인식률을 높이기 위해 E와 A와 T교차로를 가리지 않고 교차로가 인식되지 않은 상태(기본값이 250입니다.)에서만 벗어나면 모두 인식하게 하는 형태로 재프로그래밍 했습니다.
그러나 교차로를 보존하고 인식률만 올리고 싶다면 cross함수에서 Cross_flag를 직접 수정하는 방법도 있습니다.
센서 변수의 순서는(TRUE or FALSE의 Boolean값입니다.)
VSL3 VSL2 VSL1 VSC VSR1 VSR2 VSR3의 순서이니, IF문을 활용해서 재편성해 보시면 될 듯 합니다.


다음편은 회전과 미션에 대해서 다루어 보도록 하겠습니다.