A robot felépítése elég egyszerű, egy háromkerekű robotról van szó, melyre egy kommunikációs egység van rakva, ennek segítségével kommunikál a robot a bázissal és a mentőrobottal.
A három kerék közük a két oldalsó nagy méretű kerék, mindkettőt egy-egy motor hajt meg. A robot tud előre és hátrafelé haladni, valamint helyben forogni a motorok megfelelő irányú forgatásával. A harmadik kerék egy kis kerék, amely a függőleges tengelye mentén el tud fordulni. Erre a megoldásra azért van szükség, mert a kerék rögzítése esetén a robot – a kereket hajtó motorok gyengesége miatt - nehezen tud fordulni álló helyzetben.
A kommunikációs egység a bázissal és a mentőrobottal is kommunikál, mindkettőtől fogad üzeneteket, a mentőrobotnak küld is.
A mentőrobot egy lánctalpas robot, melynek két hátsó kerekét egy-egy motor hajtja meg. A robot felső részén a kommunikációs egység foglal helyet, a robot első részén pedig ütközésérzékelő egységek vannak.
A mentőrobot a meghibásodott robothoz hasonlóan tud előre és hátra haladni, valamint helyben forogni.
A robot első részén lévő ütközésérzékelők a meghibásodott robot keresésénél használatosak: a kommunikáció a meghibásodott robottal akkor indul, amikor a robot nekiütközik az „elveszett” robotnak, tehát amikor megtalálja a másik robotot.
A kommunikációs egység a bázissal és a meghibásodott robottal is kommunikál, a bázissal nagy hatótávolságú kommunikációval, míg a meghibásodott robottal kis hatótávolságú kommunikációval.
Az 1. program elég egyszerű, a robotok kommunikációs képességeit teszteltük vele. Kézi irányítással a mentőrobotot a meghibásodott rövid távú kommunikációs hatósugarába vezettük. Ezután a mentőrobot utasításokat küldhetett a meghibásodottnak, amelyek alapján ez utóbbi elmozdult. Ha a meghibásodott robot kikerült a kommunikációs hatósugárból mozdulatlan maradt, mivel nem vette az üzeneteket. A meghibásodott robot addig nem fogta az üzeneteket , amíg kézi irányítással vissza nem vezettük a mentőrobotot a közelébe.
int vege = 0;
int m = 0, mm = 0;
sub waitmsg()
{
mm = m;
while (mm == m)
{
m = Message();
}
PlaySound(0);
}
task main()
{
SetTxPower(TX_POWER_HI);
Off(OUT_A + OUT_B + OUT_C);
Set
Power(OUT_A + OUT_B + OUT_C, 3);
ClearMessage();
while (vege == 0)
{
waitmsg();
if (m == 18) { OnFwd(OUT_A + OUT_C); }
if (m == 12) { OnRev(OUT_A + OUT_C); }
if (m == 14) { OnFwd(OUT_C); OnRev(OUT_A); }
if (m == 16) { OnFwd(OUT_A); OnRev(OUT_C); }
if (m == 20) {vege = 1;}
Wait(50);
Off(OUT_A + OUT_C);
}
Off(OUT_A + OUT_B + OUT_C);
}
int vege = 0;
int m = 0, mm = 0;
int u = 0;
sub waitmsg()
{
mm = m;
while (mm == m)
{
m = Message();
}
PlaySound(0);
}
task main()
{
SetTxPower(TX_POWER_LO);
if (m == 6) { OnFwd(OUT_A); OnRev(OUT_C); }
if (m == 9) { SendMessage(18); }
if (m == 1) { SendMessage(12); }
if (m == 7) { SendMessage(14); }
if (m == 3) { SendMessage(16); }
if (m == 10) { SendMessage(20); vege = 1;}
if (m == 5) { SendMessage(42); }
Wait(50);
Off(OUT_A + OUT_C);
}
Off(OUT_A + OUT_B + OUT_C);
}
A 2. program már a tényleges mentőakciót szimulálta. Kézi irányítással a mentőrobotot a meghibásodott robot irányába fordítottuk, majd a 8. üzenettel elindítottuk egyenesen. A mentőrobot egészen addig haladt előre amíg neki nem ütközött a meghibásodottnak. Ekkor rövid tolatás után 42. üzenettel tudatta a meghibásodottal, hogy rátalált (ezt még nagy hatótávolságú kommunikációval tette). Ezután a mentőrobot rövid hatótávolságú kommunikációra váltott és folyamatosan üzeneteket küldözgett. A meghibásodott robot addig fordult jobbra, amíg már nem tudta fogni a mentőrobot üzeneteit. Ezt követően a meghibásodott robot konstans ideig balra fodult (annyira, hogy a mentővel egy irányban álljanak), elküldte a mentőnek a 12. üzenetet, amely azt jelenti, hogy indulhatnak vissza, majd megindult előre. Kis idő múltán a mentő is elindult, és közösen érkeztek meg a kiinduló pontra.
int vege = 0;
int m = 0, mm = 0;
int i;
sub waitmsg()
{
mm = m;
while (mm == m)
{
m = Message();
}
PlaySound(0);
}
task main()
{
SetTxPower(TX_POWER_LO);
Off(OUT_A + OUT_B + OUT_C);
SetPower(OUT_A + OUT_C, 4);
ClearMessage();
while (vege == 0)
{
waitmsg();
if (m == 42)
{
ClearMessage();
Wait(200);
ClearMessage();
OnFwd(OUT_A); OnRev(OUT_C);
until (Message() != 0) ;
m = Message();
i = 5;if (m >= 100) i = m - 100;
until (m == 0)
{
Off(OUT_A + OUT_C);
ClearMessage();
Wait(100);
OnFwd(OUT_A); OnRev(OUT_C);
Wait(30);
Off(OUT_A + OUT_C);
Wait(70);
m = Message();
if (m >= 100) i = m - 100;
}
OnFwd(OUT_C); OnRev(OUT_A);
Wait(130);
Off(OUT_A + OUT_C);
SendMessage(12);Wait(100);
OnFwd(OUT_A + OUT_C);
while (i >= 0) { i--; Wait(30); }
Off(OUT_A + OUT_C);
}
if (m == 14) { Off(OUT_A + OUT_C); }
if (m == 5) { Off(OUT_A + OUT_C); }
if (m == 20) {vege = 1;}
}
Off(OUT_A + OUT_B + OUT_C);
}Mentőrobot
int vege = 0;int m = 0, mm = 0;int u = 0;int i = 0;sub waitmsg(){mm = m;
while (mm == m)
{
m = Message();
}
PlaySound(0);
}task main(){SetTxPower(TX_POWER_HI);
Off(OUT_A + OUT_B + OUT_C);
SetPower(OUT_A + OUT_C, 2);
SetPower(OUT_B, 7);
SetSensor(SENSOR_2, SENSOR_TOUCH);
ClearMessage();
while (vege == 0)
{
waitmsg();
if (m == 8)
{
// OnRev(OUT_B);
OnFwd(OUT_A + OUT_C);
i = 0;
until (SENSOR_2 == 1) { i++; Wait( };
OnRev(OUT_A + OUT_C);
Wait(40);
Off(OUT_A + OUT_C);
SendMessage(42);
Wait(50);
SendMessage(42);
Wait(50);
SetTxPower(TX_POWER_LO);
Wait(100);
while (m != 12)
{
m = Message();
SendMessage(100 + i);
Wait(100);
}
Wait(100);
SetTxPower(TX_POWER_HI);
// Off(OUT_B);
OnRev(OUT_A + OUT_C);
i -= 4; // ugyanis a szenzorok miatt kesobb fekez, mint az elakadas miatt
until ( i <= 0 ) { i--; Wait(20); }
SendMessage(14);
Off(OUT_A + OUT_C);
}
if (m == 2) { OnRev(OUT_A + OUT_C); }
if (m == 4) { OnFwd(OUT_C); OnRev(OUT_A); }
if (m == 6) { OnFwd(OUT_A); OnRev(OUT_C); } pre>if (m == 5) { Off(OUT_A + OUT_C); }
if (m == 10) { SendMessage(20); vege = 1;}
}
Off(OUT_A + OUT_B + OUT_C);
}
Készült 2001. áprilisában