Robo Soccer With Microsoft visual C# .net
Ditulis oleh anggarizkiekayana di/pada Desember 7, 2008
Description:
Lab ini ditujukan untuk memberi pengalaman menggunakan Microsoft Robotics Studio dengan memanfaatkan Visual Studio dan .NET Framework. Dengan memahami labs ini, maka anda akan segera memahami cara memanfaatkan MSRS untuk pengembangan aplikasi Robot.
Microsoft Robotics Studio memberikan desain re-usable untuk menulis service. Desain ini memungkinkan Anda untuk menulis sebuah service untuk spesifikasi hardware yang umum dan kemudian menggunakan service tersebut untuk hardware robot yang berbeda platform.
Dalam tutorial ini, Anda akan belajar bagaimana membuat service dan dengan berdasarkan dari file konfigurasi (manifest file), service tersebut akan digunakan pada saat runtime untuk implementasi yang spesifik (berdasarkan manifest file tersebut).
Hardware Requirements:
Anda membutuhkan sebuah Lego NXT yang berbentuk Tribot dengan modifikasi pada motor port 1 dengan deskripsi pada gambar berikut ini:
Sofware Requirements:
Tutorial ini didesain untuk menggunakan Visual C#. Anda dapat menggunakan tools berikut ini:
1. Microsoft Visual C# 2005 Express Edition.
2. Microsoft Visual Studio Standard Edition.
3. Microsoft Visual Studio Professional Edition.
4. Atau Microsoft Visual Studio Team System.
Anda juga membutuhkan sebuah web browser (Internet Explorer atau Firefox) dan Microsoft Robotics Studio 1.5 (CTP May 2007).
Part 1 : Memulai
Kita tidak akan membuat service dari awal, akan tetapi kita akan menggunakan service yang sudah ada dan kemudian melakukan beberapa modifikasi. Service yang akan kita gunakan adalah RoboticsTutorial4. Aplikasi ini akan memberikan layanan kontrol robot tribot dengan menggunakan windows form. Kontrol yang didukung meliputi pergerakan robot ke 4 arah (maju, mundur, kanan, kiri). Dalam tutorial ini, kita akan menambahkan kontrol baru, yaitu menendang dan navigasi dengan menggunakan keyboard.
Membuka file RoboticsTutorial4
1. Pastikan Microsoft Robotics Studio 1.5 (CTP May 2007) telah terinstalasi dengan benar pada komputer Anda.
2. Pastikan komputer Anda memiliki sebuah perangkat bluetooth yang telah terkoneksi (paired) dengan NXT robot.
3. Bukalah Windows Explorer lalu navigasi pada “C:\Microsoft Robotics Studio 1.5 (CTP May 2007)\samples\RoboticsTutorials\Tutorial4”
4. Pada folder Tutorial4, lakukan copy and paste pada folder CSharp dan ubahlah namanya menjadi “RoboSoccer”.
5. Folder “RoboSoccer” terdapat pada “C:\Microsoft Robotics Studio 1.5 (CTP May 2007)\samples\RoboticsTutorials\Tutorial4\RoboSoccer”
6. Bukalah folder RoboSoccer dan buka file RoboticsTutorial4.sln
7. Anda akan masuk ke lingkungan pemrograman Visual Studio dan akan menemukan tampilan berikut :
8. Buka file RoboticsTutorial4Types.cs
Mendefinisikan Service Operations
RoboticsTutorial4Types.csmendefinisikan operasi yang dimiliki oleh sebuah service. Sedangkan kelas RoboticsTutorial4Operations mendefinisikan lima operasi yang dibuat oleh DssNewService yaitu: Stop, Forward, Backward, TurnLeft, TurnRight. Oleh karena itu kita akan menambahkan tiga operasi.
Part 2 : Memodifikasi Operation Service
9. Tiga operasi baru yang ditambahkan adalah: Kick, UnKick, dan StopKick.
public class RoboticsTutorial4Operations: PortSet<
DsspDefaultLookup,
DsspDefaultDrop,
Get,
Replace,
Stop,
Forward,
Backward,
TurnLeft,
TurnRight,
Kick,
StopKick,
UnKick> { }
Setiap operasi tersebut memiliki sebuah kelas yang mendefinisikan setiap operasi dan sebuah kelas yang mendefinisikan message body type. Tinjaulah kode berikut ini:
public class Stop : Submit<StopRequest, PortSet<DefaultSubmitResponseType, Fault>>
{
public Stop()
: base(new StopRequest())
{
}
}
[DataContract]
public class StopRequest { }
Kode tersebut mendefinisikan sebuah Operation dari kelas Stop yang diturunkan dari generic type Submit<TBody, TResponse>, memiliki sebuah body type StopRequest. Dengan cara yang sama Stop didefinisikan, file tersebut juga mengandung definisi untuk Forward, Backward, TurnLeft dan TurnRight. Service memberikan respon kepada operasi tersebut dengan mengirimkan perintah ke drive partner. Karena kita telah menambahkan tiga operasi baru, maka kita juga harus membuat kelas yang mendefinisikan operasi dan kelas yang mendefinisikan message body type dari setiap operasi tersebut.
10.Tambahkan kode berikut ini dalam fileRoboticsTutorial4Types.cs
public class Kick : Submit<KickRequest, PortSet<DefaultSubmitResponseType, Fault>>
{
public Kick()
: base(new KickRequest())
{
}
}
[DataContract]
public class KickRequest { }
public class StopKick : Submit<StopKickRequest, PortSet<DefaultSubmitResponseType, Fault>>
{
public StopKick()
: base(new StopKickRequest())
{
}
}
[DataContract]
public class StopKickRequest { }
public class UnKick : Submit<UnKickRequest, PortSet<DefaultSubmitResponseType, Fault>>
{
public UnKick()
: base(new UnKickRequest())
{
}
}
[DataContract]
public class UnKickRequest { }
Setiap operasi tersebut memiliki sebuah handler dalam kelas implementasi utama, RoboticsTutorial4, dalam file RoboticsTutorial4.cs. Handler untuk operasi Forward adalah ForwardHandler
Part 3 : Menambahkan Event Handler
11.Tambahkan kode berikut ini dalam fileRoboticsTutorial4.cs
using motor = Microsoft.Robotics.Services.Motor.Proxy;
12.Kemudian tambahkan kode berikut ini dalam kelasRoboticsTutorial4
13. Untuk menjalankan Kick, UnKick, dan StopKick kita harus menambahkan Handler dan untuk konstruksi
SetDrivePowerRequest dan posting dengan menggunakan _motorAPort menggunakan fungsi pembantu SetDrivePower.
14.Tambahkan kode berikut ini dalam kelasRoboticsTutorial4
[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
public virtual IEnumerator<ITask> KickHandler(Kick forward)
{
if (!_state.MotorEnabled)
{
yield return EnableMotor();
}
motor.SetMotorPowerRequest request =
new motor.SetMotorPowerRequest();
request.TargetPower = -0.8;
yield return Arbiter.Choice(
_motorAPort.SetMotorPower(request),
delegate(DefaultUpdateResponseType response) { },
delegate(Fault fault)
{
LogError(null, “Unable to Kick the Ball”, fault);
}
);
}
[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
public virtual IEnumerator<ITask> UnKickHandler(UnKick forward)
{
if (!_state.MotorEnabled)
{
yield return EnableMotor();
}
motor.SetMotorPowerRequest request =
new motor.SetMotorPowerRequest();
request.TargetPower = 0.1;
yield return Arbiter.Choice(
_motorAPort.SetMotorPower(request),
delegate(DefaultUpdateResponseType response) { },
delegate(Fault fault)
{
LogError(null, “Unable to UnKick the Ball”, fault);
}
);
}
[ServiceHandler(ServiceHandlerBehavior.Concurrent)]
public virtual IEnumerator<ITask> StopKickHandler(StopKick forward)
{
if (!_state.MotorEnabled)
{
yield return EnableMotor();
}
motor.SetMotorPowerRequest request =
new motor.SetMotorPowerRequest();
request.TargetPower = 0;
yield return Arbiter.Choice(
_motorAPort.SetMotorPower(request),
delegate(DefaultUpdateResponseType response) { },
delegate(Fault fault)
{
LogError(null, “Unable to Stop Kick the Ball”, fault);
}
);
}
Part 4 : Memodifikasi Windows Form
15. Kemudian bukalah fileRoboticsTutorial4Form[Design]dan tambahkan dua buah button menjadi seperti berikut ini:

16. Kemudian bukalah fileRoboticsTutorial4Form.csdan tambahkan dua event handler untuk kedua button tersebut:
private void btnKick_Click(object sender, EventArgs e)
{
_mainPort.Post(new Kick());
System.Threading.Thread.Sleep(250);
_mainPort.Post(new StopKick());
}
private void btnUnKick_Click(object sender, EventArgs e)
{
_mainPort.Post(new UnKick());
System.Threading.Thread.Sleep(250);
_mainPort.Post(new StopKick());
}
17. Kemudian bukalah property dariRoboticsTutorial4Formdan ubahlah propertyKeyPreviewmenjaditrue.
18. Kemudian tambahkan event handler Key_Down dan Key_Up:
private void RoboticsTutorial4Form_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.W:
_mainPort.Post(new Forward());
break;
case Keys.S:
_mainPort.Post(new Backward());
break;
case Keys.A:
_mainPort.Post(new TurnLeft());
break;
case Keys.D:
_mainPort.Post(new TurnRight());
break;
case Keys.Space:
_mainPort.Post(new Kick());
System.Threading.Thread.Sleep(250);
_mainPort.Post(new StopKick());
break;
case Keys.B:
_mainPort.Post(new UnKick());
System.Threading.Thread.Sleep(250);
_mainPort.Post(new StopKick());
break;
default:
_mainPort.Post(new Stop());
break;
}
e.Handled = true;
}
private void RoboticsTutorial4Form_KeyUp(object sender, KeyEventArgs e)
{
_mainPort.Post(new Stop());
e.Handled = true;
}
19. Kemudian bukalah property dariRoboticsTutorial4Formdan ubahlah propertyKeyPreviewmenjaditrue.
Part 5 : Menggunakan Manifest File
Anda telah selesai menambahkan fungsionalitas Kick pada robot. Anda dapat menggunakan manifest fileLego.NXT.TribotSoccer.manifest.xml. File tersebut sebenarnya merupakan modifikasi dariLego.NXT.Tribot.manifest.xml.Modifikasi yang dilakukan adalah dengan menambahkan partner baru yang disebut dengan MotorA.
<!– Start Lego Motor A –>
<ServiceRecordType>
<dssp:Contract>http://schemas.microsoft.com/2006/06/legonxtmotor.html
</dssp:Contract>
<dssp:PartnerList>
<dssp:Partner>
<dssp:Service>LEGO.NXT.MotorA.Config.xml</dssp:Service>
<dssp:Name>dssp:StateService</dssp:Name>
</dssp:Partner>
<dssp:Partner>
<dssp:Name>lego:Brick</dssp:Name>
</dssp:Partner>
</dssp:PartnerList>
<Name>motor:MotorA</Name>
</ServiceRecordType>
Definisi dari MotorA terdapat pada fileLego.NXT.MotorA.Config.xml.Oleh karena itu, Anda harus menambahkan fileLego.NXT.TribotSoccer.manifest.xmldan Lego.NXT.MotorA.Config.xml.Dalam folder “C:\Microsoft Robotics Studio 1.5 (CTP May 2007)\samples\Config”.
Part 6 : Menjalankan aplikasi
Untuk menjalankan aplikasi ini, Anda harus melakukan perubahan terhadap manifest yang digunakan.