CHOU

[MSRDS] Drive Service 알아보기 본문

Tech/Microsoft Products

[MSRDS] Drive Service 알아보기

chobabo 2009. 4. 14. 13:45


 시뮬레이션 로봇 이나 제가 만든 로봇을 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. 예제 코드 파일