[NXT] 라인트레이서 03 (Lab view)

심플디 2013.08.05 20:45 조회 수 : 337

004.vi 

005.vi

사실 이 라인 트레이서는 s/w 분야를 Lab view로 짜야 하는 규정이 있었다.

하지만 필자는 c 코딩이 더 편하기 때문에, 알고리즘을 c로 규정시키고 그것을 Lab view로 옮기기로 마음 먹었다 ㅎ

001.png

<그림 1 : 랩뷰 시스템 알아보기>


2012.03.02 PM 4:33

라인트레이서는 센싱으로 인한 if문을 case문으로 바꿔주는게 손쉽다.

하지만 당장은 랩뷰를 잘 모르니, <그림 1>과 같이 센싱<-> 모터 간의 간단한 동작만 실험해보았다.

002.png

<그림 2 : 센싱 값 알아보기>

 

<그림 2>와 같은 코드를 NXT로 돌려본 결과 흰색 구간에서는 멈춰있고, 검정색 구간에서는 바퀴가 돌아갔다.

이것은 흰색 구간에서 false가 됨을 의미하고,  Light Sensor가 검정색 구간에서 센싱 될 때, 리턴 값을 더 크게 갖는다는 것을 의미한다.


<case 1 : 양쪽 다 센싱 되는 경우>은 알고리즘이 상대적으로 복잡하므로 일단 <case 2 : 한쪽만 센싱되는 경우>부터 해결하자.



003.png

 <그림 3 : 첫번째 로직 : 망했음>


첫번째 로직은 보기 좋게 망했다.

그런데 망했으면 이게 왜! 망했는가를 알아야 된다.

뒤늦게 천천히 보니, 딜레이 아이콘의 타이머가 '밀리 초' 단위가 아닌 '초'단위였다.

아무튼 <그림 2>와는 다르게 '동시 센싱'은 아닌 것이 특징이다.

이거 맨땅에서 생각하느라 짱구 많이 굴렸다 ㅠ

이것을~ switch - case 문으로 바꾸면 아래와 같아지겠다.


004.png

<그림 4 : '약간' 바뀐 로직>


그런데 문제가 있는게, 뭐 하나 반복 될 때마다 일정 값을 증가시키고, 그것을 모터출력 값에 증가 시키는 법을 모르겠다......

아무튼 여기까지 하긴 했다.

그리고 그래프 선도를 통해서 센싱과 모터의 관계도 볼 수 있다. 

(Bircx 에서는 볼 수 없던 기능...)


005.png 

<그림 5 : 로직 Viewer>

 

NXT 구동 시에는, 컴퓨터 타깃을 NXT 타깃으로 놓고 돌렸다.

그런데 요로코롬 속도가 빠른것이 절대 아닌데도 일정 구간을 항상 놓친다.

특히 급경사 (v)구간에서 교차로 인식도 못하고, 하는걸 보니, 알고리즘의 문제가 조금 심각한 것 같다.

슈마허의 속도를 갖고 있다고 하더라도 라인 못따라가면 허당이다.

하... 욕심을 줄여서, 속도를 좀 낮춰야겠다.


2012.03.08 pm 03:16 


006.png

<그림 6 : 수정된 로직>


<그림 6>에서 우리는 로직에서 case 문 내에 모터 아이콘을 배치 시킬 수 있음을 볼 수 있다.

이것을 잘 활용하면 어떻게 뭔가가 이루어 지지 않을까?


그러나 후진 딜레이를 800 밀리 세크로 해서, 뒤로 너무 밀려나가는 현상이 일어났다.

여기까지 한 Lab view 파일을 첨부파일에 올렸다. (004.vi)


007.png
<그림 7 : 수정된 로직 (005)>

아. 귀찮아 ㅠㅠ



2012.03.08 pm10:24

대학원 회식을 스피드하게 마치고 다시 랩뷰를 잡는다.

알고리즘은 이미 나와있는데, 그게 랩뷰로 표현이 되지 않으니 미칠것 같다.


어떤 알고리즘이냐고?


1-1의 경우이다.



두개의 센서가 동시에 검정색을 센싱한 경우.

{

만약 기본 불리언 값이 false라면


1. 뒤로 일정 거리 후퇴

2. 좌로 회전하며 좌변수 카운터

3. 뒤로 일정 거리 후퇴

4. 우로 회전하며 우변수 카운터

....(생략)

9. 기본 불리언값을 true로 바꿈


만약 기본 불리언 값이 true라면


1. 뒤로 일정 거리 후퇴

2. 우로 회전하며 우변수 카운터

3. 뒤로 일정 거리 후퇴

4. 좌로 회전하며 좌변수 카운터

....(생략)

9. 기본 불리언값을 false로 바꿈


이 짓을 3번 했다면 그냥 그 구간을 지나감


}


여기서 주목해야 할 점은, 

1. '이 짓을 3번 한 경우'에 3번을 카운터 할 변수(상황 카운터 변수)를 어떻게 설정 할 것인가.

2. 기본 불리언 값은 어떻게 설정 할 것인가.


이다.


전역 변수 개념으로 짜 놓은 알고리즘인데... 전역 변수 개념이 없다.

내가 조금 밖에 몰라서 그런데, Lab view의 하나의 변수는 입력 or 저장의 한가지 기능밖에 안 된다. (컨트롤, 인디케이터 개념)

그리고 하다 못해 변수에 static 선언도 어떻게 하는지 모른다. (함수가 빠져나오면 값이 날아 가잖아ㅠㅠ)


아 진짜 짜증나네.


008.png

 <그림 8 : sub vi 1>


<그림 8>은 선 두개를 밟았을 때의 로직에 직통으로 하나 들어가 있는 서브 Vi 이다.

맨 왼쪽 '?'에  기본 불리언 값을 대입시켜야 되는데 어떻게 하는지 모르고 있는 상황이다.


009.png




 <그림 9 : sub vi 멘붕 시킴>


따라서 그냥 쓸 수도 있는 sub vi 를 깨버렸다.

sub vi 상황을 카운터 하는 '상황 카운터 변수'의 전역 설정도 어떻게 해야 하는지 모르겠다.

지금 문제는 그니까, 전역 변수의 설정이며, 전역 불리안 변수 및 전역 카운터 변수의 자유로운 초기화사용이 가능해야 한다.