7장: 지능 로봇 시뮬레이션


  앞장에서는 로봇을 제작하기 위해 기본적으로 알아야 하는 두 가지 요소에 대해 알아보았다. 이번장에서는 본격적으로 로봇을 작동시켜보도록 하자.


[그림 1] Pioneer 3dx 로봇

  그림1은 탐사를 목적으로 만들어진 Pioneer 3dx의 모습이다. 이 로봇은 기본적으로 2개의 바퀴로 움직이며 Laser Range Finder 센서(하늘색 부분)와 전면과 후면에 bumper 센서를 가지고 있어. 주위 환경의 변화에 따라 다양한 움직임을 취하게 할 수 있다.

  MSRDS에서는 기본적으로 이 Pioneer로봇을 제공하고 있는데, 제작한 로봇을 조작하기에 앞서 Pioneer로봇을 조작해봄으로써 시뮬레이션 환경에서 로봇을 작동 시키는 것에 익숙해 지도록 하자.



Script를 이용해 Mobile Robots Pioneer 3DX 조작하기

1)    StartSimulationEngine을 추가한다.

2)    장애물이 있는 기본 시뮬레이션 환경을 불러온다.
-> /FileName:"SimState/BasicObstacles.xml"

3)    AddPioneer3DX을 추가한다.

4)    현재까지의 결과를 F5를 눌러 확인한다.

 
[그림 2] 장애물이 있는 기본 환경과 Pioneer3dx 로봇

5)    로봇을 조작하기 위해 Service 탭에서 DashBoard를 추가한다.

6)    F5키를 눌러 실행한다.

7)    DashBoard에서 Connect 버튼을 누르면 drive 서비스와 lrf(laser range finder) 서비스가 생성 되 있는걸 확인 할 수 있다.


[그림 3] Pioneer의 서비스들

8)    lrf 서비스를 더블클릭한다.

9)    DashBoard하단에 Laser Range Finder 탭이 활성화 되는 것을 확인 할 수 있다.


[그림 4] Laser Range Finder 서비스

10)    Laser Range Finder 탭에서 파란 상은 로봇이 감지한 장애물의 모습을 나타낸다.

11)    6장에서 바퀴 달린 로봇을 조작하는 것과 같은 방법으로 Pioneer3dx로봇의 바퀴들도 조작 할 수 있다.



VPL을 이용한 간단한 로봇제어

Step1. Lego Mindstorms NXT Tribot

  Lego Mindstorms NXT는 2006년 7월에 출시된, 프로그래밍이 가능한 로봇 개발 키트이다. NXT는 Lego Mindstorms의 첫 번째 버전인 Robotics Invention System을 발전 시킨 것이다. 이 키트는 상용 버전과 교육용 버전으로 나뉘며, 각종 프로그래밍 언어를 함께 사용하는 교육은 학생들에게 자연스럽게 객체 지향 프로그래밍 개념과 쓰레드 처리 개념을 익히게 할 수 있고, 하드웨어와 소프트웨어 간의 상호 관련성을 이해시킬 수 있다는 장점이 있다.
 

[그림 5] MSRDS로 구현된 Lego NXT Tribot

  VPL에서 기본적으로 제공하는 로봇들 중 하나가 바로 Lego MindStorms NXT의 Tribot이다. 이 로봇은 보조 바퀴 하나와 동력이 있는 바퀴 2개 그리고 충돌 감지 센서로 이루어 져 있다.
  충돌 감지 센서를 사용하여 여러 가지 복잡한 수행을 할 수도 있지만, 이번 연습문제에서는 MSRDS상에서 로봇을 어떻게 움직일 수 있는지를 알아보는 정도만 해 보도록 하자.


Step 2. 기본 환경 구축하기
 

[그림 6] MSRDS로 구현한 로봇 구동을 위한 기본 환경

 1) 로봇 시뮬레이션을 위한 기본 환경

 2) VPL을 실행한다.


[그림 7] VPL에서 SimulatedGenericDifferentialDrive를 추가한 모습

 3) Service에서 Simulated Generic Differential Drive를 추가한다.

 4) Simulated Generic Differential Drive를 클릭하여 우측의 Properties를 확인한다.

 5) Configuration을 ‘use a manifest’로 설정한다.

 6) Manifest 종류를 ‘LEGO.NXT.Tribot.Simulation.Manifest.xml’로 설정한다.

 7) (실행) 버튼을 눌러 결과를 확인한다.

 8) xml로 구성된 manifest 파일 안에는 하늘, 땅, 광원 그리고 LEGO NXT tribot과 간단한 object들 이 구현되어 있다.


Step 3. SimpleDashBoard를 이용해 로봇 움직여보기
 

[그림 8] MSRDS의 SimpleDashBoard

 1) Simple Dash Board는 MSRDS 시뮬레이션 환경상에서 구현된 로봇의 움직임을 조정하거나 센서의 상태를 확인 할 수 있는 도구이다.

 2) VPL에서 Services 중 Simple Dash Board를 추가한다.
 

[그림 9] VPL 상에서 추가된 Simple Dash Board

 3) (실행) 버튼을 눌러 결과를 확인한다.

 4) 시뮬레이션 창과는 별도의 창에 Dash Board가 생성 된 것을 확인 할 수 있다.

 5) 버튼을 눌러 시뮬레이션 환경과 Dash Board를 연결한다.
 

[그림 10] 시뮬레이션 환경과 연결된 Dash Board

6) (LegoNXTMotorBase)를 선택한다

7) 를 눌러 LegoNXT의 모터와 Dash Board를 연결 시킨다.

8) 원형의 컨트롤러를 마우스를 통해 조작하여 로봇의 움직임을 관찰한다.

 
[그림 11] Dash Board를 이용해 이동시킨 로봇


Step 4. VPL프로그래밍으로 로봇 움직여보기

 1) 이번엔 사용자의 조작이 아닌 VPL로 작성된 프로그램으로 로봇을 움직여 보도록 하자
 
 2) Simple Dash Board를 제거한다.
 
 3) 일정한 속도로 전진하는 동작을 주도록 하자

 4) Data Activity를 2개 추가한다.

 5) 각각의 Data Activity에 오른쪽 바퀴와 왼쪽 바퀴의 동력 값을 준다.

 6) 로봇을 앞으로 전진 시키기 위해 두 개의 Data value를 0.5로 주도록 한다.
 
 7) Join Activity을 통해 두 개의 Data를 동시에 사용 할 수 있도록 한다.
 

[그림 12] 바퀴에 동력을 주기 위해 추가된 두 개의 Data Activity

 8) Join Activity와 SimulatedGenericDifferentialDrive를 연결한다.
 

[그림 13] 두 개의 바퀴에 동력 값을 전달하기 위한 Connection 설정

 9) Connections의 옵션중 SetDrivePower를 선택한다.

 10) Data Connections의 Value를 각각 left와 right로 설정한다.

 11) (실행) 버튼을 눌러 결과를 확인한다.
 
 12) 로봇이 앞으로 전진하는 것을 확인 할 수 있다.


Step 5. VPL프로그래밍으로 로봇에 2개 이상의 동작 주기

 1) Delay를 주기위한 Data activity를 추가한다.
 
 2) Data Value는 5000으로 준다.
 
 3) SimulatedGenericDifferentialDrive와 추가한 Data Activity를 연결한다.


[그림 14] SimulatedGenericDifferentialDrive와 새로운 Data 값 사이의 Connection 옵션

 4) Connection을 SetDrivePower – Success로 설정한다.

 5) Service중 Timer를 추가한다.
 
 6) Data Activity와 Timer를 연결한다.
 

[그림 15] Data와 Timer간의 Connection 옵션
 

[그림 16] Delay를 추가한 VPL 코드

 7) 뒤로 가는 동작을 주기 위해 -0.5값을 가진 data, join activity들을 추가한다.

 8) Timer와 바퀴의 새로운 동력 값을 주기 위해 추가된 두 개의 Data Activity를 연결한다.

 
[그림 17] Timer와 새로운 바퀴의 동력 값을 가지고 있는 Data들 간의 Connection

 9) Connection을 Wait – Success로 설정한다.
 
 10) 새로운 SimulatedGenericDifferentialDrive를 추가한다.
 
 11) 새로운 Join Activity와 새로운 SimulatedGenericDifferentialDrive를 연결한다

 12) Connection 설정은 Step4와 동일하게 한다.
 

[그림 18] 완성된 VPL 코드의 모습

 13) (실행) 버튼을 눌러 결과를 확인한다.
 
 14) 로봇이 5초간 전진하다가 이후에는 후진하는 것을 확인 할 수 있다.
 

Step 6. 주의 할 점

 1) Step4와 Step5에서 바퀴의 동력 값은 -1.0~1.0 사이의 double 값으로 입력해 주어야 한다.

 2) VPL을 통해 로봇제어를 하다 보면 Connection을 지정해 줘야 하는 경우가 많이 생기는데, 이 Connection의 옵션 부분이 틀린다면 에러는 발생하지 않지만 원하는 로봇이 동작을 하지 않는 경우가 생긴다.

 3) Step5에서 Delay를 주기 위해 Timer에 5000이라는 값을 넘겨주었는데 VPL에서는 이렇게 시간의 단위를 항상 밀리 세컨드로 계산한다.


Step 7. 추가 과제

 1) 로봇의 움직임이 원을 그리게 해보시오

 2) 장애물을 피해서 전진하는 로봇의 움직임을 구현해 보시오
(Lego NTX manifest를 보면 노란 교통 고깔이 하나 있는 것을 확인 할 수 있다. Step5에서 수행하였던 Timer를 적절히 이용하여 로봇이 이를 피한 뒤 계속 앞으로 전진하는 동 작을 할 수 있도록 해보자.)
 

[그림 19] 장애물과 로봇이 가야 할 경로



Script와 VPL을 이용한 Mobile Robots Pioneer 3DX 시뮬레이션

1)    앞에서 제작한 Script 파일을 “pioneer.txt”라는 이름으로 저장한다.

2)    VPL을 실행한다.

3)    String 형태의 Data Activity를 추가하여 Script 파일의 상대 경로를 적어준다.
->    Script/pioneer.txt

4)    Services에서 SPLEngine을 추가한다.

5)    Data와 SPLEngine을 연결한다.

6)    Connections의 옵션을 “ExcuteScriptFile”로 설정한다.

7)    Data Connections에서 Data의 “Value”를 사용할 수 있게 설정해 준다.

8)    현재까지의 결과를 F5를 눌러 확인한다.

 
[그림 20] Script언어와 VPL을 함께 사용해 구현된 Pioneer 3dx 로봇

9)    Script언어로 구현했던 것과 동일한 시뮬레이션이 실행 되는 것을 확인 할 수 있다.

10)    로봇에 움직임을 주는 명령을 하기 위해 String타입의 Data Activity를 추가한다.

11)    Script언어에서 바퀴에 동력 값을 전달할 때 사용하는 SetDrivePower명령을 적어준다.
(단, 모든 내용을 Data Activity에 한 줄로 적어야 한다. 옵션간 구분은 띄어쓰기로 한다.)
-> SetDrivePower   /TargetName:p3dx1 /LeftWheelPower:0.5 /RightWheelPower:0.5

12)    Service에서 SPL Action을 추가한다.

13)    Script 명령어가 들어있는 Data와 SPL Action을 연결해준다.

14)    Data Connections에서 Data의 “Value”를 사용할 수 있게 설정해 준다.

15)    현재까지의 결과를 F5를 눌러 확인한다.


[그림 21] 전진하는 로봇

16)    Delay 값을 주기 위한 int형 Data Activity를 추가한다.

17)    Delay 값은 10000으로 주도록 하자.

 
[그림 22] Delay를 주기 위한 Data Activity

18)    SPL Action과 추가한 Data Activity를 연결한다.

19)    Service에서 Timer를 추가한다.

20)    Data Activity를 Timer와 연결한다.

21)    Connection의 옵션을 “Wait”로 설정한다.

22)    Data Connections에서 Data의 “Value”를 사용할 수 있게 설정해 준다.

23)    새로운 스크립트 명령어가 있는 Data Activity를 추가한다.

24)    이번엔 뒤로 움직이는 명령을 주도록 하자.
-> SetDrivePower   /TargetName:p3dx1 /LeftWheelPower:-0.5 /RightWheelPower:-0.5

25)    Timer와 새 명령어가 들어있는 Data를 연결한다.

26)    SPL Action을 추가한다.

27)    Data와 SPL Action을 앞에서와 같은 방법으로 연결해 주자.


[그림 23] 완성된 VPL 소스

28)    현재까지의 결과를 F5를 눌러 확인하자.

 
[그림 24] 일정 시간 동안 전진한 뒤 후진하기 시작하는 로봇

29)    로봇이 일정 시간 동안 전진하다가, 후진하는 것을 확인 할 수 있다.


  이처럼 MSRDS 시뮬레이션 환경에서는 다양한 방법으로 로봇을 작동 시킬 수 있다.

  Script만 사용해서 작동 시키는 법 VPL만 사용하여 작동 시키는 법, 두 가지를 섞어서 작동 시키는 법 이렇게 크게 3가지로 나누어 설명하였다. 이 세가지 방법 중 특히 눈 여겨 봐야 할 부분이 두 가지를 섞어서 작동시키는 법이다. Script의 다양한 명령어를 마치 VPL에서 제작되어있는 Service와 같이 사용할 수 있게 됨으로써, 여러 가지 복잡한 명령을 내리기 수월하다. 마치 마지막 예제에서 전진하다가 후진하는 명령을 준 것 같이 말이다.

  이번 Lecture에서는 단순히 로봇의 움직임만을 가지고 여러 가지 접근 법을 알아 봤다. 마지막에 언급한 Script와 VPL을 함께 사용하는 방법을 사용하면 로봇의 움직임은 물론 사용자가 Script에서 추가한 Sensor의 측정값을 VPL에서 손쉽게 사용할 수 있기 때문에 다양한 작업을 수행하는 인공지능 로봇을 만드는 데 도움이 될 것이다. 이 이야기는 후에 Sensor에 대해 다룰 때 자세히 하도록 한다.