6장: VPL을 이용한 로봇 시뮬레이션 프로그램 개발


  로봇을 구성하는데 있어서 중요한 요소에는 어떤 것들이 있을까? 색깔을 감지하는 Color Sensor, 충돌을 감지하는 Bumper Sensor 등의 센서도 그 중 하나일 것이고, 로봇이 균형 잡힌 움직임을 할 수 있게 해주는 훌륭한 Body 디자인도 그 중 하나라고 할 수 있을 것이다. 그러나 그 무엇보다 기본이 되는 것은 역시 로봇의 움직임을 줄 수 있게 해주는 바퀴(Wheel)와 관절(Joint)라고 할 수 있을 것이다.


[그림 1] 화성탐사 로봇

  위 로봇은 화성 탐사 로봇으로 유명한 “스피릿”이다. 장애물을 감지하는 센서 바닥의 상태를 확인하는 센서, 소리를 감지하는 센서 등 다양한 센서들, 탐사과정에서의 결과물들을 저장해주는 두뇌(컴퓨터), 동력을 전달해주기 위한 태양열 집광판 등 정말 다양한 기능을 가지고 있지만 가장 기본이 되는 바퀴가 있기 때문에 화성표면을 돌아다니며 탐사를 할 수 있다.


[그림 2] KAIST 휴보

  다음 로봇은 KAIST에서 개발한 휴머노이드형 로봇인 “휴보”이다. 이러한 휴머노이드 로봇은 인간과 같은 움직임을 보일 수 있게 만들어지며, 걷기 인사하기 악수하기 등 인간이 할 수 있는 기본적인 동작들을 취할 수 있게 되어있다. 이러한 로봇이 만들어지기 위해서는 중심을 잡기 위한 로봇공학적인 디자인과 인간과 흡사한 움직임을 주기 위한 프로그램 등 다양한 요소들이 필요하지만, 이 역시 가장 기본이 되는 관절이 없다면 만들어 질 수 없는 로봇이다.


[그림 3] 로봇 팔

  이번 Lecture에서는 MSRDS상에서 로봇의 기본이 되는 바퀴(Wheel)와 관절(Joint)를 구현해보도록 하자.



Script언어로 바퀴 달린 로봇 만들기

  Script언어인 SPL에서는 바퀴 두 개 달린 로봇인 Differential Wheel Entity를 간단하게 추가 할 수 있다. SPL로 바퀴 두 개 달린 로봇을 제작하고 간단한 움직임을 줘보도록 하자.

1)    SPL을 실행한다

2)    Environment 탭에서 StartSimulataionEngine을 추가한다

3)    StartSimulation의 옵션인 /FileName:"SimState/basicsim.xml”을 더블 클릭하여 추가한다.

4)    지금까지 결과를 F5를 눌러 확인한다.


[그림 1] basicsim.xml의 실행화면

5)    Entities 탭에서 AddDifferentialDriveEntity를 추가한다.

6)    AddDifferentialDriveEntity의 이름은 base1으로 한다 -> /name:base1

7)    AddDifferentialDriveEntity의 옵션인 /CreateService:true를 더블 클릭하여 추가한다.
-> DashBoard에서 생성된 로봇을 사용하기 위해서 해줘야 한다.

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

 
[그림 2] 화면 중앙에 추가된 Differential Wheel Entity

9)    간단하게 추가된 로봇을 조작해보자

10)    DashBoard를 이용한 조작을 위해 Services 탭에서 SimpleDashboard를 더블클릭하여 추가한다.

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

[그림 3] 추가된 DashBoard

12)    DashBoard에서 Connect 버튼을 누른다

13)    위에서 제작한 로봇이 (base1)으로 시작하는 서비스로 추가 되어있는걸 확인 할 수 있다.

14)    추가된 서비스를 클릭한 후 좌측 상단의 Drive버튼을 클릭한다.

15)    MSRDS 시뮬레이션 환경을 보면서 십자모양이 있는 구를 클릭 & 드래그를 통해 조작함으로써 로봇이 움직이는 걸 확인 할 수 있다.

16)    SPL명령어를 통해 로봇을 조작해보자.

17)    SPL 코드에서 SimpleDashBoard부분을 주석처리 하자(Comment Out)

18)    Action 탭에서 SetDrivePower를 더블 클릭하여 추가한다.

19)    SetDrivePower중 /TargetName 옵션을 base1으로 하자 -> /TargetName:base1

20)    좌측 바퀴와 우측 바퀴에 각각 0.5씩 동력 값을 주자 -> /LeftWheelPower:0.5
                                                  /RightWheelPower:0.5

21)    동력값은 0부터 1 사이의 double형 변수로 주어져야 한다.

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


[그림 4] 전진하고 있는 로봇

23)    로봇이 전진 하는 것을 확인 할 수 있다.



Script언어로 관절 구현하기


[그림 5] MSRDS에서 구현된 간단한 Joint의 모습

1)    SPL을 실행한다

2)    Environment 탭에서 StartSimulataionEngine을 추가한다

3)    StartSimulation의 옵션인 /FileName:"SimState/basicsim.xml”을 더블 클릭하여 추가한다.

4)    지금까지 결과를 F5를 눌러 확인한다.

5)    Entities 탭에서 AddNewEntity를 추가한다.

6)    새 Entity의 이름은 ent1으로 한다 -> /Name: ent1

7)    0.8높이의 기둥을 바닥에 붙여서 세우기 위해 Entity의 위치는 (0,0.4,0)으로 한다.
-> /Position:0 0.4 0

8)    몸통 부분이 될 부분이기 때문에 Entity의 속성을 고정으로 해준다.
-> /IsKinematic:true ; (절대 움직이지 않는다.)

9)    Entity의 모양을 Box로 하기 위해 AddBoxShape를 추가한다.

10)    크기는 가로 세로 0.2에 높이 0.8로 설정한다. -> /Dimensions:0.2 0.8 0.2 ; (x, y, z)

11)    질량과 색깔을 적절히 지정해준다.

12)    현재까지 과정을 F5를 눌러 확인한다.


[그림 6] 시뮬레이션 환경에 추가된 몸통부분

13)    팔을 만들기 위해 새로운 Entity를 추가한다. (AddNewEntitiy)

14)    Entity의 이름을 ent2로 한다.

15)    팔 Entity의 위치를 몸통의 오른쪽 상단에 붙을 수 있게 설정해 준다. (단 Parent를 ent1으로 설정해 주었기 때문에, ent원의 중심을 원점으로 계산한다.)
-> /Position: 0.3 0.5 0

16)    팔과 몸통을 연결하기 위해 팔 Entity(ent2)의 Parent Entity를 몸통 Entity(ent1)으로 설정한다. -> /ParentEntity:ent1

17)    Entity의 모양을 Capsule로 하기 위해 AddCapsuleShape를 추가한다.

18)    반지름을 0.1, 높이를 0.4로 설정한다. -> /Radius:0.1 /Height:0.4

19)    질량과 색깔을 적절히 지정해 준다.

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


[그림 7] 시뮬레이션 환경 상에 추가된 팔

21)    팔을 움직이기 위해 Joint Entity를 추가한다. -> AddJoint

22)    이름은 joint1으로 한다. -> /Name: joint1

23)    Child Entity는 팔이므로 ent2로 설정한다. -> /ChildEntity:ent2

24)    팔 Entity(ent2)를 기준으로 Joint가 생성되는 위치를 설정해준다. (캡슐 상단에 관절이 생성되게 해준다.) -> /JointPosition:0  0.2  0

25)    Joint에서는 3가지 방향으로 관절의 회전이 가능하다. -> Twist; x축 Swing1;. y축 Swing2; z축

26)    X축으로 회전을 주기 위해 Twist속성을 추가한다. -> /TwistMode:free

27)    현재까지 과정을 F5를 눌러 확인한다.


[그림 8] 관절(Joint)가 생성된 팔과 몸통

28)    간단하게 관절을 조작해 보자.

29)    팔을 90도 들어올리는 동작을 하기 위해 Action 탭에서 SetAngularDriveOrientation을 추가한다.

30)    Target을 팔 Entity(ent2)로 설정한다. -> /TargetName:ent2

31)    X축 방향으로 90도 회전하는 명령을 준다. -> /Orientation:1  0  0  90

32)    현재까지의 과정을 F5를 눌러 확인한다.


[그림 9] 90도 들어올려진 팔 Entity

33)    관절의 위치를 기준으로 팔 Entity가 90도 회전한 것을 확인 할 수 있다.

  지금까지 MSRDS에서 바퀴 달린 로봇과 관절 로봇을 구현하는 법에 대해 간단하게 알아보았다. 이 두 가지를 잘 이용하면, 다양한 기능을 수행하는 로봇을 만들 수 있을 것이다.

  이번 장에서는 로봇을 조작 할 때 Script언어와 DashBoard만을 이용해 간단하게 조작하는 방법만 언급했지만, 이후 로봇 시뮬레이션에 대해 다루게 될 강좌에서는 VPL을 사용해 움직임을 좀 더 복잡하게 하거나 환경에 대처하여 로봇이 특정한 움직임을 가지게 되는 방법을 배우게 될 것이다.