CHOU
[MSRDS] Drive Service 알아보기 본문
시뮬레이션 로봇 이나 제가 만든 로봇을 Simpledashboard에 연결하기 위해서는 Drive Service를 이해해야 합니다^^. 오늘도 네이버 MSRS 카페에 김영준 수석님께서 올려주신 예제를 해보면서 이해해 보겠습니다.
1. 우선 프로젝트를 열어서 DSS 프로젝트를 생성합니다.
프로젝트를 설치폴더 명 아래 Samples 에 지정해서 저장하는 것이 좋습니다. 나중에 VPL 프로그램에서 서비스 추가가 쉽기 때문입니다.
음.. 그냥 OK 하시면 우선 될거 같습니다.
2. 프로젝트가 생성되면 우선 적으로 Microsoft.RoboticsCommon.proxy.dll 을 추가해서 서비스를 사용할 수 있게 해야 합니다.
다른 레퍼런스가 느낌표가 나올때가 있는데 이때는 더블클릭을 하거나 경로를 재 설정해서 참조가 올바르게 되게 해 주어야 합니다.
3. 프로젝트명types.cs 파일을 오픈하여 필요 없는 부분을 삭제하고, 아래와 같이 코드를 설정해 줍니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Microsoft.Ccr.Core;
using Microsoft.Dss.Core.Attributes;
using Microsoft.Dss.ServiceModel.Dssp;
using Microsoft.Dss.ServiceModel.DsspServiceBase;
using W3C.Soap;
namespace TestDriveService
{
public sealed class Contract
{
[DataMember]
public const string Identifier = "http://schemas.tempuri.org/2009/04/testdriveservice.html";
}
}
4. 다음은 프로젝트명.cs 파일을 오픈하여 아래와 같이 코드를 추가, 수정해 줍니다. 천천히 하면 별로 어려운 내용은 없습니다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
//add code
using System.Xml;
using Microsoft.Ccr.Core;
//add code
using Microsoft.Dss.Core;
using Microsoft.Dss.Core.Attributes;
using Microsoft.Dss.ServiceModel.Dssp;
using Microsoft.Dss.ServiceModel.DsspServiceBase;
using W3C.Soap;
using submgr = Microsoft.Dss.Services.SubscriptionManager;
//add code
using drive = Microsoft.Robotics.Services.Drive.Proxy;
namespace TestDriveService
{
[Contract(Contract.Identifier)]
[DisplayName("TestDriveService")]
[Description("TestDriveService service (no description provided)")]
//add code
[AlternateContract(drive.Contract.Identifier)]
class TestDriveService : DsspServiceBase
{
//AllowMultipleInstances = true -> false
[ServicePort("/TestDriveService", AllowMultipleInstances = false)]
//add code
private drive.DriveOperations _mainPort = new drive.DriveOperations();
public TestDriveService(DsspServiceCreationPort creationPort)
: base(creationPort)
{
}
protected override void Start()
{
base.Start();
}
//add code
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public virtual IEnumerator<ITask> UpdateHandler(drive.SetDrivePower update)
{
LogInfo(LogGroups.Console, "[[Drive 수신값]]: " + update.Body.LeftWheelPower.ToString() +
" " + update.Body.RightWheelPower.ToString());
update.ResponsePort.Post(DefaultUpdateResponseType.Instance);
yield break;
}
}
}
빨간 부분만 유의해서 추가해 주면 됩니다.
5. 코드 추가가 완료 되었으면 컴파일 해주고, VPL 프로그램을 열어서 아래 그림과 같이 액티비티를 추가해 줍니다. 이때 두 액티비티간에 링크는 없어도 됩니다.
6. 실행해 보면 아래와 같은 대시 보드가 생성되고 디버그 창이 보이는데, 대시보드를 connect 하여 테스트 해보면 아래와 같은 디버그 결과를 보실 수 있습니다^^
Machine 창에서 localhost 를 해주고 connect 를 누르면 아래 뭐가 하나 뜨는데 그 상태에서 drive를 누르면 마우스로 조종이 가능한 대시보드 구조입니다.
피드백으로 수신값이 보이는데 움직일 때마다 결과가 나타납니다^^ 아래 동영상은 예제를 실행한 동영상 입니다.
7. 간단히 드라이브 서비스의 클래스와 인터페이스를 보겠습니다.
드라이브 서비스는 DriveState를 통해 모터 상태와 관련 된 값을 저장하고, DriveOpearation을 통해 다른 서비스 데이터와 주고 받습니다.
참고자료
1. http://cafe.naver.com/msrskorea
MSRDS 네이버 공식 카페-> 드라이브 서비스 예제(김영준 수석 님 작성)
2. 예제 코드 파일