14장: Intelligent robot control programming based on wireless
network
블루투스 설정하기
레고에서 제공하는 블루투스 연결을 통해 컴퓨터와 레고 NXT를 연결하여 컴퓨터를 이용한 원격 조정을 가능하게
해준다. 이를 위해 먼저 레고의 블루투스 연결을 활성화 시켜줘야 한다. 과정은 다음과 같다.
레고에서 블루투스 연결을 활성화 시켜준다. 활성화를 시키는 방법은 아래와 같이 NXT를 직접 이용하여
블루투스 상태를 온(On)으로 바꿔준다.
[그림 1] 마인드 스톰 시작화면

[그림 2] 블루투스 온(On)
그 다음 레고를 PC옆에 둔 상태에서 PC의 블루투스 관리자를 실행시킨다. 블루투스 관리자는 트레이 아이콘에
등록되어있는 Bluetooth 바로가기를 실행하면 된다.
[그림 3] 트레이에 있는 블루투스 아이콘
[그림 4] 블루투스 환경 창
새로운 장치추가를 실행한다. 블루투스 장치를 추가하는 방법은 블루투스 환경 창의 다음 링크를 클릭하여 추가할
수 있다.
[그림 5] 새로운 장치 추가의 위치
그런 다음 나온 창에서 ‘다음’ 버튼을 눌러 과정을 진행하자. 그러면 이제 아래와 같은 창이 나올 것이다.
창이 나왔다면 검색된 장치에서 NXT에 해당하는 장치를 선택한다. 만약 장치가 제대로 표시되지 않았다면 레고 마인드스톰 NXT가
켜져 있는지 확인하고, 거리가 너무 떨어지지 않았는지 확인해 본다. 만약 그래도 장치를 찾을 수 없다면 다시 처음 과정으로
돌아가 다시 시도해 본다
[그림 6] 블루투스 장치 검색
다음 과정으로 진행하여 연결을 계속한다. 이제 다음과 같은 창이 뜰 것이다.
[그림 7] 보안코드 입력
만약 NXT에서 먼저 Search 버튼을 눌러 진행하였다면 이런 창 대신 보안키만 입력할 수 있는 창이 뜰
것이다. 이제 보안코드에 1234를 입력한다. 1234 이외에 알파벳을 이용해 비밀번호를 입력할 수도 있으나, 마인드스톰에서
해당하는 보안 키를 버튼을 이용해 이리저리 움직여가며 입력해야 하기 때문에 약간 불편할 수도 있다. 보안에 특별히 문제가 없다면
테스트를 위해 1234를 사용하는 것을 권장한다.
마지막으로 연결 후에 연결된 시리얼 포트번호를 확인한다. 시리얼 포트는 로봇과 MSRDS를 연결하기 위한
통로로 사용될 것이며, 만약 COM5라면 MSRDS에서는 5라는 숫자 하나로 사용될 것이다.
[그림 8] 블루투스 연결 확인
[그림 9] 블루투스 연결 확인 완료
블루투스를 기반으로 한 레고 – MSRDS 연결
블루투스로 연결된 레고 로봇을 MSRDS를 이용하여 원격제어하는 방법을 배울 것이다. 블루투스 연결은 이미
되어 있는 상태에서 시작한다.
먼저 VPL을 실행시킨 뒤 “Lego NXT Brick (v2)” 라고 되어있는 서비스를 추가한다. 해당
서비스를 추가하면 다음과 같은 블록이 생길 것이다. 그 다음 블록을 선택하여 오른쪽 Properties 창을 확인한다.
[그림 10] LegoNXTBrick과
Properties
Configuration에 None이라고 되어 있는 것을 Set initial configuration으로
바꿔준다. 그리고 SerialPort에 해당하는 숫자를 써준다. 만약 블루투스를 연결했을 때 COM4 직렬포트에 연결했다면,
4를 적어 넣으면 된다.
LegoNXTBrick이 추가되었다면 이제 Drive를 추가할 차례다. VPL의 서비스 중 “Lego NXT
Drive (v2)”를 추가한다.
[그림 11] LegoNXTDrive와
Properties
마찬가지로 Properties에서 각각의 상태를 바꿔준다. Partners에는 기존에 추가해 두었던
LegoNXTBrickv2를 설정한다. 그리고 DriveState에는 레고 로봇에 연결되어 있는 포트에 따라 각각 설정한다.
설정이 끝났다면 테스트를 위해 “Simple DashBoard” 서비스를 추가하여 테스트해본다. 테스트
방법은 기존의 시뮬레이션 환경 테스트 방식과 같으며, 정상적으로 블루투스 연결이 적용되었다면 레고 로봇에서 ‘삑-‘하는 크고
짧은 비프음이 들릴 것이다.
Simple Dashboard를 이용하여 블루투스 연결과 실행의 테스트가 끝났다면 이제 표준 Drive명령을
이용하여 레고 로봇을 제어해 볼 차례이다. 표준 Drive명령은 매우 간단한데, double형 상수 값 2개를 join을 이용해
각각 left, right값으로 전달해 주면 된다.
[그림 12] 기본적인 LegoNXTDrive
서비스 제어 방법
Simple Dashboard를 추가하여 수동으로 움직이는 데 성공했었다면 이 역시 쉽게 성공했을 것이다.
그렇지 않다면 값을 제대로 전달하지 않았거나 join블록과 drive블록 간의 연결이 잘못되었을 가능성이 크다.
그 다음엔 VPL에 레고 로봇의 센서를 인식할 수 있는 부분을 만들어서 센서의 입력에 따라 로봇의 움직임이 바뀌도록 만들어
보자. 먼저 범퍼를 감지할 수 있는 서비스로 Lego NXT Touch (v2)를 추가한다.
[그림 13] 범퍼 연결 테스트
먼저 위와 같이 범퍼로부터 결과가 제대로 전달되는지 확인하도록 콘솔창에 범퍼로부터 들어오는 정보를 표시해
보도록 한다. 범퍼와 Calculate 블록과의 연결은 ContacctSensorUpdate를 사용한다.
[그림 14]
ContactSensorUpdate
연결에 성공했다면 테스트를 통해 화면에 정상적으로 표시가 되는지 확인하도록 한다.
이제 범퍼로부터 입력이 들어오면 로봇이 뒤로 가도록 설정해 보자. 이미 필요한 모든 과정은 위에서 다루었다.
다음과 같이 VPL을 구성한다.
[그림 15] 완성된 VPL
터치센서가 눌렸을 때 로봇이 뒤로 가는 것을 확인할 수 있을 것이다.
MSRDS를 이용한 X-bot 제어
X-bot은 yujin robot에서 제작한 연구용 로봇이다.
각자 움직이는 두 개의 바퀴로 전진 후진과 회전이 가능하며, 범퍼 센서를 가지고 있다. USB 단자를 통해
컴퓨터의 USB 시리얼 포트로 연결이 가능하다.
[그림 16] USB 시리얼 포트로 연결된
X-bot과 PC
이 경우 간편한 조작을 위해 MSRDS에서 호환이 가능한 XBOX 컨트롤러를 추가로 연결했으며, Simple
DashBoard에서 지금까지 시뮬레이션 환경에서 로봇을 조작했던 것과 동일하게 로봇을 제어 할 수 있다. 다만 다른 점이
있다면 컨트롤러를 이용해서 로봇을 움직일 수 있다는 점이다.
하지만 이러한 로봇 제어의 구현은, 시뮬레이션 환경 상에서의 로봇이 아닌 실제 로봇으로 바뀌었다는 것뿐이지,
특별히 추가된 내용이 없다.
지금부터는 MSRDS Manifest와 SPL을 이용하여 X-bot과 연결된 PC에서 로봇을 제어하기 위한
서버를 구축하여, 다른 PC에서도 로봇을 조작할 수 있기 위한 작업을 한다.
가장 먼저 해줘야 하는 것은 보안상의 문제의 해결이다.
로봇의 원격 제어를 하기 위해서 해결해야 하는 보안 문제는 크게 3가지가 있다.
1.
Window또는 다른 O/S에서 참조하는 접근 가능한 Host의 정의를 바꿔줘야 한다.
2. MSRDS의 DSSHost 설정에서 보안 항목을 없애줘야 한다
3. 인터넷 제공자가 정의한 보안 항목을 통과해야 한다.
우선 Window에서 접근 가능한 Host를 가려내기 위해 참조하는 파일의 내용을 바꿔줘야 한다. 사용하는
2개의 PC에서 각각 C드라이브 -> WINDOWS ->
system32 -> drivers -> etc 폴더안의 “hosts”
파일에 서로의 IP주소와 PC이름을 추가시켜 준다.
[그림 17] hosts 내용 변경
다음으로 해 줘야 하는 것은 MSRDS의 DSS 보안을 해제해주는 것이다. MSRDS가 설치된 폴더 하위의
bin 폴더 안의 DssHost32.exe.config 파일과 DssHost.exe.config 파일의 “Security” 탭을
주석 처리해주도록 하자.
[그림 18] MSRDS DSSHost
Security 해제
마지막 문제는 인터넷 제공자가 정의한 보안 항목인데, 이를 위해선 우선 방화벽을 모두 해제해주어야 한다.
또한, 학교나 공공기관 같은 단체에서 공유하는 인터넷 제공자를 사용하면 보안상의 문제로 PC간의 통신이 불가능한 경우가 많다.
이를 해결하기 위해서는 개인 공유기를 이용하여 보안이 없는 무선 인터넷을 사용하면 된다.
이것으로 원격제어를 위한 보안 설정이 모두 끝났고 지금부터는 실제 구현을 위한 작업들을 차례로 수행하도록
한다.
- 서버를 구축하는 host PC에서의 작업들
우선 X-bot을 제어에 관한 정보를 서버에 주어주기 위한 Manifest 파일을 만들어 준다.
MSRDS 관련 프로그램 중 DSS Manifest Editor를 이용하여 작성해주면 된다.
[그림 19] Manifest file
X-bot의 본체에 관한 정보와 제어에 필요한 모터, 센서에 대한 정보가 들어있으며, host PC에 장착된
Webcam도 추가해 준다.
마지막으로 SPL을 이용해 manifest 파일을 실행시켜주면, X-bot의 원격제어를 위한 host PC
환경 구축이 끝난다. 이 때, 모터를 제외한 나머지 서비스 즉, 센서와 Webcam은 별도의 포트를 이용하여 활성화 시켜줘야만
한다.
[그림 20] SPL로 구현한 x-bot
hosting
이렇게 host PC의 서버가 구축 된 뒤, 다른 컴퓨터에서 간단한 VPL 코드를 통해 X-bot의 원격
제어가 가능하다
[그림 21] x-bot의 원격 제어를위한
VPL 코드
Host PC의 이름과 사용하는 포트 번호를 콜론( : )으로 구분하여 SPL(Remote) 서비스에 연결
해주기만 하면 간단하게 원격 제어를 할 수 있다.
[그림 22] 원격 제어중인 Simple
Dash Board
위의 DashBoard를 보면 hongnc10이라는 이름을 가진 host PC에 50001번 포트를 사용해
x-bot에 연결 된 것을 확인 할 수 있다.
[그림 23] Webcam 화면
또한 인터넷 익스플로러 창에서 host PC의 이름(또는 IP)과 포트 값을 이용해 서버에 접속하면
Webcam의 영상도 실시간으로 확인 할 수 있다.
MSRDS 시뮬레이션과 실제 로봇을 동시에
제어하기
앞의 문서들에서 블루투스 연결을 이용해 컴퓨터로 레고 로봇을 원격 제어하는 방법을 살펴보았다. 이번에는
로봇의 움직임이 시뮬레이션 환경에서도 동일하게 나타나도록 하는 것에 대해 알아보게 될 것이다.
먼저 레고 블루투스 연결과 시뮬레이션 환경을 세팅해 주자. 새로운 다이어그램에 만들어 줘도 좋고 기존
다이어그램에 추가해도 좋다. 여기서는 VPL을 실행하고 오직 한번 사용하는 부분이므로 Diagram0를 만들어 따로 관리하였다.
[그림 24] 스크립트 파일과 레고를 VPL과
연결
LegoTest.txt의 내용은 다음과 같다
[그림 25] LegoTest SPL
기본 시뮬레이션 환경을 만들고 거기에 이륜구동로봇 myrobot을 추가하고 범퍼를 추가하고 LRF 센서를
추가하였다. 그리 어렵지 않은 스크립트이므로 쉽게 만들 수 있을 것이다.
그 다음은 레고 로봇과 시뮬레이션 로봇을 서로 다른 서비스로 엮어준다. 각각의 로봇을 “SPL
(Simple) Differential Drive” 서비스로 제어할 것이다. 이 때, 두 개의 서비스는 서로 독립되어 있어야
한다. 즉, 서로 다른 이름을 가진 두 개의 “SPL (Simple) differential Drive” 서비스가 필요하다는
것이다. 아래의 그림을 보면 좀 더 이해하기 쉬울 것이다.
[그림 26]
SPLSimpleDifferentialDrive 연결하기
SPLSimpleDifferentialDrive에는 스크립트에서 만들어 두었던 myrobot을 연결해 주고
SPLSimpleDifferentialDrive0에는 LegoNXTBrickv2에 해당하는 lego를 연결해 준다. 이제 해당
서비스에 SetDrivePower를 해주는 것으로 LegoNXTDrivev2에 SetDrivePower를 하는 것과 동일한
효과를 얻을 수 있다.
이제 여기에 키보드를 이용한 동시 제어를 시도해보자. 먼저 여기서는 앞으로 가는 키를 ‘B’로, 뒤로 가는
키를 ‘F5’로, 멈추는 키를 ‘ESC’로, 왼쪽 회전은 ‘PageUp’, 오른쪽 회전은 ‘PageDown(Next)’를 사용할
것이다. 이러한 키들을 사용하는 이유는 파워포인트 프레젠테이션을 위한 Wireless Mouse Pointer를 이용해 키보드
대신 원격으로 시뮬레이션과 레고 로봇을 조종할 수 있게 하기 위해서이다.
외부로부터 키 입력을 받기 위해 SPL에 포함된 HelloAppsUtilTextBoxDialog 서비스를
추가한다. 그리고 키 값에 따라 다른 행동을 할 수 있도록 If 문을 활용한다.
[그림 27] 키보드 이벤트를 처리할 수 있는
VPL
다이어그램을 간결하게 하기 위해 각각 Go, Stop, Back, Left, Right 액티비티를 만들어
구현하였다. 각각의 액티비티는 거의 비슷한 구조를 가지고 있다. 가장 먼저 Go의 다이어그램을 보면 다음과 같다.
[그림 28] Go 액티비티 구현
액티비티를 만든 뒤 이름을 Go로 만들어 주고 위와 같이 구현한다. 또는 인풋 값의 Properties를
변경하여 처음부터 Join을 통해 나온 값으로 인식하도록 만들어 줄 수도 있으나, 여기선 가장 쉬운 방법으로 구현하였다. Go에
대해 살펴보면 각각의 SPLSimpleDifferentialDrive에 left에 0.5, right에 0.5 값을 전달하여 두
개의 로봇이 앞으로 전진하도록 하였다.
마찬가지로 Stop 액티비티는 left와 right값을 각각 0으로 전달, Back 액티비티는 left와
right값을 각각 -0.5, -0.5로 전달, Left 액티비티는 left를 -0.3, right를 0.3으로 전달,
Right 액티비티는 left를 0.3, right를 -0.3으로 전달하면 될 것이다.
위의 방식대로 VPL을 모두 구현하였다면 다음과 같은 화면이 나타나고 테스트를 시작할 수 있을 것이다.
Notify Keyboard Event 체크박스를 온으로 바꾼 뒤 지정한 키, B, escape, F5, PageUp,
PageDown을 써서 로봇과 시뮬레이션 환경을 동시에 조종해보자.
[그림 29] TextBoxForm을 이용한
로봇 테스트
이제 기존에 사용했던 범퍼를 이용하는 다이어그램을 사용하여 If문의 결과로 세팅했던 DrivePower를
여기서 새로 만든 액티비티를 사용하여 구현하면 될 것이다. 새 다이어그램을 추가한 뒤 다음 블록들을 추가해 주자
[그림 30] 레고 범퍼센서 연결
마찬가지로 LegoNXTTouchSenser (v2)를 추가한 뒤 Set Configuration에서
LegoNXTBrickv2를 선택한다. 그 다음 위와 같이 연결하여 테스트한다. 잘 되었다면 범퍼가 눌렸을 때 로봇이 뒤로 가는
모습을 볼 수 있을 것이다.
하지만 이런 식으로 다이어그램을 구상할 경우, NXT로봇의 범퍼부분 충돌에 의한 동작 반영은 제대로 되지만,
시뮬레이션 상의 로봇이 범퍼와 충돌했을 때에 대해서는 제대로 구현이 되지 않는다. 이를 위해 시뮬레이션 상의 로봇의 범퍼를
연결해 주자. SPL (Sensor) Bumper 서비스를 이용하여 LegoTest.txt 파일에서 지정하였던 범퍼센서의 이름을
연결해 준 뒤, 해당 블록을 복사하여 ContactSensorNotify를 이용해 범퍼가 눌렸을 경우 후진하도록 한다.
[그림 31] 시뮬레이션 상의 범퍼 센서
연결하기
이렇게 해서 시뮬레이션 상의 로봇이 벽에 부딪혔을 때도 로봇이 뒤로 갈 수 있도록 설정되었다. 여기서
액티비티를 더 추가하거나 수정함으로써 로봇이 센서의 감지에 따라 여러 가지 다른 행동을 할 수 있도록 구성할 수 있을 것이다.
전 장까지의 내용이 가상 환경상의 로봇 시뮬레이션에 관한 내용이었다면, 이번 장에서는 실제 로봇과
MSRDS를 연동하여 제어하고 동시에 시뮬레이션까지 연동하는 것을 배워보았다. 이번에 배운 내용을 통해, 실제 로봇 제어에 대한
감각과 원리를 익히고, 나아가 시뮬레이션 환경과 실제 로봇 제어의 차이를 느껴봤기를 바란다.