지능형 자동차 소프트웨어: Bumblebee-pro
상태바
지능형 자동차 소프트웨어: Bumblebee-pro
  • CCTV뉴스
  • 승인 2010.07.02 00:00
  • 댓글 0
이 기사를 공유합니다

미래를 그렸던 영화나 공상과학 만화에서나 볼 수 있었던 무인자동차들이 현실로 등장하고 있다. CMOS 카메라를 이용하여 영상을 촬영하고 촬영한 영상을 분석하여 주행 시 필요한 차선 및 장애물, 신호 등을 인지하는 영상 처리 능력을 통해 운전자가 따로 필요 없는 무인자동차 구현을 가능케 한다. 본지에서는 지식경제부 주최, 한국정보산업연합회, 임베디드소프트웨어산업협의회, 한국소프트웨어진흥원 주관의 제 7회 임베디드소프트웨어 공모대전 수상자 중에서 지능형 자동차 미션 기록 경기에서 일반부 1등을 차지한 숭실대학교의 Bumblebee팀의 지능형 자동차 소프트웨어인 Bumblebee-pro에 대한 프로젝트를 게재하고자 한다. 

Software 개요

Bumblebee는 영화 '트랜스포머'에서 등장하는 지능형 로봇으로 자동차의 모습을 하고 있다. 영화에서 나오는 지능형 로봇과 같이 프로젝트에서 사용되는 무인자동차도 여러 가지 코스를 정확하고 신속하게 수행할 것이라는 의미이다.

임베디드 SW가 탑재된 무인자동차는 카메라 및 적외선 센서를 이용해서 라인트레이싱, 차단기형 장애물 코스, 주차, S형 벽 코스, S형 라인 코스, 신호등 분기, 언덕 코스를 정확하고 신속하게 수행한다.

자동차 산업은 단순한 소비산업이 아니라 한 나라 산업의 지표이며, 국가 경제에 있어 중추적인 역할을 담당함과 동시에 연관 산업으로의 파급효과가 대단히 큰 산업이다. 또한 최근 세계 최대의 전자제품 전시회인 CES2009에서도 국내 모 자동차 기업이 이례적으로 단독 부스에서 전시회를 가짐으로 인해, 자동차에 대한 인식이 기존의 단순한 기계에서 이제는 복합적인 전자제품으로 변모하고 있다는 사실을 알 수 있다.

이러한 배경적인 상황을 살펴보았을 때, 자동차 산업에 임베디드 소프트웨어에 대한 수요가 앞으로 더욱 증가할 것이라 판단된다. 또한 현재 집중적인 투자가 이루어지고 있는 전기 자동차에 이어, 앞으로는 무인자동차가 큰 인기를 얻을 것이라 예상한다.

1. 창의성 및 차별화 전략
코스와 코스사이의 전환이 발생할 때 최대한 멈추지 않고 부드럽게 다음 코스로 이어질 수 있도록 구현하여 시간 단축을 꾀한다. 각 코스를 통과함에 있어 반드시 사용되어야 하는 장치(카메라, 적외선 센서, 자이로 센서)를 제외한 부수적인 것들의 사용을 최대한 줄여 최대한 정확한 장애물 인식이 가능하도록 구현한다. 또한 최대한 모듈단위로 프로그래밍하여 불필요한 코드의 생성을 최대한 줄이고, Thread 스케줄링을 통해 항상 최적의 연산속도를 보장받도록 한다.

2. Software 구성
CMOS Camera에서 촬영한 영상을 분석하여 차선 인식, 장애물 인식, 신호등 인지 등을 수행하는 영상처리 능력과, 알고리즘에서 명령한 행동을 서보모터를 조절해서 수행하는 자동차 제어, 주행 알고리즘을 구현한다.

영상처리 부분에서 분석한 정보와 가속도 센서, 적외선 센서에서 측정, 탐지한 정보를 이용하여 현재의 주변 환경을 정확하게 인지하고 그에 따라 적절한 행동을 자동차제어 부분에 명령할 수 있다.



개발 목적

미래를 그렸던 영화나 공상과학 만화에서나 볼 수 있었던 무인자동차들이 현실로 등장하고 있다.

아직은 연구단계 수준의 자동차들이라 부족한 부분이 많지만 컴퓨터 기술의 발전을 생각한다면 차량이 스스로 자연스럽게 운행을 하는 모습을 보는 것도 멀지 않은 미래에 가능할 것이다.

컴퓨터 비전 기술과 센서 기술의 발달로 실제 도로의 차선과 주위의 장애물을 인지하고 거리 측정이 가능해졌다. 실시간 처리기술의 발달로 차량의 여러 장치들을 동시에 사용가능하며, 비전기술, 센서기술, 실시간 처리기술들은 운전자의 편리하고 안전한 운전 환경을 제공하고 있다. 이번 작품에서는 비전기술, 센서기술, 실시간 처리기술을 사용해서 운전자가 따로 필요 없는 무인자동차를 구현하는데 목적을 두었다.

세부 내용
무인자동차를 위해 그어진 트레이싱용 라인을 따라 도로의 중앙을 주행한다. 무인자동차를 위해 만들어진 도로에서 도로를 이탈하지 않고 안정적인 주행이 가능하게 한다.

벽으로 구성된 도로의 주행 시에는 도로의 좌/우측이 벽으로 이루어진 도로에서 좌/우측의 벽과 충돌하지 않고 주행한다. 무인 자동차용 도로가 아닌 일반 도로에서 좌측, 또는 우측이 벽, 또는 장애물로 이루어져 있을 때 안정적인 주행을 돕는다.

라인으로 구성된 도로를 주행 할 때는 도로의 좌/우측이 차선으로 이루어진 도로에서 차선을 이탈하지 않고 주행하며, 무인 자동차용 도로가 아닌 일반 도로에서 좌측, 또는 우측이 차선으로 이루어져 있을 때 안정적인 주행이 가능하게 한다.

적절한 사이즈의 주차공간이 있을 때 주차 공간 밖의 물체와 충돌하지 않고 주차하며, 주차공간이 있을 때 다른 물체를 파손하지 않고 수직/수평 주차가 가능하게 한다.

무인자동차가 주행 중 갑자기 예상치 못한 장애물이 있어도 충돌하지 않고 적절한 동작을 수행한다. 무인자동차의 주행 중 발생할 수 있는 갑작스런 돌발 상황에 대처가 가능하도록 하며, 또한 도로에 설치되어 있는 신호등을 인식하고 신호등에 따라 알맞게 동작을 수행할 수 있다. 무인자동차용 도로가 아닌 일반도로에서는 신호등을 인식하고 신호를 준수 가능하게 한다.

도로의 기울기를 인식하고 기울기에 알맞은 힘으로 도로를 주행하며, 무인자동차용 도로가 아닌 일반도로에서 오르막길에서는 강한 힘으로, 내리막길에서는 약한 힘으로 주행하여 평지에서의 주행과 같은 속도로 주행이 가능하게 한다.

Software 내용


          

 모듈구성

영상처리


□ yuv422 format의 특징
위 그림과 같이 휘도(y), 청색성분(cb), 적색성분(cr) 세 가지로 색상을 표현하며, 각 성분별로 배열을 통해 pixel을 표현한다. 각 성분별로 데이터가 수집되기 때문에, 색상을 구분할 때 추출하고자 하는 색상이 주로 배치된 배열만 분석하면 된다.

□ 오픈소스 사용 배제
오픈소스를 사용하게 되면, 프로그램이 무거워지고 불필요한 연산이 많아질 수 있다. 특히 자동차는 고속으로 동작하기 때문에 빠른 영상처리를 통한 제어가 요구된다. 대부분의 오픈소스가 yuv422 format을 지원하지 않아 RGB format으로 변경해야 하며, RGB format으로 변경하는 연산에 많은 time cost가 발생한다.

□ 영상 데이터 format 변환 배제
영상데이터의 format 변환은 time cost가 많이 드는 연산이다. 영상처리 속도가 느려지면 자동차 제어가 느려지기 때문에, 빠른 속도를 낼 수 없다. 따라서 현재 지능형 자동차에서 제공하는 데이터 format을 그대로 사용한다.

□ 영상데이터의 상단부분 배제
경기장이 흰색 외벽으로 둘러싸여 있다고는 하지만 자동차의 위치에 따라(특히 언덕 구간에서 문제가 발생할 가능성이 큼) 영상데이터의 상단부분에 불필요한 데이터가 촬영될 가능성이 있다.
따라서 상단 부분(약 50pixel 가량)을 영상처리 시 제외시킴으로써 정확도 높은 영상데이터 추출이 가능하고, 이진화와 같은 연산에 소요되는 시간도 단축시킬 수 있다.

자동차 제어



□ 거리 측정
위와 같은 방법으로 삼각측량법에 의해 거리를 산출한다. LED의 출력광은 발광 렌즈를 통하여 반사물(타깃)에 투광. 반사물에 빛을 조사하면 반사광의 일부가 수광 렌즈에 입사하고 수광소자 상에 조사한다.

대상물체의 위치에 따라 센서와의 거리가 달라지고, 반사되는 빛이 들어오는 각도가 달라진다. PSD의 수광부에는 수광렌즈와 CCD와 비슷한 역할을 하는 수광판이 내장되어 있어서 각도를 측정할 수 있다.

이 각도를 통해서 적외선을 반사시킨 물체와의 거리를 유추한다. Vcc 5V를 인가하고 GND를 연결하면 LED Driver를 통해 IRED가 발광하고 PSD에서 수광한 뒤 증폭회로를 거쳐 Output회로를 통해 Vo에서 거리에 따른 전압이 출력된다.

사용되는 센서는 4~30cm 범위에서 거리에 따라 0~3V정도로 스윙하는 출력을 반환한다. ADC로 Vout을 읽어 들여 데이터시트에서 제공하는 데이터를 참고하여 ADC 값을 거리로 환산한다.



□ 속도 제어
차량의 구동력을 얻기 위해 서보모터를 이용한다. DC서보모터의 회전속도를 바꾸기 위해서는 일반적으로 전기자에 인가하는 전압을 변화 시키는 방법을 사용한다.


전기자 전압은 회전속도와 거의 비례 관계이며, 전압을 내리면 어느 정도 속도 저하가 가능하다.

영구자석 N, S에 의해 자계(F)가 형성되고, 브러시와 정류자를 통한 전류(I)가 도체 내를 흐르면 플레밍의 왼손 법칙에 따라, 그림에서는 화살표 방향으로 토크(T)가 발생한다. 회전자가 회전하여 약 90° 회전하면 정류자에 의해 전류방향이 뒤바뀌어 회전을 계속할 수 있다.


□ 위치 제어

위치 제어라는 것은 원하는 위치 즉, 서보 모터를 회전시켜 원하는 회전각을 얻어내는 것을 의미한다. 서보 모터를 일정한 속도로 회전시키고 또 정지시키면 회전속도를 시간 축으로 적분한 것이 위치의 변화가 되며 반대로 속도라는 것은 단위시간 동안 위치의 변화를 의미한다.

서보 모터의 제어구조에서도 위치의 변화를 검출하기 위하여 회전속도를 시간 축으로 적분하는 방법, 혹은 속도를 구하기 위하여 단위시간 동안 위치의 변화를 구하는 방법을 사용한다. (그림 9)에서 X축을 시간 축으로 하고 Y축을 속도 축으로 하면 색칠한 부분이 이동거리이다.



□ 방향 제어

서보모터는 컨트롤러나 수신기로부터의 목표 각도 위치 지령을 받아 동작을 개시한다. 서보모터에 사용되는 DC모터에 움직이는 각도를 지령하는 것만으로는 해결되지 않으므로 움직이려는 각도에 비례하여 전압을 걸게 된다.

약간만 움직이면 될 때는 낮은 전압을 걸어 천천히 회전시키고 많은 동작이 필요하면 높은 전압으로 빨리 회전시킨다. 서보모터 내부에서는 모터로부터 감속기어를 통하여 움직이는 새로운 위치정보를 얻고, 이미 받고 있는 지령위치와 비교하여 모터에 전압을 거는 동작을 반복한다.

코스별 기능

쪾코스: 도로주행 S자 코스
쪾모듈: 라인감지처리

코스의 특징 및 문제점

커브길 주행 시 무인자동차 속도가 빠를 경우 조향을 하기 전에 경로를 이탈할 수 있다. 센서값을 통해 커브길 주행 시 무인자동차의 속도를 줄인다. 경로를 이탈했을 경우라도 이전 조향값을 이용하여 라인을 감지할 때까지 무인자동차를 주행시킨다.

커브길 진입 시 사용한 조향값을 커브길을 빠져나올 때 사용하면 주행 라인을 이탈할 수 있다. 진입할 때와 빠져나올 때의 조향값을 다르게 설정하여 경로 이탈을 예방한다.

무인자동차가 직선 코스에서 일직선으로 달리는 것은 아니다. 일직선에 가까운 조향값을 직진 코스에서 테스트하여 찾는다.  직선 코스에서 조향값이 너무 크게 조절할 경우 라인을 벗어날 수 있기 때문에 미세한 조향값을 이용하여 직선 코스를 통과한다.

라인감지용 적외선 센서 표현



라인감지용 적외선 센서 7개를 도로 주행 시 라인이 중앙에 왔을 경우를 나타내는 값이다. 무인자동차가 왼쪽으로 치우칠 경우R1_SENSOR,
R2_SENSOR, R3_SENSOR값을 이용한다. 

오른쪽으로 치우칠 경우 L1_SENSOR, L2_ SENSOR, L3_SENSOR를 이용한다. 만약 주행 라인에 두 센서값이 감지된 경우에는
ML1_SENSOR와 같이 표현한다.

주행 방향 파악  


무인자동차가 도로 라인을 따라 주행할 때는 적외선 라인 센서 7개를 이용하여 방향을 파악한다. 방향을 파악할 때는 기본적으로 식 1과 같은 방식으로 이루어진다. 읽은 센서값이 M_SENSOR이면 조향 모터 값을 중앙을 가리키는 1500으로 설정한다. 만약 M_SENSOR가 아니라면 그 다음 센서 ML1_SENSOR 값인지 확인한다. 읽은 센서 값을 모두 확인했다면, 다시 센서값을 읽어 다음 조향 모터 값을 설정하게 된다.


조향 값 예측
주행 방향을 파악한 후, 조향 값을 예측하기 위해 조향 모터 값 설정 전에 현재 읽은 센서 값과 이전에 읽은 센서 값의 차이를 비교하여 조향 값을 설정하게 된다. 계산을 쉽게 하기 위해 센서 값을 정수 값으로 다음 표와 같이 치환한다.


이전 센서 값이 M_SENSOR, 현재 센서 값이 ML1_ SEN SOR라면 두 센서 값의 차이는 -1이며 현재 센서 값에서 -1값을 이용하여 조향 모터 값을 설정한다. 두 센서의 차이 값이 크면 조향을 더 많이 한다.

·코스: 도로주행 S자 코스
·모듈: 커브길주행


무인자동차가 곡선 코스에 진입하면 속도를 줄여서 라인을 벗어나지 않도록 한다. 라인 감지용 적외선 센서가 모두 감지가 안 되어 라인을 벗어날 경우에는 벗어나기 전에 설정한 조향 값을 이용하여 라인을 찾을 때까지 조향을 계속한다.

·코스: 도로주행 S자 코스
·모듈: 속도조절


무인자동차의 라인감지용 적외선 센서 7개 중에서 가운데 센서 값이 많이 감지된 경우에는 L-Motor 속도를 올린다. 센서 값이 왼쪽이나 오른쪽으로 치우치게 될 경우에는 L-Motor 속도를 줄인다.

·코스: 우선정지 장애물
·모듈: 코스의 특징

코스의 특징 및 문제점
우선정지 장애물은 도로상에 임의의 장소에서 출현 가능하다. 카메라를 이용한 영상처리를 경기장 주행 시작부터 끝까지 계속 수행해야 한다. 자동차가 고속으로 주행하는 도로주행에서 장애물이 주로 출현한다. 신속 정확하게 처리해 주지 못할 경우 실격으로 이어질 수 있다.

원거리에서 장애물이 인식되면 감속하고 근거리에서 장애물이 인식되면 정지하도록 하여, 신속성과 정확성을 높인다. 우선정지 장애물의 위치가 높아 장애물과 자동차 사이의 거리를 거리감지 센서로 측정할 수 없다. 입력된 영상데이터를 이용하여 자동차와 장애물 사이의 거리를 측정한다.

·코스: 우선정지 장애물
·모듈: 영상처리

자동차에서 바라본 우선정지 장애물
위의 그림과 같이 CMOS 카메라를 이용하여 장애물을 촬영한다. 장애물과 자동차 사이의 거리에 따라 입력되는 영상 데이터에 차이점이 발생한다.


 

위의 그림과 같이 원거리 기준점 혹은 근거리 기준점에서 영상 데이터를 샘플링하여 거리를 측정할 수 있다. 주의할 사항은 원거리에서 장애물을 인식한 이후 감속을 수행하여 근거리 영상이 거리 기준점 이하로 내려가지 않도록 하여야 장애물에 부딪히지 않는다. 이때, 최적의 성능을 위해 yuv422 format의 적색성분(cr)만 분석하여 장애물의 존재 여부를 확인한다.

색채 샘플링 기법을 채택한 이유
정점 샘플링이나 field effect, 유사도법 등과 같은 기법들은 이미지를 픽셀 단위로 비교하기 때문에 시간이 많이 드는 작업이다. 더욱이 고속으로 주행중인 자동차가 시간이 많이 드는 연산을 수행하게 되면 그 시간동안 장애물에 충돌할 가능성이 있다. 경기장의 대부분이 검정색 라인과 흰색 바닥으로 이루어져 있고 외벽 역시 흰색으로 둘러싸져 있으므로, 색채 샘플링만으로도 빨간색 우선정지 표지판을 충분히 인식 가능하다. yuv422 format의 적색성분(cr)영역만 검사하면 되므로 쉽고 빠르게 처리가 가능하다.

우선정지 장애물 통과 순서도


·코스: 주차코스(수직, 수평주차)
·모듈: 코스의 특징


코스의 특징 및 문제점
주차 코스는 도로 주행 구간 중 임의의 장소에서 출현 가능하다. 도로 주행 시 항시 적외선 센서를 이용하여 주차장이 있는지 확인하고, 주차 알고리즘에 따라 주차를 수행한다. 주차 코스를 인식하지 못하고 지나치거나 장애물에 부딪칠 경우 실격으로 이어질 수 있다. 주차 코스의 첫 번째 장애물이 발견될 시 속도를 감속하고 주차 코스로 진입하는 위치까지 안전하게 주행한다. 주차를 실시할 때 주변 장애물과 충돌, 또는 바퀴 중 하나라도 주차장 주차선을 벗어나거나 걸쳐서 주차를 완료할 경우 감점의 요인이 된다. 최대한 빠른 시간 내에 주차를 실시하되, 주차의 정확성에 더욱 중점을 두고 코스를 수행한다. 센서의 부정확한 값에 의해 거리가 잘못 측정되어 차량이 장애물에 부딪치거나 잘못된 위치에서 정지할 수 있다. 센서를 한 번에 수회 읽어 가장 큰 값과 작은 값을 제거한 절사평균을 이용한다.

·코스: 주차코스(수직, 수평주차)
·모듈: 적외선 센서(거리감지)

조향 장치가 차량 앞부분에 있기 때문에 이동 시 회전 각도를 크게 함으로써, 주차 공간이 충분히 확보되지 않았더라도 비교적 여유롭게 수행할 수 있는 후방 주차 방법을 사용한다. 조향 장치의 최대 유효 회전 각도와 회전 반경을 감안해 적외선 신호 처리부로부터 받은 주차장 진입로의 정보를 이용하여 결정한다.

수직주차

수평주차



·코스: 곡선주행코스(S형 벽)
·모듈: 코스의 특징

코스의 특징 및 문제점
코스를 수행도중 벽에 차량이 닿을 경우 감점의 요인이 된다. 거리감지 센서를 이용하여 차량과 벽의 간격을 일정하게 유지하도록 조향모터를 조절한다. 거리감지 센서가 차량의 우측 측면에 있기 때문에 우회전시 벽과의 거리를 측정할 수 없다. 조향모터의 최대 우회전 값을 설정하여 우회전을 시도한다. 다시 벽이 감지되면 벽과 간격을 일정하게 유지하도록 조향모터를 조절한다.

·코스: 곡선주행코스(S형 벽)
·모듈: 적외선센서(거리감지)

거리 측정
거리의 역수를 가로축으로 하고, 출력전압을 세로축으로 하여 재기록하면 직선적으로 변화하는 특성을 이용하여 반사물까지의 거리를 측정한다. 측정 거리는 광학계의 설계에 의존한다.

조향모터 값 = 센서 값 * 비율



·코스: 곡선주행코스(S형 라인)
·모듈: 코스의 특징



코스의 특징 및 문제점
영상처리만을 이용해 S자 코스를 통과해야 한다. 실제 코스의 각도와 자동차의 카메라를 통해 인식한 영상에는 상당한 차이점이 존재하기 때문에 실제 S자 코스의 코너각을 읽는 것은 매우 어려운 작업이다. 자동차의 CMOS 카메라의 경우, 초당 프레임 수가 적기 때문에 위의 그림과 같이 기울이 인식을 위해 세가지 기준점을 두고 계산을 한다. 자동차에서 가까운 기준점에서 기울기를 인식할수록 더 큰각으로 조향하도록 하여 적은 프레임수를 보완할 수 있도록 한다.

코너각 인식의 어려움


위의 그림과 같이 실제 코스와 카메라로 인식한 코스간에는 상당한 차이가 존재한다. 두 차선의 중앙에서 좌우를 바라볼 때 포지티브에지(posi tive edget)와 네거티브에지(negative edge)를 갖는 것을 알 수 있으며, 이 특성은 차선 전체에 걸쳐 연속적으로 나타난다. 즉, 소실점이 가까우면 차선폭이 줄어들고 소실점에서 멀어지고 차량과 가까우면 점점 늘어나는 것을 알 수 있다. 이와 같은 특성을 이용하여 CMOS Camera에서 얻은 영상의 일부분을 스캔영역으로 지정하여 라인 스캔 방식으로 차선 경로를 탐색한다.

·코스: 곡선주행코스(S형 라인)
·모듈: 영상처리

이진화를 통한 선명한 영상데이터 추출
흰색 바닥과 두 개의 검은색 라인으로 이루어 진 코스를 좀 더 선명하게 인식하기 위해 이진화를 수행한다. 특히 pixel단위로 영상데이터가 구분되기 때문에 곡선과 같은 경우 그 경계를 분간하기가 힘들다. 따라서 이를 이진화한 영상데이터를 이용하여 좀 더 정확하게 인식할 수 있다.


위 사진은 이진화 전과 이진화 후의 영상데이터간의 차이를 명확히 보여준다. 이미지 상단은 사용하지 않는 부분으로 이진화하지 않고 둠으로써 연산 시간을 절약할 수 있다.

라인 인식
라인인식을 위한 탐색방법에는 수평스캔과 수직스캔이 있으며 수직스캔은 스캔 영역의 아래에서 위로 탐색하는 것을 말하며, 수평스캔은 스캔 영역의 가운데를 중심으로 좌측 영역과 우측 영역을 탐색하는 것을 의미한다. Bumblebee에서는 수평 및 수직스캔 모두를 조합하여 사용한다. 하지만 수평스캔에 더 큰 비중을 두고 계산을 한다.

·코스: 곡선주행코스(S형 라인)
·모듈: 알고리즘


영상처리 연산능력 향상을 위한 Thread 관리
카메라를 이용한 영상데이터 캡쳐 작업은 매우 많은 시간을 소모한다. 게다가 라인트레이싱용 Thread와 영상처리 Thread가 번갈아 가며 Scheduling됨에 따라 전체적인 영상처리 성능이 저하된다. 따라서 S자 코스 진입 시(라인트레이싱용 라인이 적외선 센서에 감지되지 않을 경우 S자 코스 진입이라고 인식) 라인트레이싱용 Thread를 임의로 강제 종료 시켜 영상처리를 위한 Thread만을 남겨놓게 한다. 이를 통해 영상처리에 있어 최적의 성능이 보장되도록 하였다.

S자 코스 진입시 알고리즘



다음 그림과 같이 S자 코스에 진입하여 첫 영상데이터를 언제 추출하느냐에 따라 조향각이 달라져야 한다. 이는 카메라의 성능에 매우 의존적이며 초당 프레임 수가 많을수록 고려대상에서 제외된다. 지능형 자동차에 부착된 CMOS 자동차의 경우 초당 프레임 수가 부족하여 첫 영상데이터가 어느 시점에 추출되는지는 S자 코스를 통과하기 위해 매우 중요한 사안이며, 수많은 테스트를 통해 자동차의 속도와 첫 영상데이터가 입력되는 순간의 관계를 파악하여야 한다. 최악의 경우 자동차의 속도를 줄여서라도 안정적인 코스통과가 가능하도록 하여야 한다. 뿐만 아니라 특정 속도에서 S자 코스 진입 시 첫 영상데이터 추출의 상한 및 하한위치를 예측하고 이를 충분히 커버할 수 있도록 알고리즘을 구성하여야 한다.

상황 1은 영상데이터의 입력이 조기에 이루어진 상황이고, 조향각을 조금만 틀어 앞으로 있을 커브에 대비하기만 하면 된다. 반면 상황 2의 경우 상황 1보다 늦게 첫 번째 영상이 입력된 경우이고, 좀 더 큰 각으로 조향각을 돌려야만 코스에서 이탈하지 않고 통과할 수 있다.

 S자 코스 통과 알고리즘


위에서 본 바와 같이, 실제 코스와 카메라로 촬영한 영상데이터 간에는 차이가 있다. 실제 S자 코스는 두 선으로 구성되어 있지만 카메라를 통해 바라본 코스는 대부분 하나의 선만으로 구성되어 있다. S자 코스를 통과하기 위해 가장 중요한 A와 B지점에서 입력된 영상데이터는 위의 그림과 같으며, 사람의 눈을 통해 인식되는 영상데이터와는 다소 차이가 있다.  이들의 접선 기울기를 측정하여 조향모터를 조절하면 코스를 안전하게 통과할 수 있다. A, B 두 지점에서 촬영한 사진에서 본 것과 같이, 실제 라인은 두껍기 때문에(2.5Cm) 검은 라인의 중간점을 기준으로 하여 기울기를 구한다.

조향값 계산 알고리즘
입력된 영상데이터의 검은선 기울기에 따라 조향 모터값이 달리지게 된다. 자동차의 조향 모터값은 서보모터의 회전이 직선운동으로 바뀌어 앞바퀴에 전달됨으로써 이루어진다. 서보모터는 동작범위는 360°이고 지능형 자동차는 이를 3600으로 나눈 값을 이용하여 앞바퀴 조향제어를 수행한다. 즉, 조향 모터값이 10 차이 날 때마다 조향제어는 1°씩 된다고 할 수 있다.

물론 이는 원운동이 직선운동으로 바뀌기 전에 적용되어야 맞는 말이지만, 원운동과 직선운동의 상관관계를 구하기가 어려워 거의 동일하다고 판단하고 계산하였고, 이 근사값을 이용하여 여러번의 테스트를 거쳐 보정을 하여 더욱 실질적인 값을 얻도록 하였다.

기울기 1은 45°를 나타내므로 기울기 1당 1/45°씩 조향되도록 해야 한다. 또한, 기울기가 음수이면 왼쪽, 양수이면 오른쪽으로 방향을 돌리도록 설정한다.
따라서,



이 된다. 여기에서 α는 실제 라인과 영상데이터 사이의 오차, 조향모터의 오차범위 등 여러 가지 사항이 포함되어 있다. 따라서 많은 테스트를 통해 실제와 가장 근사한 값을 도출해 내어야 한다.

S자 코스 이탈 알고리즘
S자 코스에서 빠져나올 때에는 자동차 하단의 라인 트레이싱용 센서를 수시로 체크하여, 라인이 인식되면 라인트레이싱용 Thread를 다시 살려 영상처리를 통한 주행을 종료시킨다.

·코스: 갈림길 주행
·모듈: 코스의 특징


코스의 특징 및 문제점
정지해야 할 위치에 라인의 끝이 T자 형태로 구성되어 있다. 라인트레이싱용 적외선 센서를 이용하여, 신호등 코스의 위치를 인식할 수 있다.
신호등과 충돌 시 실격된다. 신호등과 충돌한다는 문제점이 있지만 영상처리가 아닌 라인트레이싱용 적외선 센서를 이용하기 때문에 빠른 대응이 가능하다. 따라서 크게 고려하지 않아도 될 내용이다. 적색 혹은 청색 신호를 인식하고 갈림길에서 길을 선택하여 주행하여야 한다. 라인트레이싱용 적외선 센서를 이용하여 정지 후, 영상처리를 하여 갈림길을 선택가능하다.

·코스: 갈림길 주행
·모듈: 자동차 제어


신호등 앞 정지


라인트레이싱 적외선 센서를 이용하여 주행 중, 라인트레이싱 센서가 모두 적용되는 순간 정지한다. 이후 영상처리를 통해 갈림길을 선택하여 주행한다.

·코스: 갈림길 주행
·모듈: 영상처리


색상 구분
청색을 표현하는 배열(CB) 혹은 적색을 표현하는 배열(CR)을 조사하여 색상을 구분한다. 이때 두 개의 배열 모두를 분석하여 적색 혹은 청색이 인식되면 이에 맞게 갈림길을 선택하고 주행을 시작한다. 하나의 배열 (CB 혹은 CR)만 분석하여 영상처리의 연산을 줄일 수 있지만, 이렇게 프로그래밍 되면 신호등의 신호가 늦게 나타날 때 잘못된 판단을 할 수 있다.

·코스: 언덕구간
·모듈: 코스의 특징

특징 및 문제점
언덕 구간의 위치는 미리 정해져 있지 않기 때문에 항상 기울기를 감지해야 한다. 3축 가속 센서의 z값의 정밀도가 많이 떨어지고, 도로 주행 중에 z값을 읽을 경우에도 언덕구간의 기울기 값보다 크게 나온다. 부정확한 z값을 이용하여 언덕구간을 감지해야 하기 때문에 여러번 z값을 읽어 평균을 구하고, 이 값이 언덕 구간인지 확인한다. 오르막, 내리막길에서 라인감지용 적외선 센서 값이 모두 감지되거나 이상하게 감지되는 경우가 발생한다. 오르막, 내리막길에서 라인감지용 적외선 센서 값이 모두 감지된 경우와 이상하게 감지된 경우는 무시한다. 무인 자동차가 급제동, 급출발할 때 z값의 정밀도가 많이 떨어진다. 급제동, 급출발 시 일정 카운트만큼 z값을 무시한다.

·코스: 언덕구간
·모듈: 기울기 감지

기울기 파악

3축 가속 센서를 이용해서 z값을 읽는다. z값이 일정 기울기 값을 넘는 경우에 언덕 구간으로 인식한다. 하지만 z값의 오차가 크기 때문에 값을 보정해야 한다. 값을 보정하기 위해 z값 7개를 읽어 quick sort를 이용하여 값을 정렬한다. 정렬한 값에서 절사평균을 이용하여 z값을 구한다. 마지막으로 z값의 오차를 더 줄이기 위해 z값이 일정 기울기 값을 넘는 경우가 순차적으로 여러 번 나온 경우를 언덕 구간으로 파악한다.

급출발, 급제동 무시
급출발, 급제동 시 3축 가속 센서 값의 오차가 심하게 발생한다. 이를 해결하기 위해 3축 가속 센서 값을 급출발, 급제동이 발생할 경우, 센서값을 일정 카운트가 지난 후에 읽도록 한다.


프로그램 사용법(Interface)



프로그램 설명

전체 구성도



주요 함수의 흐름도
 



글: Bumblebee팀(김봉찬 외 3명)






댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글 0
0 / 400
댓글쓰기
계정을 선택하시면 로그인·계정인증을 통해
댓글을 남기실 수 있습니다.