13장: Intelligence robot simulation using artificial
intelligence
지금까지 MSRDS의 가상 환경을 통해서, 간단한 사물들의 시뮬레이션이나, 로봇 제어에 대해서 알아보았다.
특히 로봇과 센서간의 상호작용은 로봇을 이용한 문제해결에 있어 없어선 안될 중요한 내용이었다.
앞장에서 다루었던 향상된 라인트레이서를 생각해보자, 로봇은 2개의 컬러센서에서 감지한 정보를 바탕으로 바닥에 그려진 길을
따라가고, LRF센서로 감지한 정보를 바탕으로 로봇의 정면에 있는 장애물의 유무를 확인해 U-turn한다. 이렇듯 MSRDS에서
다루었던 로봇뿐 아니라, 여러 공장에서 쓰이는 로봇 팔, 청소 로봇 등 모든 로봇은 입력된 정보와 그에 따른 상호 작용으로
움직인다.
[그림 1] 영화 A.I.의 포스터
이러한 상호 작용 중 인간에게 적용되는 경우를 우리는 인공지능(Artificial Intelligence; A.I.)라고
부르며, 오래 전부터 컴퓨터 공학(Computer Science)에 있어서 가장 관심이 높은 분야 중 하나로 연구되어 오고
있다. 이번 과에서는 A.I.의 정의에 대해 배우고, 관련 예제를 MSRDS를 통해 구현해 보도록 하자.
인공지능이란?
인공지능은 인간의 학습능력과 추론능력, 지각능력, 자연언어의 이해능력 등을 컴퓨터 프로그램으로 실현한 기술 인간의 지능으로 할
수 있는 사고, 학습, 자기계발 등을 컴퓨터가 할 수 있도록 하는 방법을 연구하는 컴퓨터 공학 및 정보기술의 한 분야로서,
컴퓨터가 인간의 지능적인 행동을 모방할 수 있도록 하는 것을 인공지능이라고 말하고 있다.
또한
인공지능은 그 자체로 존재하는 것이 아니라, 컴퓨터 과학의 다른 분야와 직간접으로 많은 관련을 맺고 있다. 특히 현대에는
정보기술의 여러 분야에서 인공지능적 요소를 도입하여 그 분야의 문제 풀이에 활용하려는 시도가 매우 활발하게 이루어지고 있다.
다음은 연구 분야별 인공 지능의 종류이다.
-
자연언어처리(natural language processing): 이미 자동번역과 같은 시스템이 실용화 되었으며, 특히 연구가
더 진행되면 사람이 컴퓨터와 대화하며 정보를 교환할 수 있게 되므로 컴퓨터 사용에 혁신적인 변화가 오게 될 것이다.
-
전문가시스템(expert system): 컴퓨터가 현재 인간이 하고 있는 여러 가지 전문적인 작업들(의사의 진단, 광물의 매장량
평가, 화합물의 구조 추정, 손해 배상 보험료의 판정 등)을 대신할 수 있도록 하는 것이다. 여러 분야 가운데서도 가장 일찍
발전하였다.
- 영상 및 음성인식(Recognition): 컴퓨터가 카메라를 통해 잡은 영상을 분석하여 그것이 무엇인지를
알아내거나, 사람의 목소리를 듣고 그것을 문장으로 변환하는 것 등의 일은 매우 복잡하며, 인공지능적인 이론의 도입 없이는
불가능하다. 문자 인식, 로봇 공학 등에 핵심적인 기술이다.
- 이론증명(theorem proving): 수학적인 정리를 이미 알려진 사실로부터 논리적으로 추론하여 증명하는 과정으로서
인공지능의 여러 분야에서 사용되는 필수적인 기술이며, 그 자체로도 많은 가치를 지니고 있다.
- 신경망(neural net)은 비교적 근래에 등장한 것으로서 수학적 논리학이 아닌, 인간의 두뇌를 모방하여 수많은 간단한
처리기들의 네트워크로 구성된 신경망 구조를 상정하는 것이다.
[그림 2] 인공지능을 가진 로봇 강아지
흔히들 인공지능이라고 말하면, 사람처럼 말하고 생각하는 영화에서 나오는 로봇을 가리키는 것이라고 생각하는 경우가 많다. 하지만
실제로 인공지능은 로봇이 인간의 모든 행동이나, 사고를 할 수 있도록 도와주는 것까지 생각하는 좀 더 포괄적인 의미의 학문이다.
기존의 프로그래밍 언어와는 달리 시뮬레이션 환경을 통해 손쉽게 로봇의 제작과 조작이 가능하다는 점에서
MSRDS를 통한 인공지능의 구현은 의미가 있고 인공지능의 정의에 대한 이해에 도움이 될 것이다.
Wumpus World
Wumpus World는 인공지능 중에서도 문제 해결(Problem Solving; PS) 분야의 문제로써 매우 유명한
예제이다. Logical Agents를 사용 하여 해결하는 문제이며, Logical Agent는 환경에 대한 정보와 판단으로
구성되어있다. 로봇의 이동, 환경의 변화와 같은 입력 값에 따라 Logical Agent의 환경에 대한 정보, 판단의 내용이
바뀌게 되며 이에 따라 다음 행동을 결정한다.
[그림 3] Wumpus World
Wumpus는 괴물의 이름이며, Wumpus가 살고 있는 동굴을 가리켜 Wumpus World라고 한다.
동굴의 환경은 4가지가 있다.
-
평범한 바닥 (Floor)
- 괴물 (Wumpus)
- 구덩이(Pit)
- 보물(Gold)
이 문제의 목적은 출제자에 따라 다르지만 가장 큰 목적은 구덩이와 괴물을 피해 보물이 있는 곳까지 도달하는
것이다. 문제에 따라 보물을 획득하고 괴물의 위치를 파악하여 괴물을 죽이라는 과제가 추가되기도 한다.
이 동굴의 특징은 여러 개의 방으로 이루어져 있으며, 동굴 전체는 칠흑같이 어두워서 탐험가(Explorer)가 들고 있는
횃불로는 현재 위치하고 있는 방의 정보 밖에 알 수 없다. 또한 탐험가는 현재 있는 위치에서 전, 후, 좌, 우 네 방향으로
움직일 수 있으며, 가지고 있는 활을 사용하여 괴물을 죽일 수 있다.
하지만 탐험가는 자신이 있는 곳 밖에 볼 수 없기 때문에, 안전한 탐험을 위해서는 동굴의 상태(state)를
알아야 한다. 상태는 총 3가지가 있으며 다음과 같다.
-
악취(Stench): 괴물의 전, 후, 좌, 우 4방향은 악취가 풍기게 된다.
- 산들바람(Breeze): 구덩이가 있는 방의 전, 후, 좌, 우
4방향은 구덩이로부터 올라오는 산들 바람이 느껴진다.
- 반짝거림(Glitter): 보물이 있는 방에 들어서면 방 어딘가에 있는
보물의 반짝거림을 느낄 수 있다.
Wumpus World의 핵심은 현재 위치한 곳의 상태를 보고 환경에 대한 정보를 갱신해가면서 안전한 길을
선택하여 탐험을 계속해 나가는 것이다.
지금부터는 Wumpus World의 구현에 대해 알아보자.
구현
우선 지금까지의 프로그래밍 언어에서 Wumpus World를 구현하기 위한 idea들을 알아보고 MSRDS를
사용한 환경의 구축을 해보도록 한다.
Map으로는 그림 3에 나와있는 Basic case를 사용하도록 한다. 그리고 문제 해결을 위해 필요한 Assumption으로는
구덩이(Pit)과 괴물(Wumpus)는 같은 방에 있을 수 없고 탐험가(Explorer)의 출발 위치(Start)와, 그 출발
위치에서 전, 후, 좌, 우의 방은 안전이 보장되어야 한다는 것이다. (즉 Gold이거나 Floor 이어야 한다.)
Wumpus World in ordinary
programming language
- Knowledge base
앞서 말한 Logical Agent가 판단한 주변 환경 같이 행동을 결정하기 위한 기반이 되는 정보를 Knowledge
base라고 하며, 프로그램의 어딘가에 항상 저장되어 있어야 한다. Wumpus World Problem에서는 배열로 그 정보를
저장하며 새로운 정보를 감지 할 때 마다 Update해 주도록 한다.
- Logical Reasoning
Logical 프로그래밍에서 사용하는 방법으로 두 개 이상의 정보를 사용하여 삼단논법, 모순 등의
Axiom을 사용하여 부정확하게 정의된 정보를 추론 하는 과정이다.
예를 들어 A, B, C라는 세 사람이 있고
Family(A,B) A는 B의 가족이다
Family(B,C) B는 C의 가족이다.
라는 두 개의 정보를 가지고 있다면
추론을 통해 Family(A,C) A는 C의 가족이다. 라는 정보를 얻어 낼 수 있다.
Wumpus World에 위 과정을 적용시켜보자. 가로축을 x, 세로축을 y로 보고 Wumpus 인지
PIT인지 Gold인지를 차례로 나타내는 것으로 한다.
-
Wumpus: 괴물이 있으면 W, 없으면 N, 확실하지 않으면 ?, 정보가 없으면 NULL로 표시한다.
-
Pit : 구덩이가
있으면 P, 없으면 N, 확실하지 않으면 ?, 정보가 없으면 NULL로 표시한다.
- Gold : 금이
있으면 G, 없으면 N, 확실하지 않으면 ?, 정보가 없으면 NULL로 표시한다.
Ex) (1, 2, N, N, N)
위의 예제에서 Gold를 찾아가는 상황을 Logical Reasoning과 함께 설명하면 다음과 같다.
1)
(1,1,N,N,N) ;
(1,2,N,N,NULL) ; 금에 대한 정보는 입력되어있지 않다.
(2,1,N,N,NULL) ; 시작 위치는 안전하며 인접한 방도 Assumption에 의해 안전하다
2) 안전하다고 판단한 (1,2)로 이동한다
(1,3,?,N,NULL); 산들바람이 없었으므로 인접한 방에는 구멍이 없음을 표시한다.
(2,2,?,N,NULL); 악취가 났으므로 인접한 방들 중 하나에 괴물이 있을 수도 있음을 표시한다.
3) 새로운 방 중 안전하다고 판단되는 곳이 없으므로 다시 시작점으로
돌아온다.
4) 안전하다고 판단한 (2,1)로 이동한다.
(3,1,N,?,NULL); 악취가 없었으므로 인접한 방에는 괴물이 없음을 표시한다.
(2,2,N,?,NULL); 산들바람이 느껴졌으므로 인접한 방들 중 하나에 괴물이 있을 수도 있음을 표시한다.
5) Logical reasoning을 한다.
2)와 3)에서의 정보 중 (2,2)에 대한 정보 두 가지를 조합해보면 (2,2)에는 확실하게 괴물도, 구덩이도 없음을 알 수
있다.
(2,2,N,N,NULL)
그리고 (2,2)가 안전한 방으로 판단됨에 따라 자연히 (1,3)에는 괴물이 있고 (1,3,W,N,NULL), (3,1)에는
구덩이가 있다는 사실을 알 수 있다. (3,1,N,P,NULL)
6) 안전하다고 판단한 (2,2)로 이동한다.
(2,3,N,N,NULL)
(3,2,N,N,NULL); 방에서 악취도 산들바람도 없었기 때문에 인접한 방들은 모두 안전한 상태임을 알 수 있다.
7) 안전하다고 판단한 (2,3)으로 이동한다.
(2,3,N,N,G) ; 반짝거림을 느꼈으므로 이 방에 보물이 있음을 판단하고 탐험을 끝낸다.
이러한 논리 연산을 하기 위해서는 탐험가의 판단에 의한 정보와 실제 정보를 따로 저장하여 새로운 내용이
Update 될 때마다, 해당 좌표의 정보를 reasoning 해주어야 할 것이다.
C언어로 Wumpus World를 구현한다면, 배열을 이용하여 정보를 저장하고, 탐험가의
움직임을discrete한 turn 방식으로 정해 이 문제를 해결 할 수 있을 것이다.
기존의 언어로 Wumpus World를 구현하면 연산속도도 빠르고, 정확한 정보 연산이 가능하다. 하지만
Discrete한 진행방식을 가진다는 점에서 현실성이 떨어진다.
Wumpus World in MSRDS
MSRDS에서 Wumpus World를 구현한다면 하나 이상의 서비스의 Concurrent한 수행이라는
프로그램의 특징에 따라 실시간으로 Wumpus World를 구현해야 한다.
하지만 기본적인 Idea는 기존의 Wumpus World Solution과 같이 Knowledge Base를
바탕으로 추론에 의한 문제해결의 수행으로 한다.
Step 1 환경 구축
- 구성요소
■ 환경
아무런 정보를 가지고 있지 않는 땅은 회색의 육면체 object로
표현한다.
[그림 4] 주변이 모두 안전한 방
Wumpus는 괴물 모양의 object로 한다
[그림 5] Wumpus object
Pit은 안전한 지역의 높이 절반이 되는 object로 표현한다.
[그림 6] Pit
Gold는 땅의 색상을 노란색으로 한다.
[그림 7] Gold
Breeze는 바닥을 구멍(Pit)이 있는 쪽으로 기울이고 색상을 하늘
색으로 한다.
[그림 8] Breeze
■
로봇
탐험가는 두 개의 컬러 센서와 하나의 LRF 센서로 구성된 바퀴 달린
로봇으로 한다.
[그림 9] 탐험가
-> LRF 센서가 Wumpus
object의 존재 여부를 확인 하는 것으로 Stench인 것을 감지한다.
-> 좌측 Color 센서의 값을 확인하여 바닥의 색이 노란색이면 Gold인 것을 감지한다.
-> 우측 Color 센서의 값을 확인하여 바닥의 색이 하늘색이면 Breeze인 것을 감지한다.
-> Breeze 구현의 경우 Compass 센서를 사용해도 감지가 가능하나, 정확도를 높이기 위해
Color 센서를 사용한다.
- 구축 화면
위 구성요소들을 토대로 Wumpus World Basic Problem을 구현한 화면은 다음과 같다.
[Basic Problem]
[그림 10] MSRDS로 구현한 Basic
Problem 환경
Step 2 Knowledge Base 구축
- 정보 구분
Logic
Language나 C, JAVA와 같은 Programming Language에서는 Logical element의 개수를
조절하거나 다차원 배열을 이용하여 Knowledge Base를 간단히 구축할 수 있다. 하지만 MSRDS의 VPL은 여러 개의
element를 다루는 변수로써 단순 리스트를 제공 할 뿐 이러한 다차원 배열을 제공하지 않는다. 따라서 정보를 나눠서 저장 할
필요가 있는데, 그 방법은 다음과 같다.
1)
Knowledge base를 X, Y 좌표로 표시하는 대신 16개의 방들을 0번 방부터 15번 방으로 생각한다.
-> 로봇의 현재 위치(x,y)를 변수로 저장한다면
(방번호) = x + y*4 와 같은 방법으로 방 번호를 구할 수 있다.
2) Wumpus의 존재 여부를 확인하는 리스트와 Pit의 존재 여부를
확인하는 리스트를 생성한다.
-> 리스트의 길이는 방의 개수만큼인 16개가 될 것이다.
3) Gold를 찾았는지 여부를 저장하는 Boolean 변수를 생성한다.
-> 금을 찾으면 그 즉시 탐험을 종료하면 되기 때문에 굳이 리스트를 생성할 필요가 없다.
- VPL에서 Knowledge Base 구현
Wumpus와 Pit의 정보를 저장하기 위한 리스트를 생성한다.
[그림 11] VPL에서 리스트 구현
-> 리스트 변수와 인덱스 변수를
생성한다.
-> 정수의 리스트로써 리스트를 초기화 시키고 인덱스는 0으로 초기화 시킨다,
-> Assumption에 따라 안전하다고 판단된 0번 1번 4번 방에는 1을 나머지 방에는 -1을
넣어 리스트를 초기화 시킨다. 여기서 1은 완벽하게 안전하다고 판단된 경우고 -1은 아직 한번도 판단해 보지 않은 경우이다.
Gold의 정보를 저장하는 Boolean 변수를 생성한다.
[그림 12] Boolean 변수 초기화
로봇의 현재 위치를 저장하기 위해 x, y 두 개의 변수를 생성한다.
[그림 13] integer 변수 초기화
여기까지가 기본적인 VPL에서의 Wumpus World Knowledge Base이다. 이 이외의
변수들도Performance의 향상이나, 추가적으로 체크 할 요소의 유무 따라 얼마든지 추가 할 수 있다.
Step 3 움직임 구현
- 움직임의 종류
Wumpus World에서 탐험가는 인접한 방으로만 움직일 수 있기 때문에, 전 후 좌 우 4방향으로 움직일
수 있다. 그리고 움직임에 통일성을 주기 위해서 로봇은 항상 앞쪽을 바라 볼 수 있게 한다.
-> 전; 한 칸 전진
-> 우; 우로 90도 회전, 한 칸 전진, 좌로 90도 회전
-> 좌; 좌로 90도 회전, 한 칸 전진, 우로 90도 회전
-> 후; 180도 회전, 한 칸 전진, 180도 회전
- VPL에서 움직임 구현
로봇(탐험가)에 대해 SPL로 움직임을 구현한 후, VPL에서 움직임의 흐름을 구현한다.
[그림 14] VPL로 구현한 전진
하나 이상의 움직임을 순차적으로 주기 위해서는 이전 동작이 끝나는 시간을 고려하여 적절한 크기의 Delay를
줘야 한다.
[그림15] VPL로 구현한 좌, 우, 후진
Step 4 논리 연산 구현
Step
3까지의 과정에서 시뮬레이션 환경, 논리 연산을 하기 위한 Knowledge Base, 그리고 로봇의 움직임이 구현되었다.
지금부터는 로봇이 위 요소들을 결합하여 Wumpus World 문제를 해결 할 수 있는 논리 연산 부분을 구현한다.
우선 로봇의 센서들을 활성화 시킨다.
[그림 16] 탐험가 로봇의 센서 초기화
여기서 Color1은 보물의 존재 여부를, lrf1은 Wumpus의 존재 여부를, color2는 구덩이의
존재 여부를 확인한다.
구덩이(PIT)과 보물(GOLD)의 경우는 바닥의 색을 보고 판단하면 되기 때문에, 정확도에 대해 걱정 할
필요가 없다. 하지만
괴물의 경우 LRF 센서를 사용해 괴물이 일정 거리 안에 있을 때 환경의 변화를 인식하기 때문에 괴물이 정면에 있지 않을 경우
인식을 하지 못하는 문제점이 생긴다.
이를 해결하기 위해서는 is_wum 이라는 Boolean 변수를 생성하여, 로봇이 회전하는 도중에 한 순간
이라도 괴물이 일정 범위 내에 있었다면 Check해 두어 논리 연산을 할 때 적용 할 수 있는 코드를 추가해야 한다.
MSRDS
를 통한 로봇 시뮬레이션으로 구현한 Wumpus World는 기존의 방식에 비해 훨씬 real World에 가까운 것을 알 수
있다. 하지만 센서의 갱신 속도와 정보의 갱신속도 간의 차이, 실시간으로 변하는 정보에 의한 정보 누락이나 잘못된 전달 같은
문제점이 발생하기 쉽다는 문제점이 있다.
[그림 17] Wumpus의 존재 여부를
가리기 위한 flag
이제 남은 것은 로봇(탐험가)을 안전 하다고 판단되는 방으로만 이동 시켜가면서 보물이 있는 곳까지 도달하는
것이다. 이를 위해서는 Step2에서 만든 Knowledge Base를 계속 확인하면서 Update하는 작업이 필요하다.
Wumpus
의 존재여부를 판단하는 리스트와 Pit의 존재여부를 판단하는 리스트는 integer 형태로 정의되어있다. 만약 그 방이 특정
조건(Wumpus or Pit)으로 부터 안전하다면 1, 아직 잘 모른다면 0 한번도 논리 연산을 적용 시킨 적이 없다면 -1
안전하지 않다면 -2를 입력하도록 한다.
그렇게 하면 로봇의 위치에서 어떤 방의 안전성 여부는 다음과 같은 추론으로써 확인 할 수 있을 것이다.
(Wumpus 는 W, Pit은 P로 표시하도록 한다.)
1)
전, 후, 좌, 우의 어떤 방 중 W의 리스트값과 P의 리스트 값의 합이 2라면(완전히 안전하다면) 그쪽
방향으로 진행한다.
2) 전, 후 좌, 우의 어떤 방 중 안전하다고 판단되는 방이 하나도
없다면 왔던 길을 되돌아 간다.
3) 1), 2)의 과정을 반복하며 매번 로봇이 위치한 방을 기준으로
사방의 4개의 방에 대해서 Knowledge Base를 변화시킨다.
4) 어떤 방에서 Breeze나 Stench가 감지 되었으면,
A.
만약 판단 대상이 되는 방의 리스트 값이 -1이라면(한 번도 생각된 적이 없다면) 0으로 바꿔준다(확실하지
않지만 가능성이 있는 것)
-> 예를 들어 W값이 -1 이었다면 W값을 0으로 바꾸고 이는 이 방에는 괴물이 있을 수도 괴물이 없을 수도
있음을 뜻한다.
B. 만약 판단 대상이 되는 방의 리스트 값이 0이라면 -2로 바꾸어
준다(이 방은 확실히 위험하다는 것)
-> 예를 들어 W값이 0 이었다면 이 방은 이미 다른 방향에서 고려된 적이 있었다는 말이기 때문에 W값을 -2로
바꿔주어 이 방에 괴물이 있음을 표시한다.
5) 어떤 방에서 Breeze나 Stench가 감지 되지 않았으면
판단 대상이 되는 방의 리스트 값에 상관없이 그 값을 1로 바꿔준다(안전하다는 뜻)
여기서 주의해야 할 점은 위에서 기술한 조건 이외에도 Knowledge Base를 바꿔줄 때 주변의 확실하게
안전하다고 판단된 방의 개수나 확실하게 불안전하게 판단된 방의 개수도 고려해 주어야 한다는 점이다.
예를 들어 다음과 같은 Knowledge Base를 생각해보자.
6
NULL |
7
Safe |
8
??? |
3
NULL |
4
Safe |
5
Pit |
0
Safe |
1
Safe |
2
Safe |
NULL: 고려 된 적 없음
??? : 위험 할 수 도 아닐 수도 있음
로봇이 4번 방에 있고 로봇이 여기서 Stench를 감지 했다고 가정하자.
그
렇다면 3번 방의 Knowledge Base 값을 생각해 봤을 때, 한번도 고려 되어 본 적이 없기 때문에 “???”로 바꿔줘야
할 것 같지만, 사실 이미 사방 중 전, 우, 후 3방향이 결정 되어있기 때문에 “???”로 바꾸어 한 번 더 고려할 필요 없이
3번 방에는 Wumpus가 존재하는 게 된다.
이러한 예외만 잘 고려하여 논리 연산을 구현한다면 성공적으로 보물을 찾아가는 탐험가 로봇을 만들 수 있을
것이다.
[그림 18] Wumpus World in
MSRDS
탐험을 시작하고 얼마 되지 않았을 때 로봇이 전진 한 뒤, 주변에 확실하게 안전하다고 판단되는 방이 없음을
인식하고 U-turn하여 돌아오는 움직임을 볼 수 있다.
부록에
주어진 Wumpus World 시뮬레이션을 사용해 각자만의 탐험가를 만들어 보도록 하자
C#을 이용해 Wumpus World에 관한 MSRDS용 서비스를 개발한다면 기존의 Solution들이
가지고 있는 정확성, MSRDS가 가지고 있는 현실성 두 가지 장점을 합칠 수 있다.
Wumpus World는 인공지능의 예제 중에서도 추론에 의한 논리연산에 기초하고 있기 때문에, MSRDS에서의 로봇
프로그래밍과 상당히 밀접한 연관이 있다고 할 수 있다. 이번 과제를 통해 로봇의 연산자, 다시 말해 로봇의 두뇌를 제작 하는 데
있어 많은 영감을 얻을 수 있기를 바란다.
부록
Wumpus World
시뮬레이션 환경(SPL) 소스
StartSimulationEngine
/FileName:"SimState/basicsim.xml"
AddNewEntity
/Name:floor
/Position:0
0.2 0
/Mass:1000
/IsKinematic:true
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f1
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:0
0.1 0
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f2
/DiffuseColor:0.5019608
1 1
1
/Position:2
0.11 0
/Orientation:0
0 1
-5
AddBoxShape
/Dimensions:2.1
0.2 2,.1
/Mass:0.1
/Name:f2_
/DiffuseColor:0.5019608
1 1
1
/Position:2
0.11 0
/Orientation:1
0 0
5
AddBoxShape
/Dimensions:2
0.2 2
/Mass:0.1
/Name:f3
/DiffuseColor:0
0 0
1
/Position:4
0 0
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f4
/DiffuseColor:0.5019608
1 1
1
/Position:6
0.11 0
/Orientation:0
0 1
5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f4_
/DiffuseColor:0.5019608
1 1
1
/Position:6
0.11 0
/Orientation:1
0 0
5
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f5
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:0
0.1 -2
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f6
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:2
0.1 -2
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f7
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -2
/Orientation:1
0 0
5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f7_
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -2
/Orientation:0
0 1
-5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f7_2
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -2
/Orientation:0
0 1
5
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f8
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:6
0.1 -2
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f9
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:0
0.1 -4
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f10
/DiffuseColor:1
1 0
1
/Position:2
0.1 -4
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f11
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -4
/Orientation:1
0 0
-5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f11_
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -4
/Orientation:0
0 1
-5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f11_2
/DiffuseColor:0.5019608
1 1
1
/Position:4
0.11 -4
/Orientation:0
0 1
5
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f12
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:6
0.1 -4
AddBoxShape
/Dimensions:2
0.4 2
/Mass:0.1
/Name:f13
/DiffuseColor:0.5019608
0.5019608 0.5019608
1
/Position:0
0.1 -6
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f14
/DiffuseColor:0.5019608
1 1
1
/Position:2
0.11 -6
/Orientation:0
0 1
-5
AddBoxShape
/Dimensions:2.1
0.2 2,.1
/Mass:0.1
/Name:f14_
/DiffuseColor:0.5019608
1 1
1
/Position:2
0.11 -6
/Orientation:1
0 0
-5
AddBoxShape
/Dimensions:2
0.2 2
/Mass:0.1
/Name:f15
/DiffuseColor:0
0 0
1
/Position:4
0 -6
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f16
/DiffuseColor:0.5019608
1 1
1
/Position:6
0.11 -6
/Orientation:0
0 1
5
AddBoxShape
/Dimensions:2.1
0.2 2.1
/Mass:0.1
/Name:f16_
/DiffuseColor:0.5019608
1 1
1
/Position:6
0.11 -6
/Orientation:1
0 0
-5
AddBoxShape
/Dimensions:0.2
0.42 8.4
/Mass:0.1
/Name:te1
/DiffuseColor:0.3490196
0.4745098 0.02352941 1
/Position:-1
0.1 -3
AddBoxShape
/Dimensions:0.2
0.42 8.4
/Mass:0.1
/Name:te2
/DiffuseColor:0.3490196
0.4745098 0.02352941 1
/Position:7
0.1 -3
AddBoxShape
/Dimensions:8.4
0.42 0.2
/Mass:0.1
/Name:te3
/DiffuseColor:0.3490196
0.4745098 0.02352941 1
/Position:3
0.1 1
AddBoxShape
/Dimensions:8.4
0.42 0.2
/Mass:0.1
/Name:te4
/DiffuseColor:0.3490196
0.4745098 0.02352941 1
/Position:3
0.1 -7
AddNewEntity
/Name:wumpus
/Position:
0 0.05
-4
AddCapsuleShape
/Radius:0.3
/Height:0.2
/Mass:0.1
/Position:0
1 0
/DiffuseColor:0.01176471 0.06666667 0.4392157
1
AddBoxShape
/Dimensions:0.1
0.3 0.1
/Mass:0.1
/Position:-0.15
0.6 0
/DiffuseColor:0
0 0.2509804
1
AddBoxShape
/Dimensions:0.2
0.1 0.1
/Mass:0.1
/Position:-0.25
0.5 0
/DiffuseColor:0
0 0.2509804
1
AddBoxShape
/Dimensions:0.1
0.3 0.1
/Mass:0.1
/Position:0.15
0.6 0
/DiffuseColor:0
0 0.2509804
1
AddBoxShape
/Dimensions:0.2
0.1 0.1
/Mass:0.1
/Position:0.25
0.5 0
/DiffuseColor:0
0 0.2509804
1
AddSphereShape
/Radius:0.05
/Mass:0.01
/Position:0.12
1.14 0.3
/DiffuseColor:1
0 0
1
AddSphereShape
/Radius:0.05
/Mass:0.01
/Position:-0.12
1.14 0.3
/DiffuseColor:1
0 0
1
AddDifferentialDriveEntity
/Name:base1
/Position:0
0.5 0
/Mass:2
/CreateService:true
AddLaserRangeFinderEntity
/Name:lrf1
/Position:0
0.4 0
/ParentEntity:base1
/CreateService:true
AddColorSensorEntity
/Name:color1
/Position:-0.3
0.3 0
/ParentEntity:base1
/Orientation:1
0 0
-90
/CreateService:true
AddColorSensorEntity
/Name:color2
/Position:0.3
0.3 0
/ParentEntity:base1
/Orientation:1
0 0
-90
/CreateService:true |