8장: Principle of sensor for intelligence robot
이제 앞의 단계에서 SPL과 MSRDS에 대한 기본적인 지식, 그리고 그것들의 활용 방법을 모두 익힐 수
있었다. 이번 장에서는 SPL에서 기본으로 제공하는 여러 가지 서비스 중 하나인 MazeBuilder를 이용하여 VPL상에
미로를 만들어 보고, 만든 미로를 해결할 수 있는 로봇을 만들어 보게 된다.
먼저 MazeBuilder는 탐사 로봇과 타이머 등이 포함된 MazeExplorer와 다르게 오직 미로를
만들고 저장하고 불러오는 기능만을 가지고 있다. MazeBuilder 서비스는 우리가 복잡한 형태를 갖고 있는 벽을 만들기 위해
여러 개의 Entity와 Shape를 호출하지 않고 약간의 그림을 그리는 것 만으로 미로를 만들 수 있게 하며, 저장과
불러오기를 통해 특정 미로를 다양하게 활용할 수 있는 장점이 있다. 그러면 먼저 SPL을 이용하여 MazeBuilder를
만들어보자.
MazeBuilder는 Services탭에 있다. 이를 더블 클릭하면 MazeBuilder코드가 자동생성
된다. 특별히 수정할 필요는 없으며 주어진 코드를 사용할 것이다. 이를 실행하면 시뮬레이션 창과 함께 새로운 컨트롤 창이 하나
더 열리게 될 것이다.
실행이 완료되면 위와 같은 창이 뜨게 될 것이다. 각 버튼을 설명하면 다음과 같다.
| 버튼 이름 |
실행 결과 |
| Draw Mode |
미로를 그릴 수 있는 상태로 전환한다. 위 그림에서 초록색 사각형 한 칸이 미로를 이루는 블록
1개가 되며, 드래그를 이용해 그릴 수 있게 된다. |
| Erase Mode |
미로를 지울 수 있는 상태로 전환한다. 이 상태에서 초록색 사각형을 클릭하면 벽이 사라지게 되며,
역시 드래그를 이용해 지울 수 있다. |
| Set Start Position |
시작 위치를 지정한다. 그러나 실질적으로 작동하는 것은 없으며, 다만 해당 위치의 바닥에 노란
사각형을 만들어 준다. |
| Set Target Position |
종착 위치를 지정한다. 역시 실질적으로 작동하는 것은 없으며, 해당 위치에 파란 사각형을 만들어
준다. |
| Clear Map |
만든 미로를 모두 지우고 맨 처음 상태로 되돌린다. |
| Save Map |
미로를 텍스트 형태의 파일로 저장한다. |
| Load Map |
저장해 둔 미로 파일을 불러온다. |
| Build Map |
시뮬레이션 환경에 컨트롤에서 그린 미로를 구현한다. |
먼저 Draw Mode 버튼을 눌러 자기가 원하는 형태의 미로를 그려 보자. Draw Mode 버튼이
노란색으로 변하면 활성화 된 것이며, 이 상태에서 미니 맵에 드래그를 하면 벽이 그려지게 된다.
다음은 잘못 만든 미로를 Erase Mode를 통해 지우는 방법이다. 활성화 여부는 배경 색이 노란색인지
아닌 지로 판별하면 될 것이다.
Draw Mode와 Erase Mode를 적절히 활용하여 원하는 형태의 미로를 만들었다면 이제 Build
Map 버튼을 눌러 시뮬레이션 환경에 미니 맵과 같은 모습을 한 미로를 구현해 보자.
이렇게 하여 Maze Builder를 이용하여 간단한 미로를 만들어 보았다. 그 다음엔 이렇게 만든 미로를
Maze Builder 없이 사용하기 위해 하나의 시뮬레이션 환경으로 저장해 보자. 시뮬레이션 환경은 xml파일로 저장되며,
SPL을 이용하여 불러올 수 있다. 이렇게 시뮬레이션 환경을 저장해 두면 간단한 파일 첨부 만으로도 특정 상황을 몇 번이고
재활용할 수 있는 장점이 있다. 물론 SPL에서 기본적으로 제공하고 있는 basicsim.xml,
BasicObstacles.xml 파일들을 이용하여 저장된 시뮬레이션 환경이 어떻게 동작하는지 이미 잘 알고 있을 것이다.
저장을 위해 시뮬레이션 환경 왼쪽 위에 File 메뉴에서 Save Scene As..를 누르자. 그러면 저장
위치와 저장 이름을 선택해야 할 텐데, 저장 위치는 R2가 설치된 폴더 안의 SimState 폴더, 그리고 이름은 자유롭게 하여
저장한다.
다만 저장할 때에 한글을 포함하여 저장했을 때, 정상적인 작동을 하지 않는 경우가 있기 때문에, 가급적이면
영어와 숫자만을 사용하여 저장하는 것이 바람직하다.
이렇게 저장을 완료하였다면 이제 저장한 미로를 불러와서 사용할 차례이다. 먼저 기존에 있던 스크립트들을
삭제한 뒤, StartSimulationEngine 명령을 이용하여 시뮬레이션 엔진을 구현한다. 다만, FileName 옵션으로
“SimState/basicsim.xml” 대신 직접 만든 미로 시뮬레이션을 선택한다. 여기서 주의할 점은
manifest.xml 파일이 아닌 xml파일을 열어야 한다는 것이다. manifest파일을 이용하여 열 경우 정상적으로
작동하지 않으니 주의하길 바란다.
여기서는 미로를 “mymaze1.xml”로 저장하였기 때문에 위와 같이 스크립트가 구성되었다. 만약
mymaze1.xml 대신 maze.xml로 시뮬레이션 환경을 저장하였다면 위의 스크립트는
StartSimulationEngine
/FileName:”SimState/maze.xml”
으로 표시될 것이다. 그 다음 위의 스크립트를 실행하면 우리가 만들어 두었던 미로가 다시 나타날 것이다.
이제 만들어 둔 미로에 미로 안을 돌아다닐 로봇을 만들어 보자. 이륜 구동 로봇을 만들기 위해서
AddDifferentialDriveEntity를 이용한다. 로봇의 이름은 자유롭게 해도 상관 없으나, 여기선 기본적으로
제공되는 이름인 base1을 이용하기로 한다. 또한 미로의 벽을 인지할 수 있도록 로봇에 LRF센서를 추가하도록 하자. LRF는
Laser Range Finder의 약자로써, Laser을 쏘고 받음으로써 원거리에 있는 물체와의 거리를 인식할 수 있으며,
이러한 레이저를 다각도로 쏨으로써 물체의 형태 또한 함께 인식할 수 있는 센서이다.
LRF센서를 추가하기 위해서는 AddLaserRangeFinderEntity를 이용하며,
ParentEntity로 위에서 만들어 둔 이륜 구동 로봇, 즉 base1을 지정한다. 이렇게 두 개의 서비스를 추가하였다면
스크립트는 아래와 같을 것이다.
이제 스크립트를 실행하면 다음과 같은 화면이 나올 것이다. CreateService를 잊지 않고 하도록 한다.
마지막으로 로봇을 미로찾기의 시작점으로 옮겨야 할 것이다. 미로찾기의 시작점은 가장 위에서 Set Start
Position을 어느 위치에 했는지에 따라 다를 것이다. 여기서는 기본 시작 위치를 사용하였으며 기본 시작 위치는 (0, 0,
4.4)에 존재한다. 그럼 로봇을 해당 위치로 옮겨보자. 로봇을 옮기기 위해 AddDifferentialDriveEntity에
Position를 추가한 뒤, 해당 값으로 0 0 4.4를 넣어준다.
실행하면 다음과 같은 화면이 나올 것이다.
또한 이렇게 만든 로봇을 컨트롤 하기 위해 Dashboard를 시뮬레이션 환경에 추가해 보자.
Dashboard를 추가하기 위해서는 Services 탭에 SimpleDashBoard를 추가하면 된다.
시뮬레이션 환경에 Dashboard를 추가하여 로봇을 이리저리 움직여 본다. 그런데 로봇을 움직이다 보면
LRF센서로 인해 로봇의 무게중심이 맞지 않아 이쪽 저쪽으로 흔들리게 되고, 결국 넘어지게 되는 모습을 볼 수 있다.
이러한 현상을 해결하기 위해서 LRF센서의 위치를 로봇의 정 중앙으로 옮겨 보자. LRF센서의 위치를 옮기기
위해서는 역시 AddLaserRangeFinderEntity의 속성 중 Position을 바꾸면 되며, 0 0.4 -0.3에서
Z값을 변경하여 정 중앙에 오도록 할 수 있다. Position 값을 0 0.4 0으로 바꾼 뒤 실행하게 되면 다음과 같이 바뀔
것이다.
이렇게 하여 미로찾기 과제를 수행할 간단한 로봇이 완성되었다. 다음 장에서는 이렇게 만든 로봇을 이용하여
실제로 미로 찾기 과제를 수행하게 될 것이며, 만들어 놓은 로봇을 다른 방향에서 관찰하는 방법을 배우게 될 것이다.