[Session 01] 생각으로 자율주행 자동차를 제어한다.
생각으로 자율주행 자동차를 제어한다.
자율주행자동차는 사람이 직접 운전하지 않아도 자동으로 주행할 수 있는 자동차 (self-driving car, autonomous vehicle, driverless car, robo-car)를 의미한다. 카메라로 주위의 환경을 인식하여 목적지를 지정하는 것만으로 자율주행이 가능하며 국방과 산업 현장에서 이미 실용화되고 있다. 최근에는 국내외 여러 연구 팀에서 살아있는 신경세포의 신호를 전달할 수 있는 인공 시냅스 구현 실험에 성공했으며 이것은 인간의 뇌와 기계가 상호작용(Brain Machine Interface)이 가능하다는 점에서 의의를 갖는다.
본 주제에서는 자율주행자동차에 우리의 생각을 추가로 입력하여 조종해보고자 한다. 주변 여건상 생각을 바로 자율주행자동차에 입력할 수 없기 때문에 머릿속의 생각이 전기신호로 만들어져 텍스트로 변환됐다고 가정하고 프로그래밍을 할 것이다.
자율주행자동차는 목적지를 입력하면 스스로 주변을 인지하면서 교통신호에 따라 목적지까지 운행할 수 있다. 사용자가 시간이 촉박하여 빨리 가고 싶거나 주변 경치를 보면서 천천히 가고 싶을 때나 긴박한 상황으로 멈춰야 할 순간에는 반응하지 못한다. 이런 상황에는 사람이 직접 제어해야만 한다.
그림에서 보는 것처럼 자율주행자동차에 전달하는 사람의 생각을 “빨리 가”, “천천히 가”, “멈춰” 세 가지로 한정할 것이며 생각에 따라 움직이도록 하는 자동차 제어 프로그램을 두 가지 방법으로 구현할 것이다. 첫 번째, 인공지능을 활용하지 않고 프로그래머가 직접 규칙을 만들어 적용하는 방법과 두 번째, 인공지능의 머신러닝을 적용하는 방법을 모두 구현해 보고 두 방법의 차이를 알아보고자 한다.
1-1 자율주행자동차 모양 만들기
1) 만들기 메뉴의 작품 만들기를 선택한다.
|
2) 만들기 메뉴의 작품 만들기를 선택한다. |
3) 만들기 메뉴의 작품 만들기를 선택한다.
4) 자율주행자동차가 실행화면에 들어온 것을 확인한다.
|
5) 블록 탭의 오른쪽에 있는 모양 탭을 누르고 모양 추가하기 버튼을 눌러 자율주행자동차를 하나 더 가져온다. 이렇게 세 번을 더 반복하여 모양 탭에 자율주행자동차 5개를 불러온다. 또는 자율주행자동차_1에 마우스를 대고 오른쪽 버튼을 누르면 나타나는 부메뉴 중에서 복제를 선택한다. 이 과정을 4번 반복하여 자율주행자동차 5개를 불러온다. |
6) 달리는 자동차 모양을 만들기 위해 자율주행자동차 모양을 조금씩 변형시킨다. 자율주행자동차_1은 그대로 두고 나머지 오브젝트(자율주행 자동차_2부터 자율주행 자동차_5까지)의 바퀴 모양과 형태를 편집한다.
자율주행자동차_2를 선택하고 그룹 해제 메뉴를 눌러 그림을 편집할 수 있는 상태로 만든다.
|
7) 자율주행자동차의 밑 부분만 선택하 고 그룹해제를 누른다. 이렇게 하면 앞바퀴와 뒷바퀴를 별도로 편집할 수 있다. |
|
8) 자율주행자동차가 달리면서 앞쪽의 턱을 넘어가는 것처럼 보이도록 앞바퀴만 선택하고 위쪽 화살표(▲)를 몇 번 눌러 바퀴를 위쪽으로 올린다. 적당히 올린 후에 저장하기 버튼을 눌러 모양 편집을 완성한다. |
9) 자율주행자동차_3을 선택하고 그룹해제를 하여 7)번 8)번과 같은 방법을 적용한다. 이번에는 뒷바퀴 를 올리고 저장하기 버튼을 눌러 모양 편집을 완성한다.
10) 자율주행자동차_4를 선택하고 그룹해제를 하여 8)번 9)번과 같은 방법을 적용한다. 이번에는 앞바퀴 와 뒷바퀴를 모두 올리고 저장하기 버튼을 눌러 모양 편집을 완성한다.
11) 자율주행자동차_5를 선택하고 선택 그물망으로 자동차 전체를 지정한다.
12) 선택된 자동차의 오른쪽 점을 마우스로 클릭하여 자동차의 폭을 약간 좁게 만든다. 애니메이션에서 보는 것처럼 자동차의 정지하는 모습을 만들기 위한 것으로 폭을 조금만 줄여 놓고 저장하기 버튼을 눌러 모양 편집을 완성한다.
13) 선택된 자동차의 오른쪽 점을 마우스로 클릭하여 자동차의 폭을 약간 좁게 만든다. 애니메이션에서 보는 것처럼 자동차의 정지하는 모습을 만들기 위한 것으로 폭을 조금만 줄여 놓고 저장하기 버튼을 눌러 모양 편집을 완성한다.
자율주행자동차 5개의 모양이 조금씩 다른 것을 볼 수 있다. 1~4번까지는 바퀴의 모양이 다르고 5번은 자동차 폭이 약간 줄어든 것을 알 수 있다. 이 모양을 번갈아 가면서 보여주면 자동차가 달리고 있는 것처럼 보일 수 있다. 실제 프로그래밍에서는 1~4번 모양 변화로 자동차의 속도를 표현하며 정지했을 때의 움직임은 5번과 1번의 모양 변화를 이용한다.
1-2 규칙을 적용하여 프로그래밍 하기
자율주행자동차를 계속 달리게 하는 상태에서 사람의 생각을 추가할 때에는 마우스를 클릭하여 뇌신호가 변환된 텍스트를 입력하도록 한다. 입력할 수 있는 명령어는 “빨리 가”, “천천히 가”, “멈춰” 세 가지 경우이며 이때 동작할 수 있는 프로그램을 만들어 보고자 한다. 아래 그림은 생각으로 움직이는 자율주행자동차 알고리즘 순서도이다.
1) 우선 모양 탭에서 블록 탭으로 전환한다. 시작 범주에 있는 시작하기 버튼을 클릭했을 때를 가져오고 흐름 범주에 있는 세 번째 블록 계속 반복하기를 가져와 시작하기 버튼을 클릭했을 때 밑에 붙인다.
|
2) 탭의 맨 오른쪽에 있는 속성 탭으로 이동한다. 우선 신호 메뉴를 선택하고 신호 추가하기를 누른 뒤 신호 이름으로 “운행하기”를 입력하고 확인 버튼을 누른다. 이 작업은 순서도 처음 단계에 나오는 자동차 운행을 만들기 위한 것으로 자율주행자동차 모양 4개를 적절히 결합하여 자동차가 달리는 것처럼 보이도록 만든다. |
3) 속성 탭의 변수 메뉴를 선택하고 변수 추가하기를 누른 뒤 변수 이름으로 “생각”을 입력하고 확인 버튼을 누른다. 같은 방법으로 변수 추가하기를 하여 “기다림시간” 변수를 하나 더 만들고 변수 속성 기본 값을 0.5로 설정한다. “생각” 변수는 자동차에 지시하는 명령어를 저장하는 공간으로 사용하며 “기다림시간” 변수는 자동차가 빨리 가고 천천히 갈 때 모양이 변환되면서 지연되는 시간으로, 빨리 갈 때는 기다림시간이 짧고 천천히 갈 때는 상대적으로 기다림시간이 길어진다. 프로그램에서 천천히 갈 때는 기다림시간이 0.5초이며 빨리 갈 때는 기다림시간을 0.2초로 설정하였다. |
4) 우선 모양 탭에서 블록 탭으로 전환한다. 시작 범주에 있는 시작하기 버튼을 클릭했을 때를 가져오고 흐름 범주에 있는 세 번째 블록 계속 반복하기를 가져와 시작하기 버튼을 클릭했을 때 밑에 붙인다.
5) 텍스트로 입력된 생각 값에 따라 기다림시간 변수 값을 조정한다.
6) 이전 단계인 5)에서 만든 블록을 단계 4)에서 만든 블록에 끼워 넣는다.
7) 이전 단계인 6)에서 만든 블록전체를 단계 1)에서 만든 블록에 끼워 넣어 프로그램의 주요 구조를 완성한다.
8) 운행하기 신호를 받았을 때 프로그램을 만들기 위해 우선 생김새 범주에서 모양으로 바꾸기 블록을 가져오고 흐름 범주에서는 (2)초 기다리기 블록을 가져와 붙인다.
모양으로 바꾸기 블록에서는 자율주행자동차_1로 선택하며 (2)초 기다리기 블록의 값은 자료 범주에서 기다림시간 값을 드래그하여 넣는다.
9) 같은 방법으로 (자율주행자동차_2)모양으로 바꾸기, (기다림시간)초 기다리기 블록을 붙여 나가는데 자율주행자동차_4까지 반복하여 넣는다. 이렇게 하는 반복 작업이 번거롭다면 블록 복사하기 기능으로 비슷한 유형의 코딩을 쉽게 만들 수 있다. 복사를 원하는 블록의 맨 위에 마우스를 대고 오른쪽 버튼을 누르면 주요 기능이 나타나는데 여기서 코드 복사&붙여넣기를 선택하면 된다.
|
|
10) 마지막 멈추기 신호를 받았을 때 프로그램을 만들기 위해 우선 생김새 범주에서 모양으로 바꾸기 블록을 가져오고 흐름 범주에서는 (2)초 기다리기 블록을 가져와 붙인다.
자율주행자동차 모양을 길이가 짧아진 자율주행 자동차_5로 설정하고 1초 후에 자율주행 자동차_1로 바꾸면 주행 중 브레이크를 밟고 정지한 느낌을 준다.
11) 프로그램 테스트
|
“빨리 가”를 입력하여 자동차의 모양바꾸기 속도가 빨라진 것을 볼 수 있다. |
|
“멈춰”를 입력하였을 때 자동차의 모양이 축소됐다 복원되는 것을 볼 수 있다. |
|
“빨리가”를 입력하였으나 인식하지 못하고 이전 명령어대로 움직이고 있다. 이전 명령어가 “천천히 가”였으면 계속해서 자율주행자동차는 천천히 진행한다. 띄어쓰기를 안하면 인식이 되지 않는다. |
① 명령어의 철자를 틀리거나 띄어쓰기를 잘못하면 인식하지 못하여 오브젝트가 명령어대로 동작하지 않는다.
② 학습한 명령어 보다 길게 또는 더 짧게 쓰면 인식하지 못한다. 예를 들어 “더 빨리 가”, “빨리”, “천천히” 등을 인식하지 못한다.
③ 명령어를 같은 뜻의 다른 표현으로 입력하면 인식하지 못한다. 예를 들어 “정지” 나 “스톱”을 멈춰로 해석하지 못한다.
1-3 머신러닝을 활용하여 프로그래밍 하기
머신러닝을 활용하는 프로그래밍의 첫 번째 단계로 인공지능 범주에서 인공지능 모델 학습하기 버튼을 누른다. 학습할 모델을 분류:텍스트로 선택하고 화면 맨 아래의 학습하기 버튼을 눌러 학습 단계로 들어간다.
2) 새로운 이름을 입력하는 창에 프로그램의 의미에 적합한 이름을 부여한다. 편의상 현재 이름을 “자율주행자동차에 전달하는 생각”으로 입력하고 클래스1의 이름은 “fast”로 정하였다. 클래스1이란 분류 범주를 의미하며 본 주제의 프로그램 분류 범주는 “빨리 가”, “천천히 가”, “멈춰”로 모두 3개이다. 이미 만들어 본 규칙기반 프로그램과 구분하기 위해 클래스 이름을 “fast”, “slow”, “stop”으로 한다.
3) 전 단계와 같은 방법으로 “slow”클래스와 “stop”클래스를 아래와 같이 데이터를 입력하여 구성한다.
|
4) 입력된 데이터를 대상으로 머신러닝 모델을 학습시킨다. 모델 학습하기 버튼을 누르면 모델 학습이 진행되고 데이터의 크기에 따라 처리 시간의 차이가 있을 수 있다. 현재 데이터의 양으로는 바로 결과 단계로 넘어간다. |
|
5) 결과 단계는 학습된 모델을 확인하는 단계로 텍스트를 입력하고 분류 결과를 바로 확인할 수 있다. 빈칸에 텍스트를 쓰고 입력하기 버튼을 누르면 텍스트와 클래스간의 유사도를 확인할 수 있다. “이럼 늦어”를 넣고 테스트한 결과 fast클래스에 가장 높은 확률로 분류된 것을 볼 수 있다. 참고로 “이럼 늦어”는 학습데이터로 사용하지 않았으며 “이러다 늦겠다”는 학습에 사용하였다. |
|
6) 적용하기 버튼을 누르면 엔트리 화면으로 돌아오고 인공지능 범주에 새로운 블록이 추가된 것을 확인할 수 있다. 새로운 블록의 기능은 다음과 같다. |
|
|
▲ “이럼 늦어”를 입력하였을 때 기다림시간이 0.2초로 짧아진 것을 볼 수 있다. |
▲ “제발멈춰”를 입력하였을 때 자동차의 모양이 축소됐다 복원되는 것을 볼 수 있다. |