원광대학교에서 주최하는 알티노를 통한 자율주행차 코딩 캠프에 참가했다.
알티노란 다양한 코딩 교육을 할 수 있도록 만들어진 자동차다.
이틀 동안 쉴 틈 없이 스크래치를 통해 코딩했는데, 몇 번을 갈아엎고 다시 작성하고 하니
꽤나 부드러운 자율주행 자동차가 완성되었다.
작동 원리는 이러하다.
처음에 start 가 실행이 되면, start에서 알티노의 센서 상태를 관리하고 그에 따라 알맞은 행동을 지시하는 Operate를 계속 호출한다 ( 몇 번의 뒤엎음의 끝에 얻어낸 가장 깔끔한 처리 방법 )
중간의 if (start==1) 부분은 주행 미션을 위해 만들어진 함수이니 자율 주행과는 무관하다.
이렇게 start가 실행이 되고, 계속 Operate를 호출한다.
Operate는 checkfront ( 전방 센서 감지 ) , checkback ( 후방 센서 감지 ), checkFside ( 전방 사이드 센서 감지 ), checkSide ( 사이드 센서 감지 ) 함수를 계속 불러온다.
아래는 checkfront의 내부 코드다.
checkfront 에서는 IR-2 ( 전방 ) 센서의 값을 조회하고, 650보다 크다면 ( 전방 벽면과 근접하다면 ) break를 호출한다.
checkback에서는 IR-6 ( 후방 ) 센서의 값을 조회하고, 후방 벽면과 근접하다면 backbreak를 호출한다.
checkfront에서 호출하는 break와 다른 backbreak를 쓰는 이유는, 단순히 바퀴의 출력을 없애는 것이 아닌 관성을 억제하고 급 정차하는 효과를 내기 위해 달리고 있는 방향의 반대 방향으로 출력을 넣어줌으로 써 차가 미끌림 없이 멈출 수 있도록 설계했기 때문이다.
checkFside에서는 전방 사이드 센서를 확인하는데, 한쪽 센서만 막혀있다면 옆으로 피해 운행하고, 두 쪽이 모두 막혀있다면 break를 호출한다.
checkside에서는 알티노의 옆면 센서를 관리하고, 벽과 비스듬이 달리고 있다면 좀 더 떨어지게 바퀴 방향을 돌리는 역할을 수행한다.
이렇게 Operate 에서는 다양한 센서 감지 함수들을 호출함으로써 알티노의 센서 상태를 관리하고 그에 따른 알맞은 행동을 할 수 있도록 함으로 써 자율주행을 가능케 한다.
그러면, 센서에서 벽과 근접함이 감지되어 break가 호출되면 어떻게 될까?
break에서는 0.1초 동안 달리던 방향의 역방향으로 출력을 넣어 차가 바로 멈출 수 있게 하고, solution을 실행한다.
solution에서는 자율주행을 위해 어디 방향으로 차를 돌려야 장애물을 피할 수 있을지 결정할 수 있는 알고리즘이 들어가 있다.
solution은 벽에 부딪히기 직전 ( break에서 호출되기 때문에 브레이크가 밟혀야만 하는 상황에서 호출된다 )에 호출되기 때문에, 호출되는 순간 IR-1번, IR-3번의 센서 값을 가져오고, 만약 IR-1번이 IR-3번의 센서 값보다 더 크다면, 바퀴를 왼쪽으로 돌리고 후진한다. ( 결국에는 다시 직진하면 장애물의 오른편으로 지나가게 된다 )
위의 문장이 이해가 되지 않을 텐데 좀 더 자세하게 설명하자면 이렇다.
알티노가 주행 중 벽을 만나면 break가 작동되고, 멈춘 뒤 solution이 실행된다.
실행된 solution에서는 IR-1의 값과 IR-3의 값을 비교하고, 어디로 가야 할지 결정하게 된다.
적외선 센서가 물체를 감지하는 방법은 포토 트랜지스터가 IR-LED가 방출한 적외선이 물체에 반사되어
다시 돌아오는 정도를 측정하여 감지하는 것인데. 만약 저런 코너가 있는 구간에서 IR-1에서 방출하는 적외선을
표현해보자면
이렇게 되는데, 옆면의 벽이 없으니 다시 물체에 반사되어 되돌아오지 않고 IR-1의 수치가 낮게 나올 것이다.
반면에 IR-3에서 방출하는 적외선을 표현해보자면
이런 식으로 많은 적외선이 반사되어 IR-3의 수치 값이 높게 나올 것이다.
그러면, 다시 solution으로 돌아와서
if문을 보면 leftf (IR-1)와 rightf (IR-2)의 값을 비교하고 값이 더 작은 곳을 빈 곳이라고 생각하고
후진을 값이 더 큰 곳으로 빼고 직진함으로 결국엔 값이 더 작은 쪽 ( 빈 곳 )으로 자동차가 갈 수 있도록
하고 있다.
이렇게 센서가 감지되면 알맞은 행동을 한 뒤 다시 start를 호출하고.
start에서 Operate를 계속 호출하면서 다시 자동차가 혼자 주행하다가 벽과 근접해지거나 만나는 다양한 상황들에
대해 알맞은 행동을 취할 수 있도록 해준다.
정말로 개발하면서 시간이 가는 줄 몰랐고
이번 활동을 통해 피지컬 프로그래밍에 한 층 더 관심을 가지게 되었다.
다음에도 이런 기회가 있다면 꼭! 참여할 것이다!!
'IT 관련 활동' 카테고리의 다른 글
새 프로젝트 : CoronaVirusMap (0) | 2020.01.29 |
---|---|
OSS 겨울캠프 - Monte Carlo tree search를 배웠다 (0) | 2020.01.13 |
한국코드페어 해커톤 대회 결과 (0) | 2019.11.08 |
해커톤 팀 '슬래시슬립' 진행상황! 2 (0) | 2019.09.26 |
SW빌더스 해커톤 진행 상황 (0) | 2019.09.11 |