12장: Build simulation environment based on 3D
이번 단계에서는 색깔인식센서를 이용하여 사용자의 선택에 따라 해당하는 상자를 확인하여 액션을 취하는 로봇을
만들어 볼 것이다.
이번에 만들게 될 로봇은 먼저 T자형의 라인 위에 있는 물체 중 사용자가 지정한 색깔의 물체를 찾아올 수 있도록 해야 한다.
이를 위해서는 먼저 로봇이 바닥의 라인을 보고 그 라인을 따라 움직일 수 있도록 해야 한다. 그리고 물체 앞에 다다랐을 때 그
물체가 어느 색인지 판별할 수 있어야 한다.
먼저 가장 기본적인, 우리가 테스트를 하고자 하는 환경을 먼저
구성해 보자. 제일 먼저 T자형의 라인을 바닥에 만들고, 그 위에 빨간색, 파란색 상자를 올려 놓으면 될 것이다. T자형 라인은
검은 색으로 만들 것이고, 라인을 로봇이 구별하기 쉽도록 기본 바닥을 흰색으로 만들 것이다. 비교적 쉬운 작업이므로 각자 만들어
보도록 하자. 여기서는 바닥의 크기를 5.5 × 5.5로 하였으며, 두께는 0.05이다. 또한 로봇의 움직임으로 인해 바닥이
움직여서는 곤란하므로 정지된 객체로 만들었다.
[그림 1] 바닥 만들기 SPL
[그림 2] 완성된 기본 바닥
그리고 여기에 이동이 가능하도록 새로운 엔터티로 T자의 왼편과 오른편에 각각 빨간 박스와 파란 박스를 추가해
준다. 그리고 마지막으로 T자의 아래 부분에 우리가 만들 로봇을 추가해 준다.
[그림 3] 상자 추가하기
[그림 4] 완성된 기본 환경
이제 로봇이 아래의 검은 선을 판별하여 따라갈 수 있도록 아래를 바라보는 색깔인식센서를 추가할 것이다. 색깔인식센서는
AddColorSensorEntity를 이용하여 추가하며, 아래를 바라보도록 하기 위해서 Orientation을 아래로 90도
추가한다. 그리고 로봇이 앞으로 가거나 정지하는데 쉽도록 프로시져를 추가한다. 이 프로시져들은 VPL에서 로봇을 쉽게 조종할 수
있도록 도와줄 것이다.
[그림 5] 색깔인식센서와 프로시져를 추가한
스크립트
[그림 6] 색깔인식센서가 추가된 base1
위 그림에서 초록색 점(base1앞에 있는)으로 보이는 것이 색깔인식센서이다. 그리고 왼쪽에 작게 그려진 창은 현재
색깔인식센서가 보고 있는 화면, 즉 센서가 인식하고 있는 색깔을 보여준다. 저 창은 show (sensor) in
separate window라는 메뉴를 선택하여 볼 수 있다.
[그림 7] 분리된 창으로 센서가 인식하는 값
확인하기
이제 색깔인식센서의 값도 확인할 수 있고, 프로시져를 ‘call’ 로 사용함으로써 프로시져 역시 정상적으로 작동하는 것을 확인할
수 있었다. 이제 라인트레이서를 만들기 위해 색깔인식센서를 왼쪽과 오른쪽에 하나씩 2개를 사용할 것이다. 2개를 추가하는 건
간단하다. 그냥 2개의 엔터티를 만들면 된다.
그리고 라인트레이서를 구현하기 위해서 앞으로는 VPL과 병행하여 진행하게 될 것이다. 먼저 지금까지 만들어
둔 스크립트 파일을 적당한 이름으로 저장한다. 여기서는 Week_13.txt라는 이름으로 저장하였다.
그 다음 각 센서의 값을 저장하기 위해 double형 변수 두 개를 추가한다. 앞에서처럼 data 블록 2개와 variables
블록 2개를 만든 뒤 … 을 눌러 변수를 추가하자. 그리고 초기값으로 각각 3.0을 세팅해준다. 그리고 스크립트를 VPL에서
사용할 수 있도록 SPLEngine 서비스를 추가하여 data블록에 string형 데이터로 “script/(해당 위치의 파일
이름)”를 ExecuteScriptFile로 연결하여 실행한다. 마지막으로 스크립트에 있는 색깔인식센서를 VPL에서도 이용할 수
있도록 SPLSensorColor를 추가한 뒤 스크립트에 지정해 두었던 센서 이름을 SPLSensorColor에
ColorSubscribe로 연결해 준다. 그러면 이제 해당 센서 정보를 VPL에서도 이용할 수 있게 된다.
[그림 8] 위의 과정을 모두 진행한 다이얼로그
이제 라인트레이서의 규칙을 정하도록 한다. 여기서는 기초적인 규칙을 적용해 보도록 하겠다. 먼저 왼쪽 센서가 선을 감지했을 때는
로봇이 오른쪽으로 기울어졌다는 의미이므로 로봇을 왼쪽으로 회전시킨다. 마찬가지로 오른쪽 센서가 선을 감지했을 때는 오른쪽으로
회전시킨다. 양 쪽 센서가 모두 선을 감지했을 경우(주로 갈림길의 경우), 오른쪽을 먼저 확인하도록 하였다. 그리고 양쪽 센서에
아무것도 감지되지 않았을 때는 앞으로 전진하도록 하였다. 로봇이 출발할 때 이미 두 개의 센서 사이에 선이 있다고 가정하였다.
[그림 9] 센서로부터의 값을 해당하는 변수에
저장
[그림 10] 저장한 변수값을 이용하여 로봇이
판단 가능하게 함
간혹 테스트 중에 색깔인식센서가 정상적으로 작동하지 않는 경우가 있으니 separated window를
이용하여 센서가 정상적으로 작동하고 있는지 확인하고 테스트를 시작하도록 한다.
여기서 값을 1.0으로 사용한 이유는 해당 바닥의 색이 흰색(0)인지 아닌지 만을 판별하면 되기 때문이다. 여기서 변수를 좀더
다양화하여 각 센서의 색의 합이 아닌 각 색에 대한 값을 각각의 변수에 저장할 경우 좀 더 다양한 색을 판별할 수 있을 것이다.
예를 들어 SensorData.NormalizedAverageRed 값, 즉 빨간 색 값이 다른 색 값보다 유달리 높을 때(이
부분은 적당한 테스트를 통해 결정해야 할 것이다) 해당하는 색을 빨간 색이라고 판단할 수 있을 것이다. 이를 이용하여 이제
빨간색과 파란색을 구별해 보도록 하자. 이를 위해 스크립트 파일로 돌아가 로봇에 새로운 색깔인식센서를 추가해 보자.
[그림 11] 새로운 색깔 인식 센서
기존에 있던 센서들과 구별하기 쉽도록 Dimensions 옵션을 주어 크기를 늘렸다. 이제 실행하면 다음과
같은 모습의 로봇을 볼 수 있을 것이다. 그리고 원활한 테스트를 위해 상자들의 크기를 늘렸다.
이제 색깔감지센서가 어떤 값을 읽어 들이는지 확인해 볼 차례다. 스크립트 에디터에서 문자열 표시
엔터티(AddTextSpriteEntity)를 추가해 보자.
[그림 12]
AddTextSpriteEntity
그리고 FlushScript 아래에 sprite1.SetText(“Hello”)를 넣어준다. 그리고
시뮬레이션을 실행하면 다음과 같은 창을 볼 수 있을 것이다.
[그림 13] 텍스트를 출력하는 시뮬레이션 환경
이제 Calculate 블록을 만들어서 "sprite1.SetText(\"Blue: " +
state.color3_blue +
"Red : " + state.color3_red + "Green : " + state.color3_green + "\")"와
같이 써보자. 여기서 “ 대신 \” 를 쓴 이유는 VPL이 출력하는데 필요한 “ 인지 문자열을 끝내는 “ 인지를 구별할 수
있도록 사용한 것이다. 그리고 Calculate 블록에서 + 연산자를 사용함으로써 다수의 문자열을 붙여 하나의 문자열로 만들 수
있다.
[그림 14] 변수에 저장된 값을 시뮬레이션
환경에 프린트하기
[그림 15] 화면에 출력되는 변수들
이렇게 하여 로봇이 현재 하고 있는 일을 리스트박스 등이 아닌 시뮬레이션 환경 그 자체에서 확인할 수
있었다. 이를 통해 디버그, 로봇의 조정 등을 좀더 간편하게 할 수 있게 되었다.