Robot Rescue

A robotok felépítése

A meghibásodott robot

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

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.

1. Program

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.

Meghibásodott robot

 
 
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);
}  

Mentő robot

 
 
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);
}  

2. Program

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.

Meghibásodott robot

 
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); }
    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